Flutter Pulse
525 subscribers
344 photos
757 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
Действия клавиатуры ввода в Flutter

Улучшите опыт пользователей вашего приложения с помощью действий клавиатуры ввода! 🌟 Они помогают пользователям быстрее заполнять формы, предоставляя интуитивно понятные и удобные элементы управления. 🚀

Как это работает? 🤔
1. Покажите действие "следующее поле" на клавиатуре и свяжите его с отправкой формы.
2. При нажатии на "следующее поле" текущее поле теряет фокус, а следующее поле получает фокус.



TextFormField(
focusNode: _emailFocus,
textInputAction: TextInputAction.next, // Действие "следующее поле"
onFieldSubmitted: (term) {
_emailFocus.unfocus(); // Убрать фокус с текущего поля
FocusScope.of(context.buildContext).requestFocus(_pwdFocus); // Передать фокус следующему полю
},
keyboardType: TextInputType.emailAddress, // Тип клавиатуры для ввода email
)



👍 Оцените новую рубрику по Flutter и Dart! Ваши отзывы помогут нам улучшать контент. 💬

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #UIUX #FlutterTips #DartLang
1
Использование зависимостей в pubspec

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

Импорт библиотек
Вы можете импортировать библиотеку из локального пути или удаленного репозитория. Например:


dependencies:
transmogrify:
path: ../
otherlib:
git:
url: https://github.com/awesomeplugin.git
ref: main



Синтаксис каретки
Синтаксис каретки гарантирует обратную совместимость с указанной версией. Например:


dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.0


Это то же самое, что >=1.0.0 и <2.0.0.

Переопределение зависимостей
Чтобы избежать конфликтов версий, когда несколько библиотек используют разные версии зависимостей, вы можете временно переопределить все ссылки на зависимость. Например:


name: my_app
dependencies:
transmogrify: 3.2.1
otherlib: ^1.0.2
dependency_overrides:
transmogrify: 3.2.1


В этом примере otherlib использует transmogrify версии 2.0.0, но переопределение заставляет его использовать версию 3.2.1.

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #DartLang
👍1
Понимание ключей во Flutter

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

GlobalKey
- Уникален во всём приложении. Не должен пересоздаваться при каждой сборке.
- Долгоживущий объект, которым владеет объект состояния.

Пример использования 1: Доступ к состоянию stateful виджета (например, для формы)



// для формы
final GlobalKey<FormState> _formKey = GlobalKey(debugLabel: 'form');

// используем ключ, чтобы получить FormState и вызвать функцию validate
isFormValid() {
if (_formKey.currentState == null) {
return false;
}
return _formKey.currentState?.validate();
}



Пример использования 2: Разрешение виджетам менять своих родителей в любом месте приложения без потери состояния.

Используйте KeyedSubtree, прикрепляя ключ к существующему виджету и пересобирая его потомка.

Пример использования во Flutter виджетах: => Hero



class _HeroState extends State<Hero> {
final GlobalKey _key = GlobalKey();

@override
Widget build(BuildContext context) {
// ...
return SizedBox(
width: _placeholderSize?.width,
height: _placeholderSize?.height,
child: Offstage(
offstage: !showPlaceholder,
child: TickerMode(
enabled: !showPlaceholder,
child: KeyedSubtree(key: _key, child: widget.child),
),
),
);
}
}



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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #AppDevelopment #ProgrammingTips
👍2
Зачем использовать ключ виджета?

Ключи виджетов в 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
Правило 8 для интервалов в дизайне

Генерация визуальной гармонии на подсознательном уровне

Вы когда-нибудь задумывались, что делает дизайн визуально приятным? 🤔 Одним из секретов является соблюдение правила 8 при проектировании интервалов между элементами! 📐

Что такое правило 8?

Теория довольно проста: все элементы в вашем дизайне кратны 8 по ширине и высоте, как и расстояния между ними. 📏 Это создает ощущение гармонии и порядка, делая интерфейс более интуитивным и комфортным для пользователя. 😌

Давайте рассмотрим пример реализации этого правила во Flutter:


class AppSpacer extends StatelessWidget {
final double? width;
final double? height;

const AppSpacer._({Key? key, this.width, this.height}) : super(key: key);

factory AppSpacer.p32() => const AppSpacer._(height: 32, width: 32);
factory AppSpacer.p24() => const AppSpacer._(height: 24, width: 24);
factory AppSpacer.p16() => const AppSpacer._(height: 16, width: 16);
factory AppSpacer.p8() => const AppSpacer._(height: 8, width: 8);

@override
Widget build(BuildContext context) {
return SizedBox(
width: width,
height: height,
);
}
}



