Flutter Pulse
526 subscribers
351 photos
772 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
Зачем использовать ключ виджета?

Ключи виджетов в Flutter: когда и почему они нужны? 🤔

В большинстве случаев вам не нужно использовать ключи... но есть ситуации, когда они крайне полезны! 😎

Новый виджет будет использован для обновления существующего элемента только если его ключ совпадает с ключом текущего виджета, связанного с этим элементом.

Ключи необходимы для:
- клонирования состояния виджета между несколькими страницами/вкладками 📑
- изменения порядка виджетов внутри списка 🔄
- сохранения позиции прокрутки 🕳️
- идентификации виджетов и их состояния 🔍
- идентификации для тестирования 🧪

Ключ позволяет Flutter связать элемент из elementTree с виджетом 🔗



class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
@override
Widget build(BuildContext context) {
// Используем ключ для сохранения состояния
return KeyedSubtree(
key: ObjectKey('my_unique_key'), // Уникальный ключ
child: MyStatefulChild(),
);
}
}



Если вы поменяете местами два виджета с ключами в дереве виджетов, Flutter также поменяет их местами в дереве элементов 🔄

Оцените нашу новую рубрику и напишите ваше мнение в комментариях! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #WidgetKeys #FlutterTips #AppDevelopment #UIUX #CodingTips
Ждём... или используем скелетную анимацию?

При загрузке контента важно сделать ожидание для пользователя максимально комфортным. Есть два основных способа сделать это: использовать стандартный индикатор загрузки или скелетную анимацию.

Индикатор загрузки - простой и понятный способ показать, что контент загружается. Flutter предоставляет встроенный виджет CircularProgressIndicator.adaptive(), который адаптируется под разные платформы.

// Создает индикатор, который является 
// [CupertinoActivityIndicator] на iOS
// [CircularProgressIndicator] на других платформах
CircularProgressIndicator.adaptive();


Для более широких возможностей можно использовать пакеты, такие как:
- sleek_circular_slider
- flutter_spinkit

Скелетная анимация дает пользователю представление о том, какого типа контент загружается (изображение, текст, длинный текст и т.д.). Это воспринимается как более быстрое и плавное.

Скелетные экраны кажутся пользователю более короткими по продолжительности, чем пустой экран с индикатором загрузки.

Для реализации скелетной анимации можно использовать пакет better_skeleton.

Оцените новую рубрику и напишите своё мнение в комментарии! 🤔💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #UIUX #LoadingAnimation #AppDevelopment #FlutterTips
👍1
Извлечение границ из изображения
Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами интересным способом обработки изображений с использованием пакета Image в Dart. 📸

Используем пакет Image для извлечения границ
Пакет Image в Dart предоставляет мощные инструменты для обработки изображений. Одним из интересных применений этого пакета является извлечение границ из изображений. 🔍

Как это работает?
1. Применяем ядро Лапласа ко всем пикселям изображения с помощью функции свёртки (convolution function).
2. Ядро Лапласа помогает выделить границы на изображении, применяя определённую матрицу фильтра к каждому пикселю.

Пример кода:

import 'package:image/image.dart' as img;

// Декодируем изображение из данных
var photo = img.decodeImage(data.buffer.asUint8List());

// Определяем фильтр (ядро Лапласа)
var filter = [
0, -1, 0,
-1, 4, -1,
0, -1, 0,
];

// Применяем свёртку к изображению с использованием фильтра
photo = img.convolution(photo, filter, div: div, offset: offset);


Этот код демонстрирует, как можно использовать функцию convolution из пакета Image для применения ядра Лапласа и выделения границ на изображении. 🔮

Оцените новую рубрику и напишите в комментариях, насколько она вам полезна! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #ImageProcessing #CodingTips
Создаем защиту маршрута страницы

Привет, подписчики! 👋 Сегодня мы рассмотрим полезный совет по Flutter - создание защиты маршрута страницы. 🚀

Что это такое?

Защита маршрута страницы позволяет перенаправлять пользователя на другую страницу, если определенное условие не выполнено. 🔄

Пример реализации



Route<dynamic> route(RouteSettings settings) {
switch (settings.name) {
case 'init_account':
return MaterialPageRoute(
builder: (_) => AuthenticatedGuard(child: InitAccountPage()),
);
}
}

// AuthenticatedGuard внедряет нашу защиту, чтобы предотвратить доступ неавторизованного пользователя к нашей странице

class Guard extends StatelessWidget {
final Future<bool> canActivate;
final Widget child;
final String fallbackRoute;

const Guard({
Key? key,
required this.canActivate,
required this.child,
required this.fallbackRoute,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: canActivate,
builder: (_, isOk) {
if (!isOk.hasData || isOk.hasError) {
return Container();
}
if (isOk.data!) {
return child; // Показываем страницу, если условие выполнено
}
redirect(context); // Иначе перенаправляем
return Container();
},
);
}

redirect(BuildContext context) {
WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
Navigator.pushReplacementNamed(context, fallbackRoute);
});
}
}



Совет для нескольких условий: вы можете каскадировать защиты или просто объединить ваши условия. 🤔

Оцените нашу новую рубрику и напишите в комментариях, что вы думаете! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips 👍

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #Programming #Development #Coding #FlutterCommunity