Создание последовательных анимаций
Создайте пользовательскую цепочку эффектов, чтобы повторно использовать ее во всем приложении с помощью flutter_animate.
Создайте виджет с Animate и списком эффектов
Повторно используйте свою анимацию везде в приложении для последовательного поведения анимации
Оцените новую рубрику! 👍💡
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileAppDevelopment #Animation #UIUX #FlutterTips
Создайте пользовательскую цепочку эффектов, чтобы повторно использовать ее во всем приложении с помощью flutter_animate.
Создайте виджет с Animate и списком эффектов
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
class MoveFadeAnim extends StatelessWidget {
final int? delayInMs;
final Widget child;
const MoveFadeAnim({
super.key,
required this.child,
this.delayInMs,
});
@override
Widget build(BuildContext context) {
return Animate(
effects: [
// Эффект затухания с задержкой и продолжительностью 700 мс
FadeEffect(
delay: Duration(milliseconds: delayInMs ?? 0), // Задержка перед началом анимации
duration: const Duration(milliseconds: 700), // Продолжительность анимации
curve: Curves.easeIn, // Кривая анимации для эффекта затухания
),
// Эффект перемещения с задержкой и продолжительностью 450 мс
MoveEffect(
delay: Duration(milliseconds: delayInMs ?? 0), // Задержка перед началом анимации
duration: const Duration(milliseconds: 450), // Продолжительность анимации
curve: Curves.easeOut, // Кривая анимации для эффекта перемещения
begin: const Offset(0, 50), // Начальное смещение
end: Offset.zero, // Конечное смещение (нет смещения)
),
],
child: child, // Дочерний виджет, к которому применяются эффекты
);
}
}
Повторно используйте свою анимацию везде в приложении для последовательного поведения анимации
return MoveFadeAnim(
delayInMs: index * 150 + 50, // Вычисление задержки на основе индекса элемента
child: MenuCard(
height: 130, // Высота карточки меню
),
);
Оцените новую рубрику! 👍💡
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileAppDevelopment #Animation #UIUX #FlutterTips
👍2
🔥 Он вам не просто логер! Почему Talker нужен вашему Flutter проекту?
Привет, Flutter-разработчики! ✨ Готовы сэкономить часы, дни и даже месяцы на отладке? Мы нашли для вас 🔥горячее видео, которое перевернет ваш подход к работе с ошибками!
Стас (Frezyx) на Flutter Conf в Москве устроил настоящий мастер-класс по своей open-source библиотеке Talker. И знаете что? Даже режиссёр трансляции признался: "Это единственный доклад, который я понял!" 😄
👇 Почему это must-watch?
🚀 Talker — не просто логер. Это "губка", которая впитывает ВСЁ:
- Ошибки виджетов, сети, платформы
- HTTP-запросы, навигацию, стейт-менеджмент
- Кастомные события (даже аналитику!)
💡 Главный секрет: история в runtime! Представьте:
✅ Тестировщик присылает не "у меня сломалось", а готовый файл логов
✅ На проде за 2 минуты находите корень проблемы (и вините бэкендеров 😉)
✅ Показываете ошибки через SnackBar, модалки или даже свой UI
🎁 Что ещё внутри:
- Модульность: подключайте только нужное (Bloc, Dio, Riverpod!)
- Кастомизация логов: от цветов 🎨 до формата
- Интеграция с Firebase, Sentry, Grafana
- Готовый экран логов в приложении
👉 Смотрите запись выступления здесь или тут — без воды, с мемами и реальными кейсами!
Стас показал, как Talker, получивший грант Яндекса (600К ₽ 💰) и скачанный 320К+ раз, делает жизнь разработчика проще. Не верите? Проверьте сами:
📦 pub.dev: talker
🐙 GitHub: Frezyx/talker
💬 P.S. Уже пробовали Talker? Делитесь опытом в комментариях! А если нет — самое время начать. Ваши выходные без дебаггинга начинаются здесь 👇
#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
Подписывайтесь → @FlutterPulse
Ещё крутые видео → #FlutterPulseYoutube
Привет, Flutter-разработчики! ✨ Готовы сэкономить часы, дни и даже месяцы на отладке? Мы нашли для вас 🔥горячее видео, которое перевернет ваш подход к работе с ошибками!
Стас (Frezyx) на Flutter Conf в Москве устроил настоящий мастер-класс по своей open-source библиотеке Talker. И знаете что? Даже режиссёр трансляции признался: "Это единственный доклад, который я понял!" 😄
👇 Почему это must-watch?
🚀 Talker — не просто логер. Это "губка", которая впитывает ВСЁ:
- Ошибки виджетов, сети, платформы
- HTTP-запросы, навигацию, стейт-менеджмент
- Кастомные события (даже аналитику!)
💡 Главный секрет: история в runtime! Представьте:
✅ Тестировщик присылает не "у меня сломалось", а готовый файл логов
✅ На проде за 2 минуты находите корень проблемы (и вините бэкендеров 😉)
✅ Показываете ошибки через SnackBar, модалки или даже свой UI
🎁 Что ещё внутри:
- Модульность: подключайте только нужное (Bloc, Dio, Riverpod!)
- Кастомизация логов: от цветов 🎨 до формата
- Интеграция с Firebase, Sentry, Grafana
- Готовый экран логов в приложении
👉 Смотрите запись выступления здесь или тут — без воды, с мемами и реальными кейсами!
Стас показал, как Talker, получивший грант Яндекса (600К ₽ 💰) и скачанный 320К+ раз, делает жизнь разработчика проще. Не верите? Проверьте сами:
📦 pub.dev: talker
🐙 GitHub: Frezyx/talker
💬 P.S. Уже пробовали Talker? Делитесь опытом в комментариях! А если нет — самое время начать. Ваши выходные без дебаггинга начинаются здесь 👇
#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
Подписывайтесь → @FlutterPulse
Ещё крутые видео → #FlutterPulseYoutube
Создаём кастомную панель приложений
Потому что вы можете 😉
Вы можете создать кастомную AppBar, реализовав интерфейс PreferredSizeWidget. Это даст вам гибкость в настройке панели приложений под нужды вашего приложения.
Чтобы использовать эту кастомную AppBar, просто передайте её в свойство appBar виджета Scaffold:
Оцените нашу новую рубрику по Flutter советам 👍! Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #CustomAppBar #AppBarDesign #FlutterTips
Потому что вы можете 😉
Вы можете создать кастомную AppBar, реализовав интерфейс PreferredSizeWidget. Это даст вам гибкость в настройке панели приложений под нужды вашего приложения.
class EditorAppBar extends StatelessWidget implements PreferredSizeWidget {
const EditorAppBar({
super.key,
});
@override
Widget build(BuildContext context) {
return Row(...); // Здесь вы можете настроить свой собственный дизайн
}
@override
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
// Используйте эту константу для рекомендуемой высоты
}
Чтобы использовать эту кастомную AppBar, просто передайте её в свойство appBar виджета Scaffold:
child: Scaffold(
appBar: EditorAppBar(),
...
),
Оцените нашу новую рубрику по Flutter советам 👍! Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #CustomAppBar #AppBarDesign #FlutterTips
👍3❤1
Создай расширение темы
Упростите доступ к свойствам темы вашего приложения 💻
Расширение темы позволяет упростить доступ к свойствам темы вашего приложения. Для этого нужно создать расширение класса
Пример использования
До: сложный доступ к свойствам темы
После: упрощенный доступ с расширением
Оцените новую рубрику по достоинству! 👍💬 Оставляйте ваши отзывы и предложения в комментариях! 💬👇
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #UIUX #CodingTips #AppDevelopment #SoftwareDevelopment
Упростите доступ к свойствам темы вашего приложения 💻
Расширение темы позволяет упростить доступ к свойствам темы вашего приложения. Для этого нужно создать расширение класса
BuildContext
.
extension ApparenceKitThemeExt on BuildContext {
ApparenceKitColors get colors => Theme.of(this).extension<ApparenceKitColors>()!;
// Получение цветов темы
TextTheme get textTheme => Theme.of(this).textTheme;
// Получение текстовой темы
ApparenceKitTextTheme get fonts => Theme.of(this).extension<ApparenceKitTextTheme>()!;
// Получение шрифтов темы
ThemeData get theme => Theme.of(this);
// Получение данных темы
Brightness get brightness => Theme.of(this).brightness;
// Получение яркости темы
ApparenceKitThemeData get kitTheme => ThemeProvider.of(this).current.data;
// Получение данных темы ApparenceKit
}
Пример использования
До: сложный доступ к свойствам темы
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return Container(
color: Theme.of(context).colorScheme.primary,
);
}
}
После: упрощенный доступ с расширением
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return Container(
color: context.colors.primary,
);
}
}
Оцените новую рубрику по достоинству! 👍💬 Оставляйте ваши отзывы и предложения в комментариях! 💬👇
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #UIUX #CodingTips #AppDevelopment #SoftwareDevelopment
👍4
Принудительный портретный режим
Когда вы в последний раз использовали приложение в ландшафтном режиме? 🤔
Фиксация ориентации экрана в Flutter
Чтобы заставить приложение работать только в портретном режиме, добавьте следующий код в функцию main() перед запуском приложения:
Теперь приложение не сможет перейти в ландшафтный режим 📱💻
Результат:
Приложение останется в портретном режиме 👍
Оцените нашу новую рубрику FlutterPulseTips! 👍 Ваши отзывы помогут нам улучшать контент. 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDev #ProgrammingTips #UIUX #DevTips
Когда вы в последний раз использовали приложение в ландшафтном режиме? 🤔
Фиксация ориентации экрана в Flutter
Чтобы заставить приложение работать только в портретном режиме, добавьте следующий код в функцию main() перед запуском приложения:
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp, // Портретная ориентация вверх
DeviceOrientation.portraitDown, // Портретная ориентация вниз
]);
Теперь приложение не сможет перейти в ландшафтный режим 📱💻
Результат:
Приложение останется в портретном режиме 👍
Оцените нашу новую рубрику FlutterPulseTips! 👍 Ваши отзывы помогут нам улучшать контент. 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDev #ProgrammingTips #UIUX #DevTips
👍3
Загрузка байтов изображения и отображение на холсте
Не так сложно сделать с помощью Flutter 😉
Вы когда-нибудь задумывались, как можно загрузить изображение и отобразить его на холсте в Flutter? 🤔 Давайте разберемся в этом вместе! 💡
Шаг 1: Загрузка изображения
Сначала нам нужно загрузить изображение из наших ресурсов. Для этого мы используем метод
Шаг 2: Отображение на холсте
Теперь, когда у нас есть изображение в формате
Вот и все! Теперь вы знаете, как загрузить байты изображения и отобразить их на холсте во Flutter. Просто и эффективно, не правда ли? 😊
Оцените нашу новую рубрику и оставьте свои комментарии! 👇
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #mobiledev #appdev #codingtips #FlutterTips
Не так сложно сделать с помощью Flutter 😉
Вы когда-нибудь задумывались, как можно загрузить изображение и отобразить его на холсте в Flutter? 🤔 Давайте разберемся в этом вместе! 💡
Шаг 1: Загрузка изображения
Сначала нам нужно загрузить изображение из наших ресурсов. Для этого мы используем метод
load
класса rootBundle
:
import 'dart:ui' as ui;
import 'package:flutter/services.dart';
// Загружаем изображение из ресурсов
final ByteData data = await rootBundle.load(path);
// Преобразуем в Uint8List
final Uint8List bytes = data.buffer.asUint8List();
// Преобразуем в ui.Image
final ui.Image image = await decodeImageFromList(bytes);
Шаг 2: Отображение на холсте
Теперь, когда у нас есть изображение в формате
ui.Image
, мы можем отобразить его на холсте. Для этого создадим собственный класс CustomPainter
:
// Создаем новый CustomPainter
class MyPainter extends CustomPainter {
final ui.Image image;
MyPainter(this.image);
@override
void paint(Canvas canvas, Size size) {
// Рисуем изображение на холсте
canvas.drawImageRect(image, srcRect, dstRect, Paint());
}
}
Вот и все! Теперь вы знаете, как загрузить байты изображения и отобразить их на холсте во Flutter. Просто и эффективно, не правда ли? 😊
Оцените нашу новую рубрику и оставьте свои комментарии! 👇
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #mobiledev #appdev #codingtips #FlutterTips
👍3🔥1
Локальная база данных
Когда вы хотите, чтобы ваше приложение работало офлайн 🔄
Шаг 1: Использование пакета Drift
Для работы с локальной базой данных мы будем использовать пакет Drift. 📦
Шаг 2: Создание базы данных
Шаг 3: Создание таблицы
Шаг 3: Создание или редактирование build.yaml
в корневой папке вашего Flutter-приложения 📁
Запустите сборщик, чтобы регенерировать схему базы данных 🔄
Оцените новую рубрику! 👍💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #LocalDatabase #DriftPackage #FlutterTips #AppDevelopment
Когда вы хотите, чтобы ваше приложение работало офлайн 🔄
Шаг 1: Использование пакета Drift
Для работы с локальной базой данных мы будем использовать пакет Drift. 📦
dart pub add drift
dart pub add drift_flutter
dart pub add drift_dev
Шаг 2: Создание базы данных
@DriftDatabase(tables: [TaskTable])
class Database extends $Database {
Database([QueryExecutor? e]) : super(e ?? driftDatabase(
name: 'todo-app',
native: const DriftNativeOptions(),
databaseDirectory: getApplicationSupportDirectory,
));
@override
int get schemaVersion => 2; // Версия базы данных
@override
MigrationStrategy get migration {
return MigrationStrategy(
onCreate: (m) async {
await m.createAll();
// Добавьте миграции здесь, если версия новая
},
);
}
}
Шаг 3: Создание таблицы
@DataClassName('TaskEntry')
class TaskTable extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get description => text()();
// Добавьте ваши запросы здесь
static Stream<List<TaskEntry>> getAllItems(Database database) =>
database.select(database.taskTable).watch();
}
Шаг 3: Создание или редактирование build.yaml
в корневой папке вашего Flutter-приложения 📁
targets:
$default:
builders:
drift_dev:
# Эти опции изменяют способ генерации кода
options:
databases:
default: lib/modules/drift/database.dart
sql:
dialect: sqlite
options:
version: "3.38"
modules: [fts5]
Запустите сборщик, чтобы регенерировать схему базы данных 🔄
Оцените новую рубрику! 👍💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #LocalDatabase #DriftPackage #FlutterTips #AppDevelopment
👍2🔥1
Сделайте текст выбираемым
По умолчанию текст не является выбираемым. 🤔
Почему? Виджет
ИЛИ 🔄
Используйте
Как выбрать между SelectionArea и SelectableText? 🤔
Используйте
Для одного текста просто используйте
Оцените новую рубрику и напишите своё мнение! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips 🔍
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #UIUX #CodingTips #AppDevelopment #FlutterTips
По умолчанию текст не является выбираемым. 🤔
Почему? Виджет
SelectionArea
позволяет выбирать текст, указывая Flutter обрабатывать отрисовку и взаимодействие для выбора текста. 📝
return MaterialApp(
home: SelectionArea(
child: Scaffold(
appBar: AppBar(title: const Text('SelectionArea Sample')),
body: const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Row 1'),
Text('Row 2'),
Text('Row 3'),
],
),
),
),
),
);
ИЛИ 🔄
const SelectableText(
'Hello! How are you?',
textAlign: TextAlign.center,
style: TextStyle(fontWeight: FontWeight.bold),
)
Используйте
SelectableText
вместо Text
🔁Как выбрать между SelectionArea и SelectableText? 🤔
Используйте
selectionArea
, если вы хотите включить выбор на нескольких виджетах, а не только на тексте. 📚Для одного текста просто используйте
SelectableText
👍Оцените новую рубрику и напишите своё мнение! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips 🔍
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #UIUX #CodingTips #AppDevelopment #FlutterTips
❤5👍1
🚀 Расширяем возможности Flutter с помощью FFI: бинарники и компиляция под капотом!
🔥 Готовы погрузиться в мир нативной магии? В новом видео от эксперта Руслана Цицера — ключевые секреты интеграции C/C++ библиотек во Flutter через FFI! Узнайте, как избежать подводных камней и заставить "железо" работать на вас.
👉 СМОТРЕТЬ ВИДЕО 👈
💡 В этом выпуске:
🔧 Две главные проблемы FFI и их элегантные решения:
1️⃣ Выбор компилятора — почему для iOS, Android и macOS нужны разные инструменты и как их настроить
2️⃣ Интеграция бинарников — куда поместить скомпилированные библиотеки, чтобы Flutter их "увидел"
📦 Практические примеры:
- Работа с Makefile и скриптами сборки
- Особенности подключения под Android (
- Автоматизация переноса бинарников
🚨Внимание, лайфхак! Для iOS показан работающий метод подключения через "кустарные" CocoaPods — минимум конфигурации, максимум результата!
🔗 Ресурсы:
- GitHub с примерами кода
💬 "Если вы работаете с нативным кодом — это видео сэкономит вам часы поисков!"
👍 Не пропустите! Узнайте, как:
- Собрать универсальные бинарники под любую платформу
- Избежать ошибок ABI-совместимости
- Оптимизировать процесс сборки
👉 Подписывайтесь на канал, жмите 🔔 колокольчик, чтобы не пропустить новые выпуски! Ваши лайки и комментарии — лучшая мотивация для автора 💙
И про реакции на нашем канале тоже не забывайте!) 👍
#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube #FFI #Rust #NativeCode #MobileDevelopment
🔥 Готовы погрузиться в мир нативной магии? В новом видео от эксперта Руслана Цицера — ключевые секреты интеграции C/C++ библиотек во Flutter через FFI! Узнайте, как избежать подводных камней и заставить "железо" работать на вас.
👉 СМОТРЕТЬ ВИДЕО 👈
💡 В этом выпуске:
🔧 Две главные проблемы FFI и их элегантные решения:
1️⃣ Выбор компилятора — почему для iOS, Android и macOS нужны разные инструменты и как их настроить
2️⃣ Интеграция бинарников — куда поместить скомпилированные библиотеки, чтобы Flutter их "увидел"
📦 Практические примеры:
- Работа с Makefile и скриптами сборки
- Особенности подключения под Android (
jniLibs
) и iOS (Framework + Info.plist)- Автоматизация переноса бинарников
🚨
🔗 Ресурсы:
- GitHub с примерами кода
💬 "Если вы работаете с нативным кодом — это видео сэкономит вам часы поисков!"
👍 Не пропустите! Узнайте, как:
- Собрать универсальные бинарники под любую платформу
- Избежать ошибок ABI-совместимости
- Оптимизировать процесс сборки
👉 Подписывайтесь на канал, жмите 🔔 колокольчик, чтобы не пропустить новые выпуски! Ваши лайки и комментарии — лучшая мотивация для автора 💙
И про реакции на нашем канале тоже не забывайте!) 👍
#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube #FFI #Rust #NativeCode #MobileDevelopment
❤1
Вложенная навигация с Go_Router
Давайте создадим боковую панель с Flutter Web и go_router 🤔
Вместо того, чтобы напрямую добавлять все маршруты (GoRoute), мы обернём их в поднавигацию 📦
Мы обернём все подмаршруты в StatefulShellRoute, чтобы управлять состоянием поднавигации 🔄
Для каждого подмаршрута у нас будет StatefulShellBranch, который может содержать несколько маршрутов 🌐
Каждый элемент будет иметь свой собственный стек навигации 📚
Оцените новую рубрику 👍👏! Все подобные новости можно найти по хэштегу #FlutterPulseTips. Не забудьте подписаться и следить за новыми советами 🔔
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #GoRouter #NestedNavigation #FlutterWeb
Давайте создадим боковую панель с Flutter Web и go_router 🤔
Вместо того, чтобы напрямую добавлять все маршруты (GoRoute), мы обернём их в поднавигацию 📦
Мы обернём все подмаршруты в StatefulShellRoute, чтобы управлять состоянием поднавигации 🔄
Для каждого подмаршрута у нас будет StatefulShellBranch, который может содержать несколько маршрутов 🌐
Каждый элемент будет иметь свой собственный стек навигации 📚
import 'package:go_router/go_router.dart'; // Импорт библиотеки go_router
GoRouter generateRouter() {
return GoRouter(
routes: [
// Страница без боковой панели
GoRoute(
name: 'signin',
path: '/signin',
builder: (context, state) => const SignInPage(),
),
// Страница с боковой панелью
StatefulShellRoute(
parentNavigatorKey: navigatorKey, // Ключ навигатора родительского маршрута
// Боковая панель будет отображаться слева
builder: (context, state, navigationShell) => Row(
children: [
SideBar(state: state), // Боковая панель
Expanded(child: navigationShell), // Содержимое навигации
],
),
// builder будет вызван, когда маршрут активируется
// navigationShell - виджет, который отображает содержимое маршрута
// Он будет показывать текущую последнюю страницу стека навигации для каждой ветки
navigatorContainerBuilder: (
BuildContext context,
StatefulNavigationShell navigationShell,
List<Widget> children,
) {
if (children.isEmpty) {
return SizedBox(); // Пустой контейнер, если нет дочерних элементов
}
return Scaffold(
body: children[navigationShell.currentIndex], // Отображение текущего дочернего элемента
);
},
branches: [
StatefulShellBranch(
routes: [
GoRoute(
name: 'users',
path: '/users',
builder: (context, state) => const UsersPage(),
),
GoRoute(
name: 'user profile',
path: '/users/:userId',
builder: (context, state) => const UserProfilePage(),
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
name: 'notifications',
path: '/notifications',
builder: (context, state) => const NotificationsPage(),
),
],
),
],
),
],
);
}
Оцените новую рубрику 👍👏! Все подобные новости можно найти по хэштегу #FlutterPulseTips. Не забудьте подписаться и следить за новыми советами 🔔
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #GoRouter #NestedNavigation #FlutterWeb
👍3👨💻1
Показываем версию вашего приложения
Полезно для поддержки клиентов или просто при тестировании новых сборок из магазинов
Отображение версии приложения может быть очень полезным, особенно когда вы тестируете новые сборки или оказываете поддержку клиентам. Для этого нам понадобится пакет
Далее, вы можете использовать следующий код, чтобы отобразить версию вашего приложения:
Оцените новую рубрику и напишите в комментариях, насколько она вам полезна! 👍💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #AppDevelopment #CodingTips #DevTips
Полезно для поддержки клиентов или просто при тестировании новых сборок из магазинов
Отображение версии приложения может быть очень полезным, особенно когда вы тестируете новые сборки или оказываете поддержку клиентам. Для этого нам понадобится пакет
package_info_plus
. Установите его, добавив в ваш pubspec.yaml:
dependencies:
package_info_plus: ^latest_version
Далее, вы можете использовать следующий код, чтобы отобразить версию вашего приложения:
class AppVersion extends StatelessWidget {
const AppVersion({super.key});
Future<PackageInfo> _getAppVersion() async {
// Получаем информацию о пакете приложения
final packageInfo = await PackageInfo.fromPlatform();
return packageInfo;
}
@override
Widget build(BuildContext context) {
return FutureBuilder<PackageInfo>(
future: _getAppVersion(),
builder: (context, snapshot) {
// Проверяем состояние загрузки данных
if (snapshot.connectionState == ConnectionState.waiting || snapshot.hasError) {
return const SizedBox.shrink(); // Возвращаем пустой виджет, если данные ещё не загружены или произошла ошибка
} else {
// Отображаем версию приложения и номер сборки
return Text(
"Version ${snapshot.data?.version}(${snapshot.data?.buildNumber})",
textAlign: TextAlign.center,
style: context.textTheme.bodyMedium?.copyWith(
color: context.colors.onBackground.withOpacity(.6),
),
);
}
},
);
}
}
Оцените новую рубрику и напишите в комментариях, насколько она вам полезна! 👍💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #AppDevelopment #CodingTips #DevTips
👍1