Этот код определяет виджет AppSpacer, который можно использовать для создания интервалов, кратных 8. 📝 Просто используйте один из фабричных конструкторов, таких как AppSpacer.p8(), AppSpacer.p16() и т.д., чтобы добавить нужный интервал в вашем интерфейсе. 👍

Оцените новую рубрику лайком 👍, если считаете её полезной! 💬 Поделитесь своими мыслями в комментариях! 💬

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

#flutter #dart #flutterpulse #FlutterPulseTips #SpacingDesign #DesignTips #FlutterTips #UIUX #MobileDev #AppDev
👍4
Ждём... или используем скелетную анимацию?

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

Индикатор загрузки - простой и понятный способ показать, что контент загружается. 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
Шпаргалка по Android adb

Полезные команды для управления вашим Android-устройством через командную строку 🤖💻

Вход в оболочку телефона

adb shell # вход в оболочку телефона
# Android основан на unix, поэтому вы можете перемещаться
# и выполнять команды как в обычной unix-системе


Установка и удаление APK

adb install myApp.apk # установить apk
adb install -r myApp.apk # обновить приложение без удаления его данных
adb uninstall myApp.apk # удалить приложение


Захват изображения и видео

adb shell screencap -p /sdcard/image.png # захватить изображение
adb shell screenrecord -p /sdcard/video.mp4 # захватить видео
adb -d pull /sdcard/image.png . # извлечь изображение или видео из папки sdcard


Отображение касаний на устройстве

adb shell content insert \
--uri content://settings/system \
--bind name:s:show_touches \
--bind value:i:1 # включить отображение касаний на устройстве

adb shell content insert \
--uri content://settings/system \
--bind name:s:show_touches \
--bind value:i:0 # отключить отображение касаний на устройстве


Оцените нашу новую рубрику лайком 👍 и подпишитесь, чтобы быть в курсе всех последних советов и новостей! 😊

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

#flutter #dart #flutterpulse #FlutterPulseTips #AndroidDev #MobileDev #DevTips #FlutterTips
👍2
Измерение производительности функции в тесте

Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами полезным советом о том, как измерить производительность функции внутри теста. 🔍

Зачем это нужно?
- Оптимизация производительности вашего приложения 🔝
- Выявление узких мест в коде 🔎
- Улучшение пользовательского опыта 👥

Пример кода:


testWidgets('проверка производительности большой функции', (
WidgetTester tester,
) async {
// Запускаем секундомер
final sw = Stopwatch()..start();
await tester.tap(find.byKey(const ValueKey('btn')));
await tester.pumpAndSettle(const Duration(milliseconds: 100));
// Проверяем, что прошедшее время меньше 500 мс
expect(sw.elapsedMilliseconds, lessThan(500));
});



Что здесь происходит? 🤔
1. Мы запускаем тест виджета с помощью `testWidgets`.
2. Запускаем секундомер (`Stopwatch`) перед выполнением тестируемой функции.
3. Выполняем необходимые действия (в данном случае тап по кнопке с ключом 'btn').
4. Проверяем, что общее время выполнения не превышает заданный порог (500 мс).

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

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

#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #PerformanceOptimization #TestingInFlutter
1
Смена версии Flutter

Иногда это просто необходимо 🤔

Чтобы изменить версию Flutter, следуйте этим шагам:

1. Проверьте, где установлен Flutter на вашей системе, а затем выполните команду:


git checkout 1.22.6
# Обновление файлов: 100% (4559/4559), готово.
# Примечание: переключение на '1.22.6'.



Теперь следующая команда flutter установит все необходимые требования 📦

2. Чтобы вернуться к последней стабильной версии, просто используйте:


git checkout stable



ИЛИ

Используйте FVM, чтобы переключать версию Flutter напрямую 🔄



dart pub global activate fvm



Или используйте пакет brew... 🍺


fvm use 1.22.6



Больше информации на https://fvm.app/ 🤓

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

#flutter #dart #flutterpulse #FlutterPulseTips #FVM #FlutterTips #MobileDev #DevTips
Создаем защиту маршрута страницы

Привет, подписчики! 👋 Сегодня мы рассмотрим полезный совет по 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
Полезный совет по Dart: Как изменить версию Flutter

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

Иногда возникает необходимость изменить версию Flutter. Вот как это можно сделать:

1. Проверьте, где установлен Flutter на вашей системе, а затем выполните команду:
git checkout 1.22.6
> Updating files: 100% (4559/4559), done.
> Note: switching to '1.22.6'.

После этого следующая команда flutter установит все необходимые требования.

2. Чтобы вернуться к последней стабильной версии, просто используйте:
git checkout stable

Или используйте FVM для быстрого переключения версий Flutter:

1. Активируйте FVM:
dart pub global activate fvm

2. Используйте нужную версию:
fvm use 1.22.6

Дополнительная информация доступна на сайте FVM:
https://fvm.app/docs/getting_started/installation
https://fvm.app/

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

