🚀 Flutter 3.29 уже здесь! 🚀
🔥 Новый релиз Flutter 3.29 приносит мощные обновления и улучшения производительности! Теперь с обновленным Impeller, новыми возможностями Cupertino, улучшенной Material 3 анимацией, обновленным DevTools и многим другим!
🆕 Что нового?
✅ Cupertino: Новый CupertinoSheetRoute, обновленные навигационные бары и улучшенные попапы.
✅ Material 3: Новый FadeForwardsPageTransitionsBuilder, обновленный CircularProgressIndicator, LinearProgressIndicator и Slider.
✅ Impeller Vulkan & OpenGLES: Улучшения стабильности, поддержка Impeller на всех Android-устройствах.
✅ Web: Улучшенная работа с WebAssembly и изображениями.
✅ DevTools: Новый инспектор, улучшенные логи, удобный выбор виджетов прямо на устройстве.
✅ Упрощенная работа с потоками в Dart на iOS и Android – платформа и UI теперь работают в одном потоке!
💥 Важно!
❌ Удален HTML renderer для Flutter Web.
❌ Отменена поддержка некоторых пакетов, в том числе flutter_image и flutter_markdown.
🔧 Обнови свой код, если используешь устаревшие API!
📌 Полный список изменений – в официальных релиз-ноутах. Уже сейчас можно обновляться:
🚀 Качаем, тестируем и делаем крутые приложения!
Полный список изменений: https://medium.com/flutter/whats-new-in-flutter-3-29-f90c380c2317
#Flutter #FlutterPulse #FlutterUpdate #MobileDev #Dart
🔥 Новый релиз Flutter 3.29 приносит мощные обновления и улучшения производительности! Теперь с обновленным Impeller, новыми возможностями Cupertino, улучшенной Material 3 анимацией, обновленным DevTools и многим другим!
🆕 Что нового?
✅ Cupertino: Новый CupertinoSheetRoute, обновленные навигационные бары и улучшенные попапы.
✅ Material 3: Новый FadeForwardsPageTransitionsBuilder, обновленный CircularProgressIndicator, LinearProgressIndicator и Slider.
✅ Impeller Vulkan & OpenGLES: Улучшения стабильности, поддержка Impeller на всех Android-устройствах.
✅ Web: Улучшенная работа с WebAssembly и изображениями.
✅ DevTools: Новый инспектор, улучшенные логи, удобный выбор виджетов прямо на устройстве.
✅ Упрощенная работа с потоками в Dart на iOS и Android – платформа и UI теперь работают в одном потоке!
💥 Важно!
❌ Удален HTML renderer для Flutter Web.
❌ Отменена поддержка некоторых пакетов, в том числе flutter_image и flutter_markdown.
🔧 Обнови свой код, если используешь устаревшие API!
📌 Полный список изменений – в официальных релиз-ноутах. Уже сейчас можно обновляться:
flutter upgrade
🚀 Качаем, тестируем и делаем крутые приложения!
Полный список изменений: https://medium.com/flutter/whats-new-in-flutter-3-29-f90c380c2317
#Flutter #FlutterPulse #FlutterUpdate #MobileDev #Dart
🔥 Громкий стрим про Flutter, книгу и многое другое! 🔥
Коллеги провели мощную трансляцию, где обсудили не только свою новую книгу, но и важные вопросы мира Flutter. Если пропустили — обязательно посмотрите запись, было много инсайтов и живого обсуждения!
📌 Что обсуждали на стриме?
📖 Книга по Flutter
Как появилась идея написать книгу?
Зачем она, если говорят, что джуны не нужны?
Кто работал над книгой и на каком она этапе?
Будет ли про Flutter Web и Desktop?
Будет ли раздел про Platform Channels?
Когда выйдет и как её купить?
🚀 Будущее Flutter
Есть ли перспективы у Flutter в 2025 году?
Что думаем о FlutterFlow?
Flutter vs KMP – что выбрать?
Flutter vs React и Expo – плюсы и минусы
Почему мобильные приложения так много весят?
🛠 Разработка и технологии
Какой стейт-менеджер лучше?
Почему многие считают Bloc лучшим?
Чем плох GetX?
На чём писать бэкенд для Flutter?
Почему язык бэкенда не так важен?
Что будет с Macros в будущем?
AI-помощники – зло или добро?
🎓 Карьера и обучение
Важен ли диплом для программиста?
Почему инженер важнее, чем технология?
Правда ли, что джуны никому не нужны?
6 месяцев изучаю программирование, но не получается – что делать?
🔥 А также:
ShoreBird – перспективная технология или нет?
Аврора OS и её будущее
Когда ждать анонс книги?
⏳ Таймкоды уже готовы, так что можно сразу перейти к интересующим вопросам!
📺 Запись доступна на канале коллег – если не смотрели, обязательно загляните!
💬 Как вам стрим? Какие темы зашли больше всего? Делитесь в комментариях, ставьте лайки! https://www.youtube.com/live/oJkjpluOhFE
#flutter #flutterpulse #dart #mobiledev #fluttercommunity
Коллеги провели мощную трансляцию, где обсудили не только свою новую книгу, но и важные вопросы мира Flutter. Если пропустили — обязательно посмотрите запись, было много инсайтов и живого обсуждения!
📌 Что обсуждали на стриме?
📖 Книга по Flutter
Как появилась идея написать книгу?
Зачем она, если говорят, что джуны не нужны?
Кто работал над книгой и на каком она этапе?
Будет ли про Flutter Web и Desktop?
Будет ли раздел про Platform Channels?
Когда выйдет и как её купить?
🚀 Будущее Flutter
Есть ли перспективы у Flutter в 2025 году?
Что думаем о FlutterFlow?
Flutter vs KMP – что выбрать?
Flutter vs React и Expo – плюсы и минусы
Почему мобильные приложения так много весят?
🛠 Разработка и технологии
Какой стейт-менеджер лучше?
Почему многие считают Bloc лучшим?
Чем плох GetX?
На чём писать бэкенд для Flutter?
Почему язык бэкенда не так важен?
Что будет с Macros в будущем?
AI-помощники – зло или добро?
🎓 Карьера и обучение
Важен ли диплом для программиста?
Почему инженер важнее, чем технология?
Правда ли, что джуны никому не нужны?
6 месяцев изучаю программирование, но не получается – что делать?
🔥 А также:
ShoreBird – перспективная технология или нет?
Аврора OS и её будущее
Когда ждать анонс книги?
⏳ Таймкоды уже готовы, так что можно сразу перейти к интересующим вопросам!
📺 Запись доступна на канале коллег – если не смотрели, обязательно загляните!
💬 Как вам стрим? Какие темы зашли больше всего? Делитесь в комментариях, ставьте лайки! https://www.youtube.com/live/oJkjpluOhFE
#flutter #flutterpulse #dart #mobiledev #fluttercommunity
💙🔥 Flutter 2025 Roadmap: Что нас ждет? 🔥💙
Команда Flutter снова радует нас долгожданным обновлением дорожной карты на 2025 год! 🚀 Как и прежде, Google открыто делится своими планами, а значит, самое время заглянуть в будущее экосистемы Flutter!
🔹 Производительность и Impeller – iOS окончательно прощается со Skia, а Impeller станет стандартом для Android 29+!
🔹 Web – улучшенная производительность, меньший размер приложений, WebAssembly и новый механизм JS interop.
🔹 Мобильные платформы – поддержка iOS 19 и Android 16, обновления для SwiftPM и Gradle.
🔹 Десктоп – Canonical продолжает развивать multi-window, поддержку клавиатуры и текстового ввода.
🔹 Dart & AI – новые языковые фичи, прокачанный кодоген и мощный AI-помощник для разработчиков.
🔹 Четыре стабильных релиза в 2025 – больше тестов, меньше багов!
🔥 Flutter становится мощнее, быстрее и доступнее! Следите за обновлениями и готовьтесь к новым возможностям! 🚀
Подробнее здесь
#Flutter #FlutterPulse #Dart #Impeller #MobileDev #WebDev #OpenSource
Команда Flutter снова радует нас долгожданным обновлением дорожной карты на 2025 год! 🚀 Как и прежде, Google открыто делится своими планами, а значит, самое время заглянуть в будущее экосистемы Flutter!
🔹 Производительность и Impeller – iOS окончательно прощается со Skia, а Impeller станет стандартом для Android 29+!
🔹 Web – улучшенная производительность, меньший размер приложений, WebAssembly и новый механизм JS interop.
🔹 Мобильные платформы – поддержка iOS 19 и Android 16, обновления для SwiftPM и Gradle.
🔹 Десктоп – Canonical продолжает развивать multi-window, поддержку клавиатуры и текстового ввода.
🔹 Dart & AI – новые языковые фичи, прокачанный кодоген и мощный AI-помощник для разработчиков.
🔹 Четыре стабильных релиза в 2025 – больше тестов, меньше багов!
🔥 Flutter становится мощнее, быстрее и доступнее! Следите за обновлениями и готовьтесь к новым возможностям! 🚀
Подробнее здесь
#Flutter #FlutterPulse #Dart #Impeller #MobileDev #WebDev #OpenSource
Flutter Pulse
У нас есть супер новость! 🤩 В 8 вечера сегодня начался стрим на Ютубе 📹, который продлится примерно час 🕰️! 🎉 Не пропустите эту возможность учиться и общаться с другими программистами! 🤝 Хотите узнать больше? 🤔 Тогда перейдите по ссылке и получите всю информацию!…
🚨 Flutter Roadmap 2025 — 🐦 больше не летает, а ползает
🕒 Почти час обсуждения, критики и немного философии от сообщества. Решил вам сделать краткий пересказ видео
💬 В этом видео разбирается не только новая дорожная карта Flutter, но и:
• 📉 Почему сообщество разочаровано
• 🧱 Проблемы с динамикой, сборкой и Web
• 💻 Слабая поддержка десктопа и SEO
• 🛠 Dart 3.8 и куда пропали макросы
• 🇷🇺 Форки от Яндекса и судьба Flock
• 🧠 Немного про курсы, книги и менторинг
🔥 Основные тезисы:
— Flutter всё ещё чувствует себя как «второсортный гражданин» в экосистеме Google
— Skia — больше не приоритет. А что вместо? 🤔
— Dart меняется, но не так, чтобы прям вау
— Веб-платформа застыла. SEO? Забудьте.
— Kotlin подбирается, а Canonical остаётся в стороне
— Много ожиданий, мало уверенности
🎓 Обсуждаются и образовательные инициативы: курс на Stepik, планы на лето и новая книга по конкурентной памяти Dart.
📽 Хотите посмотреть весь разбор? Вперед: "Flutter Roadmap на 2025 год сосёт" — звучит провокационно, но суть не в крике, а в аргументах.
#flutter #dart #roadmap2025 #разработка #mobiledev #frontend #webdev #каналотразработчиков 👨💻📱
🕒 Почти час обсуждения, критики и немного философии от сообщества. Решил вам сделать краткий пересказ видео
💬 В этом видео разбирается не только новая дорожная карта Flutter, но и:
• 📉 Почему сообщество разочаровано
• 🧱 Проблемы с динамикой, сборкой и Web
• 💻 Слабая поддержка десктопа и SEO
• 🛠 Dart 3.8 и куда пропали макросы
• 🇷🇺 Форки от Яндекса и судьба Flock
• 🧠 Немного про курсы, книги и менторинг
🔥 Основные тезисы:
— Flutter всё ещё чувствует себя как «второсортный гражданин» в экосистеме Google
— Skia — больше не приоритет. А что вместо? 🤔
— Dart меняется, но не так, чтобы прям вау
— Веб-платформа застыла. SEO? Забудьте.
— Kotlin подбирается, а Canonical остаётся в стороне
— Много ожиданий, мало уверенности
🎓 Обсуждаются и образовательные инициативы: курс на Stepik, планы на лето и новая книга по конкурентной памяти Dart.
📽 Хотите посмотреть весь разбор? Вперед: "Flutter Roadmap на 2025 год сосёт" — звучит провокационно, но суть не в крике, а в аргументах.
#flutter #dart #roadmap2025 #разработка #mobiledev #frontend #webdev #каналотразработчиков 👨💻📱
📘🔥 "Flutter. Большая книга" – Всё, что вы хотели знать! 🔥📘
Вышел важнейший выпуск от авторов книги "Flutter. Большая книга" – финальный разговор перед релизом. Если ты хоть раз писал setState() — тебе точно стоит посмотреть это видео!
💡Что обсуждают:
– Книга готова! Авторы поделились, как шёл процесс: что было сложно, что вдохновляло, и почему она не похожа ни на одну Flutter-книгу на русском (и не только).
– Когда будет релиз и какие форматы запланированы: электронка, бумага, доступ на платформе — всё подробно.
– Как поддержать проект — спойлер: можно не только деньгами, но и участием в комьюнити.
– Честно о деньгах — сколько заработают авторы, и почему для них это не бизнес, а миссия.
– Книга для кого? — будет полезна и джунам, и тем, кто готовит себя к роли тимлида. Есть лабораторный практикум, примеры, архитектурные подходы, опыт реальных проектов.
– Книга vs. Видеокурс — почему выбрали именно формат книги и как правильно читать техлит, чтобы не засыпать.
– Flutter-рынок, собесы, карьерный рост — много инсайтов из индустрии, честных мыслей и мотивации.
– Крутая визуальная подача — дизайн книги радует глаз и помогает усваивать материал.
– Да, будет версия с автографами. И да, можно будет купить за пределами РФ.
🔥 В этом видео — не просто анонс. Это манифест Flutter-разработки на русском языке. Настоящий разговор по душам.
#Flutter #FlutterPulse #FlutterКнига #Dart #MobileDev #Разработка #Карьера #Программирование #DDD #SoftwareDesign
Вышел важнейший выпуск от авторов книги "Flutter. Большая книга" – финальный разговор перед релизом. Если ты хоть раз писал setState() — тебе точно стоит посмотреть это видео!
💡Что обсуждают:
– Книга готова! Авторы поделились, как шёл процесс: что было сложно, что вдохновляло, и почему она не похожа ни на одну Flutter-книгу на русском (и не только).
– Когда будет релиз и какие форматы запланированы: электронка, бумага, доступ на платформе — всё подробно.
– Как поддержать проект — спойлер: можно не только деньгами, но и участием в комьюнити.
– Честно о деньгах — сколько заработают авторы, и почему для них это не бизнес, а миссия.
– Книга для кого? — будет полезна и джунам, и тем, кто готовит себя к роли тимлида. Есть лабораторный практикум, примеры, архитектурные подходы, опыт реальных проектов.
– Книга vs. Видеокурс — почему выбрали именно формат книги и как правильно читать техлит, чтобы не засыпать.
– Flutter-рынок, собесы, карьерный рост — много инсайтов из индустрии, честных мыслей и мотивации.
– Крутая визуальная подача — дизайн книги радует глаз и помогает усваивать материал.
– Да, будет версия с автографами. И да, можно будет купить за пределами РФ.
🔥 В этом видео — не просто анонс. Это манифест Flutter-разработки на русском языке. Настоящий разговор по душам.
#Flutter #FlutterPulse #FlutterКнига #Dart #MobileDev #Разработка #Карьера #Программирование #DDD #SoftwareDesign
Умный запрос оценки
Не спамите запросом оценки! 🤔
Почему?
• Apple Store ограничивает запрос оценки через нативное всплывающее окно до 2 раз в год 📆
• Google Play Store ограничивает запрос почти 2 раза каждые 3 месяца... 🤷♂️
• Вы не хотите раздражать пользователей и получать плохие оценки 😠
Мы создаем метод, подобный
Вы можете хранить
Также вы можете использовать этот же подход, чтобы открыть страницу приложения в магазине или напрямую запросить оценку. Страница в магазине требует больше усилий от пользователя, но текстовые отзывы более ценны 💬
Оцените новую рубрику! 👍👎
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDev #SmartRating #RatingSystem #UXTips
Не спамите запросом оценки! 🤔
Почему?
• Apple Store ограничивает запрос оценки через нативное всплывающее окно до 2 раз в год 📆
• Google Play Store ограничивает запрос почти 2 раза каждые 3 месяца... 🤷♂️
• Вы не хотите раздражать пользователей и получать плохие оценки 😠
Мы создаем метод, подобный
showDialog
, чтобы можно было запрашивать оценку где угодно в приложении 📱
class RatingSettings {
final Duration delayBeforeAsking;
final Duration delayBeforeAskingAgain;
RatingSettings({
required this.delayBeforeAsking,
required this.delayBeforeAskingAgain,
});
}
class Rating {
final RatingApi _ratingApi;
final RatingSettings settings;
final DateTime? lastAskingDate;
final DateTime userCreationDate;
final DateTime _current;
final bool hasRateApp;
Rating({
required this.settings,
required RatingApi ratingApi,
required this.lastAskingDate,
required this.userCreationDate,
required this.hasRateApp,
}) : _ratingApi = ratingApi,
_current = DateTime.now();
bool shouldAsk() {
// Если пользователь уже оценил приложение или мы не знаем дату создания пользователя, пропустим
if (userCreationDate == null || hasRateApp) {
return false;
}
final appInstallDiff = _current.difference(userCreationDate);
if (appInstallDiff < settings.delayBeforeAsking) {
return false;
}
if (lastAskingDate == null) {
return true;
}
return lastAskingDate!.difference(_current) > settings.delayBeforeAskingAgain;
}
Future<void> openStoreListing() => _ratingApi.openStoreListing();
Future<void> showRatingDialog() => _ratingApi.showRatingDialog();
}
void showRatingPopup(WidgetRef ref) {
final ratingRepository = ref.watch(ratingRepositoryProvider);
final userState = ref.watch(userStateNotifierProvider);
final ratingFuture = ratingRepository.getUserState(user);
ratingFuture.then((rating) {
if (rating.shouldAsk()) {
rating.delay();
showDialog(
context: context,
builder: (context) => AlertDialog.adaptive(
title: const Text('Спасибо за использование ULY'),
content: const Text('У вас есть минута, чтобы оставить отзыв?'),
actions: [
TextButton(
child: const Text('Позже'),
onPressed: () async {
Navigator.of(context).pop();
},
),
TextButton(
child: const Text('Да, конечно!'),
onPressed: () async {
Navigator.of(context).pop();
rating.rate();
},
),
],
),
);
}
});
}
Вы можете хранить
RatingSettings
в Firebase Remote Config, чтобы регулировать эти настройки без пересборки приложения и находить оптимальные значения 🔧Также вы можете использовать этот же подход, чтобы открыть страницу приложения в магазине или напрямую запросить оценку. Страница в магазине требует больше усилий от пользователя, но текстовые отзывы более ценны 💬
Оцените новую рубрику! 👍👎
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDev #SmartRating #RatingSystem #UXTips
Как показать уведомление Toast с Riverpod
Избавляемся от требования BuildContext
При разработке Flutter-приложений часто возникает необходимость отображать уведомления или сообщения Toast. Использование Riverpod для управления состоянием приложения позволяет упростить этот процесс. В этой статье мы рассмотрим, как показать уведомление Toast, используя Riverpod, и избавимся от необходимости передавать BuildContext.
Для начала нам нужно создать провайдер, который будет отвечать за отображение Toast-уведомлений. Мы будем использовать пакет
Далее, нам нужно создать глобальный ключ навигации, чтобы избавиться от требования BuildContext:
Теперь мы можем использовать наш провайдер
Таким образом, мы можем легко отображать Toast-уведомления в нашем Flutter-приложении, используя Riverpod и пакет
Оцените новую рубрику и напишите в комментариях, что бы вы хотели видеть в следующих выпусках! 👍💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #Riverpod #ToastNotifications #FlutterTips
Избавляемся от требования BuildContext
При разработке Flutter-приложений часто возникает необходимость отображать уведомления или сообщения Toast. Использование Riverpod для управления состоянием приложения позволяет упростить этот процесс. В этой статье мы рассмотрим, как показать уведомление Toast, используя Riverpod, и избавимся от необходимости передавать BuildContext.
Для начала нам нужно создать провайдер, который будет отвечать за отображение Toast-уведомлений. Мы будем использовать пакет
another_flushbar
для отображения уведомлений.
import 'package:another_flushbar/flushbar.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
// Это наш провайдер из riverpod для вызова метода toast из любой функции riverpod
final toastProvider = Provider<ToastBuilder>((ref) => ToastBuilder());
class ToastBuilder {
void success({
required String title,
required String text,
}) {
// Продолжительность показа уведомления
Duration duration = const Duration(seconds: 3);
_showSuccessToast(
context: navigatorKey.currentContext!, // Используем глобальный ключ навигации
title: title,
text: text,
duration: duration,
);
}
void _showSuccessToast({
required BuildContext context,
required String title,
required String text,
required Duration duration,
}) {
// Хак, чтобы предотвратить показ toast во время тестов
if (Platform.environment.containsKey('FLUTTER_TEST')) {
return;
}
if (!context.mounted) {
return; // Проверяем, смонтирован ли контекст
}
// Используем пакет another_flushbar, но есть много других отличных решений
Flushbar(
flushbarPosition: FlushbarPosition.TOP,
title: title,
message: text,
// Здесь можно добавить стили
).show(context);
}
}
Далее, нам нужно создать глобальный ключ навигации, чтобы избавиться от требования BuildContext:
/// Не забудьте создать этот глобальный ключ и добавить его в ваш основной маршрутизатор
final navigatorKey = GlobalKey<NavigatorState>();
Теперь мы можем использовать наш провайдер
toastProvider
в любом месте приложения, где доступен Riverpod, чтобы показать Toast-уведомление:
import 'package:flutter_riverpod/flutter_riverpod.dart';
@Riverpod(keepAlive: false)
class EditAlbumNotifier extends _$EditAlbumNotifier {
// ...
Future<void> save() async {
// ...
// Например, после сохранения альбома
ref.read(toastProvider).success(
title: "Успех",
text: "Журнал архивирован",
);
}
}
Таким образом, мы можем легко отображать Toast-уведомления в нашем Flutter-приложении, используя Riverpod и пакет
another_flushbar
, а также избавиться от необходимости передавать BuildContext, используя глобальный ключ навигации.Оцените новую рубрику и напишите в комментариях, что бы вы хотели видеть в следующих выпусках! 👍💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #Riverpod #ToastNotifications #FlutterTips
Как открыть страницу настроек приложения в системе
Привет, друзья! 👋 Сегодня мы поделимся с вами полезным советом о том, как открыть страницу настроек вашего приложения на устройстве пользователя. 📱💻
Зачем это нужно? 🤔
Например, если пользователь отклонил уведомления, система больше не будет запрашивать разрешение. В этом случае вы можете помочь пользователю перейти в настройки и включить уведомления вручную. 🔔
Используем url_launcher 📲
Или проще с permission_handler 📦
Оцените новую рубрику и напишите в комментариях, что вы думаете о ней! 💬 Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDev #ProgrammingTips #CodingTips
Привет, друзья! 👋 Сегодня мы поделимся с вами полезным советом о том, как открыть страницу настроек вашего приложения на устройстве пользователя. 📱💻
Зачем это нужно? 🤔
Например, если пользователь отклонил уведомления, система больше не будет запрашивать разрешение. В этом случае вы можете помочь пользователю перейти в настройки и включить уведомления вручную. 🔔
Используем url_launcher 📲
import 'package:url_launcher/url_launcher.dart';
Future<void> openSettings() async {
Uri url;
if (defaultTargetPlatform == TargetPlatform.iOS) {
url = Uri.parse('app-settings:');
} else if (defaultTargetPlatform == TargetPlatform.android) {
url = Uri.parse('package:uly.vlog.diary');
} else {
throw Exception('Unsupported platform');
}
if (await canLaunchUrl(url)) {
await launchUrl(url);
} else {
throw 'Could not launch $url';
}
}
Или проще с permission_handler 📦
import 'package:permission_handler/permission_handler.dart';
openAppSettings();
Оцените новую рубрику и напишите в комментариях, что вы думаете о ней! 💬 Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDev #ProgrammingTips #CodingTips
Flutter tips: how to create a responsive layout
Адаптивный макет: советы по Flutter
Привет, разработчики! 👋 Сегодня мы поговорим о создании адаптивного макета в Flutter. 📱💻
Адаптация макета под разные размеры экранов 📐
Чтобы ваше приложение выглядело отлично на разных устройствах, необходимо адаптировать макет под различные размеры экранов. 📊
Пример использования:
Этот код позволяет создать адаптивный макет, который будет корректно отображаться на различных устройствах. 📱💻
Оцените новую рубрику и напишите своё мнение в комментариях! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDev #UIUX #ProgrammingTips #CodingTips
Адаптивный макет: советы по Flutter
Привет, разработчики! 👋 Сегодня мы поговорим о создании адаптивного макета в Flutter. 📱💻
Адаптация макета под разные размеры экранов 📐
Чтобы ваше приложение выглядело отлично на разных устройствах, необходимо адаптировать макет под различные размеры экранов. 📊
import 'package:flutter/widgets.dart';
// Перечисление типов устройств
enum DeviceType { small, medium, large, xlarge }
// Виджет, который адаптирует свой контент к текущему типу устройства
class ResponsiveLayout extends StatelessWidget {
final Widget? small; // Виджет для маленьких экранов
final Widget? medium; // Виджет для средних экранов
final Widget? large; // Виджет для больших экранов
final Widget? xlarge; // Виджет для очень больших экранов
const ResponsiveLayout({
super.key,
required this.small,
this.medium,
this.large,
this.xlarge,
});
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
// Определение типа устройства на основе ширины экрана
switch (getDeviceType(constraints)) {
case DeviceType.small:
return small!; // Возвращаем виджет для маленьких экранов
case DeviceType.medium:
return medium ?? small!; // Возвращаем виджет для средних экранов или fallback к маленькому
case DeviceType.large:
return large ?? medium ?? small!; // Возвращаем виджет для больших экранов или fallback
case DeviceType.xlarge:
return xlarge ?? large ?? medium ?? small!; // Возвращаем виджет для очень больших экранов или fallback
}
},
);
}
// Метод для определения типа устройства на основе ограничений
DeviceType getDeviceType(BoxConstraints constraints) {
return switch (constraints.maxWidth) {
> 1200 => DeviceType.xlarge, // Очень большой экран
> 1024 => DeviceType.large, // Большой экран
> 768 => DeviceType.medium, // Средний экран
_ => DeviceType.small, // Маленький экран
};
}
}
Пример использования:
ResponsiveLayout(
small: SigninForm(), // Форма входа для маленьких экранов
medium: Center( // Центрирование для средних экранов и больше
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: 600), // Ограничение максимальной ширины
child: SigninForm(), // Форма входа
),
),
)
Этот код позволяет создать адаптивный макет, который будет корректно отображаться на различных устройствах. 📱💻
Оцените новую рубрику и напишите своё мнение в комментариях! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #AppDev #UIUX #ProgrammingTips #CodingTips
Flutter tips: Расширения для работы с датами
Привет, подписчики! Сегодня мы поговорим о полезных расширениях для работы с датами в Flutter. Расширения позволяют писать более чистый и читаемый код, что упрощает разработку и поддержку приложений.
Использование расширений для дат
Расширения в Dart позволяют добавлять новые методы к существующим классам. В данном случае мы будем использовать расширение для класса
Пример использования
Теперь давайте рассмотрим пример использования этих расширений. Вместо того, чтобы писать громоздкий код для проверки, является ли дата сегодняшней, мы можем использовать метод
Это намного чище и читаемее, чем:
Оцените новую рубрику! Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #CodingTips #AppDev #FlutterTips
Привет, подписчики! Сегодня мы поговорим о полезных расширениях для работы с датами в Flutter. Расширения позволяют писать более чистый и читаемый код, что упрощает разработку и поддержку приложений.
Использование расширений для дат
Расширения в Dart позволяют добавлять новые методы к существующим классам. В данном случае мы будем использовать расширение для класса
DateTime
, чтобы добавить полезные методы для работы с датами.extension DateExtension on DateTime {
DateTime get firstDayOfWeek {
return subtract(Duration(days: weekday - 1));
}
DateTime get lastDayOfWeek {
return add(Duration(days: 7 - weekday));
}
DateTime get firstDayOfMonth {
return DateTime(year, month);
}
bool isToday() => isSameDay(DateTime.now());
bool isSameDay(DateTime other) {
return day == other.day && month == other.month && year == other.year;
}
bool isAfterDayOrEqual(DateTime other) {
return isAfter(other) || isSameDay(other);
}
bool isBeforeDayOrEqual(DateTime other) {
return isBefore(other) || isSameDay(other);
}
bool isSameWeek(DateTime other) {
final kfirstDayOfTheWeek = firstDayOfWeek;
return other.isAfterDayOrEqual(kfirstDayOfTheWeek) &&
other.isBefore(lastDayOfWeek);
}
}
Пример использования
Теперь давайте рассмотрим пример использования этих расширений. Вместо того, чтобы писать громоздкий код для проверки, является ли дата сегодняшней, мы можем использовать метод
isToday()
:if (!activities.hasActivity(date) && date.isToday()) {
// код
}
Это намного чище и читаемее, чем:
final today = DateTime.now();
if (!activities.hasActivity(date) && date.day == today.day && date.month == today.month && date.year == today.year) {
// код
}
Оцените новую рубрику! Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #CodingTips #AppDev #FlutterTips
🎯 Flutter совет: Шаблон подписки с Provider
Управление подпиской через
---
🔧 Модель состояния подписки
---
🧩 Регистрация провайдера в main.dart
---
Использование подписки в UI
---
Пример обработки подписки
---
💡 Совет: Периодически проверяйте подписку при запуске приложения — особенно если используете серверную валидацию или Webhook-обновления.
💬 Поделитесь в комментариях, как вы реализуете подписки в своих приложениях!
📌 Все советы рубрики — по хэштегу #FlutterPulseTips
#flutter #dart #provider #architecture #subscriptions #revenuecat #qonversion #boilerplate #mobiledev #FlutterPulseTips #UIUX #premiumapps
Управление подпиской через
Provider
— один из самых чистых и масштабируемых способов построения архитектуры подписок в Flutter. Ниже — полный шаблон, который можно адаптировать под RevenueCat, Qonversion, Firebase и другие платформы.---
🔧 Модель состояния подписки
class SubscriptionModel extends ChangeNotifier {
bool _isSubscribed = false;
DateTime? _expiryDate;
bool get isSubscribed => _isSubscribed;
DateTime? get expiryDate => _expiryDate;
void updateStatus({required bool subscribed, DateTime? expiry}) {
_isSubscribed = subscribed;
_expiryDate = expiry;
notifyListeners();
}
void reset() {
_isSubscribed = false;
_expiryDate = null;
notifyListeners();
}
bool get isExpired {
if (_expiryDate == null) return true;
return DateTime.now().isAfter(_expiryDate!);
}
}
---
🧩 Регистрация провайдера в main.dart
void main() {
runApp(
ChangeNotifierProvider(
create: (_) => SubscriptionModel(),
child: const MyApp(),
),
);
}
---
Использование подписки в UI
Consumer<SubscriptionModel>(
builder: (context, model, _) {
if (model.isSubscribed) {
return const PremiumContent();
}
return Column(
children: [
const Text("Оформите подписку для доступа к премиум-функциям"),
ElevatedButton(
onPressed: () => handleSubscription(context),
child: const Text("Подписаться"),
),
],
);
},
)
---
Пример обработки подписки
Future<void> handleSubscription(BuildContext context) async {
final model = context.read<SubscriptionModel>();
final result = await PurchaseService.buy(); // ваша реализация
if (result.success) {
model.updateStatus(
subscribed: true,
expiry: result.expiryDate,
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text("Не удалось оформить подписку")),
);
}
}
---
💡 Совет: Периодически проверяйте подписку при запуске приложения — особенно если используете серверную валидацию или Webhook-обновления.
💬 Поделитесь в комментариях, как вы реализуете подписки в своих приложениях!
📌 Все советы рубрики — по хэштегу #FlutterPulseTips
#flutter #dart #provider #architecture #subscriptions #revenuecat #qonversion #boilerplate #mobiledev #FlutterPulseTips #UIUX #premiumapps
AnimatedSwitcher с Riverpod: Анимируем текст при каждом изменении
Привет, разработчики Flutter! 👋 Сегодня мы рассмотрим интересный совет по использованию AnimatedSwitcher вместе с Riverpod для создания анимированных изменений текста. 📱💡
Что такое AnimatedSwitcher?
Как это работает?
1. Мы используем AnimatedSwitcher для обёртки нашего текстового виджета.
2. Ключ (Key) играет решающую роль. Когда значение состояния меняется, ключ обновляется, запуская анимацию.
3. transitionBuilder позволяет настроить тип анимации. В примере используется ScaleTransition.
Почему это полезно?
- Плавные переходы улучшают пользовательский опыт 🌟
- Легко реализуется с помощью Riverpod и AnimatedSwitcher 👍
Оцените новую рубрику и напишите в комментариях, какие темы вам интересны! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #UIUX #Animation #RiverpodTips #FlutterTips
Привет, разработчики Flutter! 👋 Сегодня мы рассмотрим интересный совет по использованию AnimatedSwitcher вместе с Riverpod для создания анимированных изменений текста. 📱💡
Что такое AnimatedSwitcher?
AnimatedSwitcher(
// Виджет, который по умолчанию делает плавное переключение между новым виджетом и предыдущим
duration: const Duration(milliseconds: 250), // Продолжительность анимации
switchInCurve: Curves.easeInOut, // Кривая анимации при появлении
transitionBuilder: (Widget child, Animation<double> animation) {
// Строитель анимации перехода
return ScaleTransition(scale: animation, child: child);
},
child: Text(
'MyText', // Текст, который будет отображаться
key: Key('My-${state.value?.currentStepIndex}'), // Ключ, который запускает анимацию при изменении
style: TextStyle(fontSize: 24), // Стиль текста
),
)
Как это работает?
1. Мы используем AnimatedSwitcher для обёртки нашего текстового виджета.
2. Ключ (Key) играет решающую роль. Когда значение состояния меняется, ключ обновляется, запуская анимацию.
3. transitionBuilder позволяет настроить тип анимации. В примере используется ScaleTransition.
class SessionExerciceTitle extends ConsumerStatefulWidget {
const SessionExerciceTitle({super.key});
@override
ConsumerState<ConsumerStatefulWidget> createState() => _SessionExerciceTitleState();
}
class _SessionExerciceTitleState extends ConsumerState<SessionExerciceTitle> {
Key titleKey(AsyncValue<UserSessionState> state) =>
ValueKey<String?>("My-${state.value?.currentStepIndex}");
@override
Widget build(BuildContext context) {
final state = ref.watch(userSessionNotifierProvider); // Следим за изменениями состояния
return AnimatedSwitcher(
duration: const Duration(milliseconds: 250), // Продолжительность анимации
switchInCurve: Curves.easeInOut, // Кривая анимации при появлении
transitionBuilder: (Widget child, Animation<double> animation) {
// Строитель анимации перехода
return ScaleTransition(scale: animation, child: child);
},
child: Text(
state.value?.myText ?? '', // Отображаемый текст
key: titleKey(state), // Ключ, который запускает анимацию при изменении состояния
textAlign: TextAlign.center, // Выравнивание текста
),
);
}
}
Почему это полезно?
- Плавные переходы улучшают пользовательский опыт 🌟
- Легко реализуется с помощью Riverpod и AnimatedSwitcher 👍
Оцените новую рубрику и напишите в комментариях, какие темы вам интересны! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #UIUX #Animation #RiverpodTips #FlutterTips