Сегодня поговорим об одном мощном инструменте, который обязательно вам пригодится — WidgetsBindingObserver.
WidgetsBindingObserver — это миксин, который дает возможность объекту, к которому подключается, отслеживать изменения системы и жизненного цикла приложения.
Подключить его очень просто. Для примера создадим Stateful-виджет Example. К состоянию этого виджета нужно подключить миксин, затем в
initState() необходимо обратиться к экземпляру WidgetsBinding и подключить текущий виджет как наблюдателя. При этом важно в методе dispose() отсоединять наблюдателя. Подобная реализация state-виджета Example будет выглядеть следующим образом:
class _ExampleState extends State<Example> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
Widget build(BuildContext context) {
return const Placeholder();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
}
Что же дает нам такая реализация? WidgetsBindingObserver позволяет отслеживать:
✔️Жизненный цикл приложения (активно, работает в фоне и другие параметры)
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
print('Жизненный цикл приложения изменился: $state');
}
✔️ Изменения размеров приложения (например, при перевороте экрана)
@override
void didChangeMetrics() {
super.didChangeMetrics();
final size = View.of(context).physicalSize;
print('Размер экрана изменился: ${size.width}x${size.height}');
}
✔️ Изменения темы системы
@override
void didChangePlatformBrightness() {
super.didChangePlatformBrightness();
print('Изменилась тема системы');
}
✔️Изменения системной локализации
@override
void didChangeLocales(List<Locale>? locales) {
super.didChangeLocales(locales);
print(
'Изменилась локализация: ${locales?.map((locale) => locale.toString()).join(', ')}');
}
✔️ Возникновения нехватки памяти в системе
@override
void didHaveMemoryPressure() {
super.didHaveMemoryPressure();
print('Обнаружена нехватка памяти!');
}
✔️Изменения системного размера шрифта
@override
void didChangeTextScaleFactor() {
super.didChangeTextScaleFactor();
print('Изменился размер шрифта системы');
}
📎Еще больше возможностей WidgetsBindingObserver можно найти в документации
❤️ — если было полезно