Все подобные советы ищите по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #DevTips #FlutterCommunity
Создаем защиту маршрута страницы

Привет, подписчики! 👋 Сегодня мы рассмотрим полезный совет по 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
👍1
Полезный совет по Dart: Как изменить версию Flutter

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

Иногда возникает необходимость изменить версию Flutter. Вот как это можно сделать:

1. Проверьте, где установлен Flutter на вашей системе, а затем выполните команду:
git checkout 1.22.6
> Updating files: 100% (4559/4559), done.
> Note: switching to '1.22.6'.

После этого следующая команда flutter установит все необходимые требования.

2. Чтобы вернуться к последней стабильной версии, просто используйте:
git checkout stable

Или используйте FVM для быстрого переключения версий Flutter:

1. Активируйте FVM:
dart pub global activate fvm

2. Используйте нужную версию:
fvm use 1.22.6

Дополнительная информация доступна на сайте FVM:
https://fvm.app/docs/getting_started/installation
https://fvm.app/

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

Все подобные советы ищите по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #DevTips #FlutterCommunity
Запускайте тесты с несколькими вариантами

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

Вы когда-нибудь сталкивались с ситуацией, когда нужно протестировать один и тот же сценарий с разными входными данными? Вместо того, чтобы писать множество повторяющихся тестов, вы можете использовать возможности ValueVariant из Flutter! 🔥



final timesVariant = ValueVariant<double>({1, 10, 100, 1000}); // Создаём вариант со списком значений

testWidgets('push counter N times', (
WidgetTester tester,
) async {
await tester.pumpWidget(const myApp()); // Инициализируем виджет
for (int i = 0; i < timesVariant.currentValue!; i++) { // Получаем текущее значение варианта
await tester.tap(find.byType(OutlinedButton).first); // Симулируем нажатие кнопки
}
expect(find.text("pushed ${timesVariant.currentValue!} times"), findsOneWidget); // Проверяем текст
}, variant: timesVariant); // Устанавливаем вариант для теста




В этом примере мы:
1. Создаём ValueVariant с нужными нам значениями.
2. Используем timesVariant.currentValue внутри теста, чтобы получить текущее значение.
3. Указываем variant: timesVariant, чтобы тест выполнился для каждого значения.

Таким образом, вы экономите время и пишете более чистый код! 💪

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

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

#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDevelopment #Testing #ValueVariant #FlutterTesting #CodingTips
👍1
Форматирование JSON с помощью Dart

Привет, разработчики! 👋 Сегодня мы рассмотрим полезный совет по работе с JSON в Dart. Вы узнаете, как красиво напечатать JSON-строку, сделав её более читаемой и удобной для отладки 🛠️

Проблема: JSON-данные часто приходят в компактном, неформатированном виде, что затрудняет их чтение и анализ.

Решение: Используйте класс JsonEncoder из пакета dart:convert для форматирования JSON.


import 'dart:convert';

// Создаём кодировщик с отступами для форматирования
var encoder = const JsonEncoder.withIndent(' ');
// Преобразуем данные в красиво отформатированную строку
String prettyprint = encoder.convert(data);


Этот простой код позволяет превратить нечитаемую JSON-строку в структурированный и понятный формат с отступами 🌟

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

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

#flutter #dart #flutterpulse #FlutterPulseTips #JSON #DartTips #FlutterTips #CodingTips #AppDevelopment #MobileDevelopment
👍31
Запускайте тесты на нескольких размерах экрана

Предотвратите переполнение для разных размеров экранов 🤯

Это позволит запустить тест с каждой конфигурацией экрана в screenSizeVariants 📱


final screenSizeVariants = ValueVariant<ScreenSize>(basicPhones);

testWidgets('''клик на кнопку => отображается закрепленный виджет наложения''', (
WidgetTester tester,
) async {
await tester.setScreenSize(screenSizeVariants.currentValue!);

await tester.pumpWidget(const MyAppWithCircleAnchored());
expect(find.byType(AnchoredHelper), findsNothing);
await tester.tap(find.byType(OutlinedButton).first);
await tester.pump(const Duration(seconds: 2));
expect(find.byType(AnchoredHelper), findsOneWidget);
}, variant: screenSizeVariants);



import 'dart:ui';
import 'package:flutter_test/flutter_test.dart';

// это определяет конфигурацию размера конкретного устройства
class ScreenSize {
// имя этой конфигурации
final String name;

// конфигурация размера и плотность пикселей
final double width, height, pixelDensity;

const ScreenSize(this.name, this.width, this.height, this.pixelDensity);

@override
String toString() => name;
}

