Flutter Pulse
534 subscribers
359 photos
792 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
Как протестировать дизайн виджета?

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

Используйте метод 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 в автомобиле и не только: как создать приложение для бортового компьютера на Raspberry Pi!

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

👉 Смотреть видео: "Flutter в Automotive & Embedded: создаём приложение для автомобиля (и не только)"

🤔 О чём это видео?
А может ли Flutter работать внутри автомобиля или, скажем, умного чайника? Спойлер: да! На открытом уроке от онлайн-курса «Flutter Mobile Developer» Дмитрий Золотов (Flutter-разработчик из Яндекса) разбирает, как выйти за рамки мобильных приложений. Вы увидите, как Flutter оживает на реальном железе! 💻🔧

🔍 Ключевые темы:
Yocto и embedded Linux — зачем нужны кастомные дистрибутивы и как собрать Flutter под ARM.
Запуск без X11/Wayland — работа с framebuffer для экономии ресурсов.
Multi-display интерфейсы — создание панелей для приборных кластеров, HUD и медиасистем.
Интеграция с CAN-шиной — как получать данные скорости, оборотов и температуры в реальном времени.
Практика — сборка Flutter-приложения для Raspberry Pi (бортовой компьютер или IoT-панель).

🎯 После вебинара вы сможете:
- Применять Flutter в automotive и embedded-проектах.
- Собирать Yocto-дистрибутивы для устройств.
- Запускать Flutter-приложения без оконных систем.
- Строить интерфейсы для нескольких экранов.
- Интегрироваться с автомобильной электроникой через CAN-шину.

👥 Кому будет полезно?
- Flutter-разработчикам, готовым к новым вызовам.
- Embedded-инженерам, ищущим современные UI-решения.
- Всем, кто мечтает создавать цифровые интерфейсы для авто и умной техники!

🔔 Подписывайтесь на Flutter Pulse, чтобы первыми получать лучшие материалы о Flutter! Исследуйте другие видео по хэштегу #FlutterPulseYoutube — у нас много эксклюзивов.

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
🔥21
Центрирование формы без скрытия полей при открытом клавиатуре

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

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

Решение: Использовать Scaffold с параметром resizeToAvoidBottomInset: true и обернуть форму в SingleChildScrollView. 📝



Scaffold(
resizeToAvoidBottomInset: true, // Изменяет размер при открытии клавиатуры
body: Form(
key: _formKey,
child: SingleChildScrollView( // Позволяет прокручивать содержимое
child: SizedBox(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center, // Центрирует содержимое
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Spacer(flex: 1), // Гибкое пространство сверху
TextFormField(...), // Поля формы
TextFormField(...),
const Spacer(flex: 1), // Гибкое пространство снизу
],
),
),
),
),
)



Как это работает:
- resizeToAvoidBottomInset: true заставляет Scaffold изменять размер при открытии клавиатуры. 🔄
- SingleChildScrollView позволяет прокручивать содержимое формы, если оно не помещается на экране. 🔄
- Spacer с гибким размером (flex: 1) обеспечивает равномерное распределение пространства сверху и снизу формы. ⚖️

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

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #UIUX #AppDevelopment #CodingTips
👍41🔥1🤯1
Проверьте устаревшие зависимости
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
Круглый аватар с границей
Круглый аватар не имеет границы, но есть быстрый способ добавить её!

Если вы не хотите переписывать виджет CircleAvatar...
Просто оберните его ещё в один или используйте Container с градиентом.



CircleAvatar(
radius: radius + 2, // Увеличиваем радиус для границы
backgroundColor: borderColor, // Цвет границы
child: CircleAvatar(
radius: radius, // Радиус внутреннего аватара
backgroundImage: NetworkImage(url), // Изображение из сети
),
);



Оцените новую рубрику лайком 👍 и подпишитесь, чтобы не пропустить новые советы! 😉
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #mobiledev #appdevelopment #uiux #codingtips
👍3
Создаем собственный экран ошибок

Вам надоело видеть красный или серый экран при возникновении ошибки? 🤔

Это поведение Flutter-приложения по умолчанию. 📱

Примечание: Если вы хотите, чтобы Flutter перестал показывать красный экран в режиме отладки или серый в production-режиме, просто удалите функцию presentError. 💡

Вы можете переопределить виджет ошибки по умолчанию или вообще не показывать ничего... 🤷‍♂️

Хорошим решением может быть перенаправление пользователя и отображение ошибки в виде всплывающего сообщения. 📢



void main() {
FlutterError.onError = (FlutterErrorDetails details) {
FlutterError.presentError(details); // Показываем ошибку
};
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
routes: routes,
initialRoute: 'route1',
builder: (context, widget) {
ErrorWidget.builder = (FlutterErrorDetails errorDetails) {
Widget error = Text('...rendering error... : ${errorDetails.summary}');
if (widget is Scaffold || widget is Navigator) {
error = Scaffold(body: Center(child: error));
}
return error;
};
return widget;
},
);
}
}



Оцените нашу новую рубрику! 👍💬 Оставляйте ваши отзывы в комментариях! 💬👇

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #AppDevelopment #ErrorHandling #CustomErrorScreen #FlutterTips
👍2
🚀 Расширяем возможности Flutter с помощью FFI: Магия работы с памятью на C!

