Start Debugging

dart

122 статей · Страница2из13

2026-10-19 flutterdarttheming

Как определить собственные дизайн-токены через ThemeExtension и анимировать их при переключении между светлой и тёмной темой во Flutter

Унаследуйте класс от ThemeExtension, зарегистрируйте по одному экземпляру в каждом ThemeData через список extensions, читайте его через Theme.of(context).extension<T>() и напишите настоящий lerp, чтобы AnimatedTheme в MaterialApp интерполировал ваши токены при переключении светлой и тёмной темы. Разобраны цвета, радиусы, тени, текстовые стили и булевы значения, падение при отсутствующем расширении, ловушка copyWith, которая отбрасывает все остальные расширения, и причина, по которой нужны == и hashCode. Всё проверено виджет-тестами на Flutter 3.44.8.

Как заставить AnimatedSwitcher анимировать смену, если тип дочернего виджета не меняется во Flutter

AnimatedSwitcher запускает переход только тогда, когда Widget.canUpdate считает новый дочерний виджет другим, поэтому Text на Text без ключа просто обновляется на месте. Здесь описано исправление в одну строку, где именно должен стоять ключ, почему UniqueKey - ловушка, ошибка направления сдвига из-за статического transitionBuilder и скачок раскладки из-за Stack по умолчанию. Всё проверено виджет-тестами на Flutter 3.44.8.
2026-10-19 flutterdartandroid

Как восстановить состояние UI после остановки процесса Android во Flutter с помощью RestorationMixin

Android завершает фоновые приложения Flutter, чтобы освободить память, и когда пользователь возвращается, каждый StatefulWidget начинает с нуля. Здесь показано, как включить восстановление через restorationScopeId, RestorationMixin и свойства Restorable, восстановить текстовые поля, позиции прокрутки и открытые маршруты, написать собственный RestorableValue и протестировать всё это с помощью restartAndRestore и adb. Проверено на Flutter 3.44.8 и эмуляторе Android 16.

Как перехватывать необработанные асинхронные ошибки во Flutter с помощью runZonedGuarded и PlatformDispatcher.instance.onError

FlutterError.onError видит только ошибки, возникшие внутри колбэков фреймворка. Future без await, таймеры, потоки и код после await попадают в другое место. Здесь показано, какой обработчик какую ошибку ловит (замеры на Flutter 3.44.8), и настройка main(), которая перехватывает их все, в том числе в вебе.
2026-10-18 dartflutterstreams

Как повторять последнее значение для поздних подписчиков потока Dart без BehaviorSubject из rxdart

Broadcast StreamController теряет все события, произошедшие до подписки. Вот замена BehaviorSubject без зависимостей на основе Stream.multi, расширение replayLatest() для уже существующих потоков, ускоренный вариант на async*, который молча теряет события, и нюанс с initialData у StreamBuilder. Всё проверено на Dart 3.12.2.

Миграция локального хранилища Flutter-приложения с Hive на Drift (hive_ce 2.22 на drift 2.35)

Однократный и устойчивый к сбоям импорт существующих боксов Hive в базу SQLite drift на устройстве пользователя: проектирование схемы, функция импорта, идемпотентность, удаление боксов и два подводных камня, которые незаметно портят данные (точность DateTime и конфликты имён классов). Проверено на Flutter 3.44.8 с hive_ce 2.22.0 и drift 2.35.2.

Исправление: pubspec.lock изменяется после flutter upgrade или при переключении версий Flutter

Flutter SDK закрепляет версии meta, vector_math, test_api и matcher, поэтому каждая смена SDK заново разрешает ваш lock-файл, а flutter upgrade запускает pub upgrade для проекта, в котором вы находитесь. Закрепите одну версию Flutter на репозиторий и требуйте неизменность lock-файла в CI.

Как синхронизировать выбранную вкладку NavigationBar с текущим маршрутом через StatefulShellRoute в go_router

Берите NavigationBar.selectedIndex из StatefulNavigationShell.currentIndex, а не из поля setState или копии, сделанной в initState. Замеры на Flutter 3.44.8 и go_router 18.0.2: какие подходы рассинхронизируются при deep link, context.go и переходах между ветками, почему индекс по location обманывает и как реагировать на смену вкладок через didUpdateWidget.
Назад Вперёд