extension ScreenSizeManager on WidgetTester {
Future<void> setScreenSize(ScreenSize screenSize) async {
return _setScreenSize(
width: screenSize.width,
height: screenSize.height,
pixelDensity: screenSize.pixelDensity,
);
}

Future<void> _setScreenSize({
double width = 540,
double height = 960,
double pixelDensity = 1,
}) async {
final size = Size(width, height);
await binding.setSurfaceSize(size);
binding.window.physicalSizeTestValue = size;
binding.window.devicePixelRatioTestValue = pixelDensity;
}
}


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

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #TestingTips #ScreenSize #FlutterTips
👍1
Простой доступ к виджету в тесте

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

Вы когда-нибудь сталкивались с ситуацией, когда вам нужно было получить доступ к конкретному виджету внутри теста? 🤔 Обычно для этого приходилось писать длинные цепочки методов, что делало код теста громоздким и трудночитаемым. 😩

Но есть решение! 💡 Вы можете создать свою собственную утилиту для прямого доступа к виджету. 📦


import 'package:flutter_test/flutter_test.dart';

// Вспомогательная функция для прямого доступа к виджету
T findWidget<T>() => find
.byType(T)
.evaluate()
.first
.widget as T;

// Вспомогательная функция для прямого доступа к N-му виджету типа T
T findNWidget<T>(int n) => find
.byType(T)
.evaluate()
.toList()
.elementAt(n)
.widget as T;


Теперь вы можете использовать эти функции, чтобы упростить свои тесты. Например, вместо того, чтобы писать:

// можно заменить это
final miniature = find.byType(VideoMiniature)
.evaluate()
.first
.widget as VideoMiniature;

// на это
final miniature = findWidget<VideoMiniature>();


Такой подход не только делает ваш код теста более читаемым, но и экономит время при написании новых тестов. ⏱️

Оцените нашу новую рубрику и оставьте свои отзывы! 🤗 Нам важно ваше мнение, чтобы мы могли делать наш контент лучше для вас.

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

#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDevelopment #Testing #CodeQuality
👍1🔥1
Документ Firebase как модель сущности

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

Вы когда-нибудь сталкивались с необходимостью внедрить идентификатор документа Firebase в вашу модель данных, не сохраняя его в самом документе? 🤔 Теперь это легко сделать с помощью пакета json_serializable! 🎉

Вот пример кода, который показывает, как это можно сделать:


@JsонSerializable()
class DogEntity {
// получаем id в нашу сущность
@JsонKey(toJsон: Converters.id, includeIfNull: false)
final String? id;
final String name;

// внедряем id в нашу сущность
factory DogEntity.fromJsон(String id, Map<String, dynamic> jsон) =>
_$DogEntityFromJsон(jsон..['id'] = id);

...
}

class Converters {
// предотвращаем сохранение id в документ
static String? id(String? id) => null;
}



В этом примере мы используем аннотацию @JsonKey для указания того, как должен быть сериализован идентификатор документа. Мы также используем фабричный конструктор fromJson для внедрения идентификатора документа в нашу модель данных. 📈

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

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

#flutter #dart #flutterpulse #FlutterPulseTips #Firebase #json_serializable #MobileDevelopment #FlutterTips
Как протестировать дизайн виджета?

Обеспечьте, чтобы обновления не влияли на то, как ваш виджет отображается для пользователя.

Используйте метод golden file. Это проверит, что дизайн остался таким же, как и на изображении.

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



testWidgets('Golden test', (WidgetTester tester) async {
await tester.pumpWidget(MyApp());
await expectLater(
find.byType(MyCard),
matchesGoldenFile('card.png')
);
});



Теперь запуск ваших тестов обеспечит неизменность дизайна. Например, вы создаете карту, используя некоторые аватары и другие виджеты. Если один из дочерних элементов будет изменен, ваша карта не останется прежней, и вы узнаете об этом.

Как сгенерировать Golden файлы?



flutter test --update-goldens



Это сгенерирует golden файлы для каждого вызова matchesGoldenFile в ваших тестах.

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

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #WidgetTesting #GoldenFiles #FlutterTips #DevelopmentTips
Проверьте устаревшие зависимости
Flutter cli спешит на помощь!

Команда Flutter pub outdated



flutter pub outdated
# Показывает устаревшие пакеты.
# [*] указывает на версии, которые не являются последними доступными.

# Имя пакета Текущая Обновляемая Разрешимая Последняя
# прямые зависимости:
adaptive_dialog *1.3.0 1.4.0 1.4.0 1.4.0
cloud_firestore *3.1.6 3.1.10 3.1.10 3.1.10
cloud_functions *3.2.5 3.2.10 3.2.10 3.2.10



Совет по CI: Вы можете извлечь данные в формате json и использовать их в шаге CI. Запуск этого шага каждую неделю на вашей основной ветке (main) и уведомление по электронной почте, если доступна новая версия пакета.

Оцените новую рубрику! 👍💡
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDevelopment #CI #DevTips