Привет, Flutter-энтузиасты! Готовы погрузиться в глубины нативной интеграции? 🔍 Наш коллега Руслан Цицер выпустил мощное видео, которое раскрывает тайны взаимодействия Dart и C через FFI. Это не просто теория — это ключ к высокопроизводительным решениям!

🔥 Что вас ждет в видео:
👉 🧠 Основы работы с памятью: стек, куча, указатели — объясняем на пальцах, почему это критично для FFI.
👉 📦 Передача строк между Dart и C: как избежать утечек памяти и преобразовывать данные без боли.
👉 ⚙️ Автоматизация рутины: простые скрипты на Bash/Makefile для сборки и генерации кода.
👉 💡 Реальные примеры: разбор C-кода, работа с malloc, free и нативными библиотеками.

❗️ Важно: Руслан наглядно показывает, как:
- Корректно освобождать память, чтобы приложение не "падало".
- Использовать Utf8 для преобразования строк.
- Избегать Race Condition и утечек в долгоживущих приложениях.


💬 "Это база для тех, кто хочет запускать Go, Rust или C++ код в Flutter!" — Руслан анонсирует продолжение темы в следующих выпусках.

👉 Не пропустите! Подписывайтесь на канал автора, жмите 🔔 колокольчик и лайк 👍, если хотите больше глубинки. Пишите вопросы в комментариях — Руслан активно отвечает!

💡 Ищете другие полезные ролики? Загляните по хэштегу #FlutterPulseYoutube!

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube #FFI #CleanCode #Refactoring
1
Создаём круглый индикатор прогресса
Привет, подписчики! 👋 Сегодня мы рассмотрим интересный Flutter-трюк, который поможет вам создать круглый индикатор прогресса с помощью ClipRRect 🌟

Вы можете использовать виджет ClipRRect, чтобы создать круглый индикатор прогресса. Для этого нужно обернуть LinearProgressIndicator в ClipRRect и задать ему радиус границы 🌈



ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(10)),
child: LinearProgressIndicator(
minHeight: 14,
value: progress, // текущий прогресс
color: Colors.red, // цвет прогресса
backgroundColor: Colors.white, // фон индикатора
),
),



В этом примере мы используем LinearProgressIndicator с minHeight равным 14 и оборачиваем его в ClipRRect с радиусом 10, чтобы получить круглый индикатор прогресса 🔴⚪️

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

Все подобные новости можно найти по хэштегу #FlutterPulseTips 🤓
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #UIUX #ProgressIndicator #FlutterTips #CodingTricks #AppDevelopment
👍2
Скачивание файла из Firebase и отслеживание прогресса

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

Код для скачивания файла:


Stream<TaskSnapshot> downloadFile(String path) async* {
if (await Permission.storage.request().isDenied) {
throw "Вы должны принять разрешение на запись";
}
var fileRef = storage.ref().child(path);
var fileName = fileRef.name;
Directory directory;
if (Platform.isAndroid) {
directory = Directory("/storage/emulated/0/Download");
} else {
directory = (await getExternalStorageDirectory())!;
}
final File destinationFile = File('${directory.path}/$fileName');
if (destinationFile.existsSync()) {
destinationFile.deleteSync();
}
destinationFile.createSync();
var task = fileRef.writeToFile(destinationFile);
yield* task.asStream();
}



Ключевые моменты:
- Проверка разрешений: Используем permission_handler для проверки разрешения на доступ к хранилищу.
- Сохранение в папку загрузок: Файл сохраняется в папку "Download" на Android.
- Замена существующего файла: Если файл уже существует, он будет удален и заменен новым.
- Отслеживание прогресса: Используем yield* для передачи событий из задачи в наш поток, что позволяет отображать прогресс загрузки в приложении.

Чтобы получить текущий прогресс, можно использовать:


var progress = task.bytesTransferred / task.totalBytes * 100;



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

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

#flutter #dart #flutterpulse #FlutterPulseTips #Firebase #MobileDevelopment #FlutterTips #AppDevelopment #CodingTips
👍1
Firestore: конфигурация из нативных приложений

Вы, возможно, пропустили это... Плагин Firebase может использовать конфигурацию напрямую на стороне Dart!

Шаги по настройке:

1. Создайте несколько окружений Firebase для разработки/стадии/продакшена, используя только Dart.
Создайте 3 файла в папке runners. Один для каждой среды.

2. Создайте несколько файлов конфигурации Flavors.
Также сгенерируйте все файлы FirebaseOptions, используя flutterFire cli.

3. Удалите запуск из вашего main.dart и добавьте это:


Future<void> runWrapperApp(FlavorConfig config) async {
// Инициализируйте конфигурацию приложения здесь
// Например, установите уровень журнала на основе среды
final firebaseApp = await Firebase.initializeApp(
options: config.firebaseConfig,
);
runApp(MyApp());
}



4. Запустите приложение:


flutter run -t lib/runners/main_dev.dart



Важно:
- FlutterFire cli добавляет нативную зависимость на iOS/Android.
- Удалите конфигурацию Firebase из папок android и iOS.
- На Android удалите службы Google из build.gradle.

Оцените новую рубрику! 👍 Оставляйте ваши отзывы в комментариях! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #Firestore #Firebase #FlutterTips #MobileDevelopment #AppDevelopment
👍1