Flutter Pulse
501 subscribers
313 photos
666 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
Триггер событий при навигации по страницам с помощью Flutter RouteObserver

Привет, разработчики Flutter! 👋 Сегодня мы рассмотрим полезный совет по использованию RouteObserver для отслеживания навигации между страницами в вашем приложении. 📱

Что такое RouteObserver?
`RouteObserver` - это класс, позволяющий отслеживать изменения маршрутов в вашем приложении. Он предоставляет методы для реакции на различные события навигации, такие как открытие новой страницы или возврат к предыдущей. 🔄

Пример использования:
Чтобы использовать `RouteObserver`, вам нужно создать экземпляр класса, наследующего от `RouteObserver<PageRoute<dynamic>>`, и переопределить нужные методы. Ниже приведён пример кода:



class MyNavigatorObserver extends RouteObserver<PageRoute<dynamic>> {
@override
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
// Код, выполняемый при открытии новой страницы
}

@override
void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
// Код, выполняемый при замене маршрута
}

@override
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
// Код, выполняемый при закрытии текущей страницы
}
}



Затем добавьте этот наблюдатель в ваше `MaterialApp`:



class MyApp extends StatelessWidget {
final _navigatorKey = GlobalKey<NavigatorState>();
final navObserver = MyNavigatorObserver();

@override
Widget build(BuildContext context) =>
MaterialApp(
navigatorObservers: [navObserver],
// Другие свойства MaterialApp
);
}



Зачем это нужно?
Использование `RouteObserver` позволяет легко отслеживать события навигации, что может быть полезно для аналитики, логирования или выполнения определённых действий при переходе между экранами. 📊🔍

Оцените новую рубрику и напишите в комментариях, насколько она вам полезна! 👍💬
Все подобные новости вы можете найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDevelopment #CodingTips #FlutterTips
👍3
6 способов копирования списков и карт в Dart

Привет, разработчики Flutter! 👋

В Dart существует несколько способов копирования списков и карт. Давайте рассмотрим шесть наиболее популярных методов:

1. Использование json decode/encode - клонирование без сохранения ссылки

   List newList = json.decode(json.encode(oldList));
Map newMap = json.decode(json.encode(oldMap));


2. Использование оператора spread - клонирование без сохранения ссылки

   List newList = [...oldList];
Map newMap = {...oldMap};
HashMap newMap = HashMap.from({...oldMap});


3. Использование фабрики from - копирование ссылки на значение

   List newList = List.from(oldList);
Map newMap = Map.from(oldMap);


4. Использование метода addAll - копирование ссылки на значение

   List newList = []..addAll(oldList);


5. Использование пакета built_collection - не создает копию, а возвращает обертку с возможностью записи при изменении

   var builtList = [1, 2, 3].build();
builtList = builtList.rebuild((b) => b..addAll([7, 6, 5]));


6. Использование пакета fast_immutable_collections

   final IList<String> oldList;
var newList = IList.orNull(oldList);


Эти методы помогут вам эффективно работать со списками и картами в Dart. 👍

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

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

#flutter #dart #flutterpulse #FlutterPulseTips #codingtips #mobiledevelopment #programming #FlutterTips #DartLang
Flutter советы - Как обрезать изображение

Привет, разработчики! 👋 Сегодня мы рассмотрим простой, но полезный совет по Flutter - обрезку изображений! 📸✂️

Вы когда-нибудь сталкивались с необходимостью обрезать изображение в вашем приложении Flutter? 🤔 Это может быть полезно для создания миниатюр, улучшения композиции или просто для придания приложению более аккуратного вида. 💁‍♀️

Решение: Используйте виджет ClipRect! 🎉



Container(
alignment: Alignment.topCenter,
child: ClipRect(
child: Image.asset(
'assets/04.jpg', // Путь к изображению
width: 400, // Ширина изображения
height: 400, // Высота изображения
fit: BoxFit.none, // Не масштабировать изображение
alignment: Alignment.topCenter, // Выравнивание по верхнему центру
),
),
)



В этом примере мы используем виджет Container с выравниванием по верхнему центру. Внутри контейнера мы размещаем виджет ClipRect, который обрезает изображение до указанного размера. Изображение загружается из assets с помощью виджета Image.asset. Мы устанавливаем ширину и высоту изображения в 400 пикселей и отключаем масштабирование с помощью BoxFit.none. Выравнивание изображения также установлено по верхнему центру.

Результат: Изображение будет обрезано до указанного размера, создавая аккуратный и чистый вид в вашем приложении. 🌟

Оцените нашу новую рубрику и оставьте свои комментарии! 💬 Понравился ли вам этот совет?👍

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #AppDevelopment #UIUX #CodingTips #ImageCropping #FlutterTips
Ускорьте свой код Flutter с помощью инлайн-компиляции

Привет, разработчики Flutter! 👋 Сегодня мы поделимся с вами полезным советом, который поможет вам оптимизировать производительность вашего приложения. 📈

Что такое инлайн-компиляция? 🤔
Инлайн-компиляция - это техника, позволяющая компилятору Dart встраивать функции непосредственно в место их вызова, исключая накладные расходы на вызов функции. 🔄

Пример использования 💻
Рассмотрим пример кода, где мы определяем класс MyDataClass с методом forEach, помеченным аннотацией @pragma('vm:prefer-inline'):

typedef ForEachIterator = void Function(int x, int y);

class MyDataClass {
final int height;
final int width;
final List<List<double>> _data;

MyDataClass(this.width, this.height, this._data);

@pragma('vm:prefer-inline')
void forEach(ForEachIterator it) {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
it(x, y);
}
}
}
}



В функции main мы создаем экземпляр MyDataClass и вызываем метод forEach:

void main() {
// ... инициализация данных как вам нужно
var myDataClass = MyDataClass(30, 50, data);
myDataClass.forEach((x, y) {
print("$x,$y");
});
}



Результат 🔍
После компиляции код будет преобразован в:

void main() {
// ... инициализация данных как вам нужно
var myDataClass = MyDataClass(30, 50, data);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
print("$x,$y");
}
}
}



Вывод 💡
Использование аннотации @pragma('vm:prefer-inline') позволяет компилятору встроить метод forEach непосредственно в место его вызова, что может значительно повысить производительность вашего приложения. 🚀

Оцените нашу новую рубрику и поделитесь своими мыслями! 💬
Все подобные новости вы можете найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #PerformanceOptimization #CodingTips
Сравнение объектов Dart
Понимание equals и hashcode 🤔

Зачем это нужно? 🤔
Хэш-код - это целое число, связанное с каждым объектом.
Он облегчает хэширование для структур данных, таких как HashMap 🗺️

Чтобы сравнить два экземпляра класса Person, нам нужно переопределить == и hashcode 🔄

Как сгенерировать? 🛠️
- package equatable 📦
- IntelliJ или Android Studio - опция генерации 💻
- package freezed ❄️


class Person {
const Person(this.name);

final String name;

@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Person &&
runtimeType == other.runtimeType &&
name == other.name;

@override
int get hashCode => name.hashCode;
}


Оцените новую рубрику FlutterPulseTips! 👍👎
Все подобные новости можно найти по хэштегу #FlutterPulseTips 🔍
#flutter #dart #flutterpulse #FlutterPulseTips #DartTips #MobileDevelopment #CodingTips
1
Зачем использовать ключ виджета?

Ключи виджетов в 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