Flutter Pulse
417 subscribers
270 photos
541 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
🚀 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!
📌 Полный список изменений – в официальных релиз-ноутах. Уже сейчас можно обновляться:
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 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 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. Большая книга" – Всё, что вы хотели знать! 🔥📘
Вышел важнейший выпуск от авторов книги "Flutter. Большая книга" – финальный разговор перед релизом. Если ты хоть раз писал setState() — тебе точно стоит посмотреть это видео!
💡Что обсуждают:
Книга готова! Авторы поделились, как шёл процесс: что было сложно, что вдохновляло, и почему она не похожа ни на одну Flutter-книгу на русском (и не только).
Когда будет релиз и какие форматы запланированы: электронка, бумага, доступ на платформе — всё подробно.
Как поддержать проект — спойлер: можно не только деньгами, но и участием в комьюнити.
Честно о деньгах — сколько заработают авторы, и почему для них это не бизнес, а миссия.
Книга для кого? — будет полезна и джунам, и тем, кто готовит себя к роли тимлида. Есть лабораторный практикум, примеры, архитектурные подходы, опыт реальных проектов.
Книга vs. Видеокурс — почему выбрали именно формат книги и как правильно читать техлит, чтобы не засыпать.
Flutter-рынок, собесы, карьерный рост — много инсайтов из индустрии, честных мыслей и мотивации.
Крутая визуальная подача — дизайн книги радует глаз и помогает усваивать материал.
Да, будет версия с автографами. И да, можно будет купить за пределами РФ.
🔥 В этом видео — не просто анонс. Это манифест Flutter-разработки на русском языке. Настоящий разговор по душам.
#Flutter #FlutterPulse #FlutterКнига #Dart #MobileDev #Разработка #Карьера #Программирование #DDD #SoftwareDesign
Умный запрос оценки
Не спамите запросом оценки! 🤔

Почему?
• 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-уведомлений. Мы будем использовать пакет 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 📲

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. 📱💻

Адаптация макета под разные размеры экранов 📐
Чтобы ваше приложение выглядело отлично на разных устройствах, необходимо адаптировать макет под различные размеры экранов. 📊


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 позволяют добавлять новые методы к существующим классам. В данном случае мы будем использовать расширение для класса 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

Управление подпиской через 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