flutter 你什么时候使用 WidgetsBindingObserver ?
Flutter 中 WidgetsBindingObserver
的使用场景与示例
WidgetsBindingObserver
是一个用于监听应用程序生命周期变化和窗口尺寸等事件的接口。以下是一些常见的使用场景及相应的代码示例:
1. 监听应用生命周期事件
如果需要在应用进入后台、恢复前台等状态变化时执行一些操作,例如暂停或恢复音视频播放、存储或恢复数据等,可以通过实现 WidgetsBindingObserver
来监听这些变化。
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class LifecycleObserverWidget extends StatefulWidget {
@override
_LifecycleObserverWidgetState createState() => _LifecycleObserverWidgetState();
}
class _LifecycleObserverWidgetState extends State<LifecycleObserverWidget> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance?.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance?.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.inactive) {
print('App is inactive');
} else if (state == AppLifecycleState.paused) {
print('App is paused');
} else if (state == AppLifecycleState.resumed) {
print('App is resumed');
} else if (state == AppLifecycleState.detached) {
print('App is detached');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Lifecycle Observer'),
),
body: Center(
child: Text('Check console for lifecycle events'),
),
);
}
}
void main() {
runApp(MaterialApp(home: LifecycleObserverWidget()));
}
2. 监听窗口尺寸变化
在需要对窗口尺寸变化进行响应的场景中,例如应用在桌面设备或移动设备上旋转屏幕时自动调整布局,可以通过实现 didChangeMetrics
来监听窗口尺寸的变化。
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class WindowMetricsObserverWidget extends StatefulWidget {
@override
_WindowMetricsObserverWidgetState createState() => _WindowMetricsObserverWidgetState();
}
class _WindowMetricsObserverWidgetState extends State<WindowMetricsObserverWidget> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance?.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance?.removeObserver(this);
super.dispose();
}
@override
void didChangeMetrics() {
final window = WidgetsBinding.instance?.window;
if (window != null && window.hasFrame) {
final size = window.physicalSize / window.devicePixelRatio;
print('Window size: ${size.width}x${size.height}');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Window Metrics Observer'),
),
body: Center(
child: Text('Rotate device to see window metrics changes in console'),
),
);
}
}
void main() {
runApp(MaterialApp(home: WindowMetricsObserverWidget()));
}
3. 监听系统亮度模式变化
在需要检测系统亮度模式(如暗色模式和浅色模式)变化时,可以通过实现 didChangePlatformBrightness
方法来动态更新应用的主题设置。
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class BrightnessObserverWidget extends StatefulWidget {
@override
_BrightnessObserverWidgetState createState() => _BrightnessObserverWidgetState();
}
class _BrightnessObserverWidgetState extends State<BrightnessObserverWidget> with WidgetsBindingObserver {
Brightness _brightness = Brightness.light;
@override
void initState() {
super.initState();
WidgetsBinding.instance?.addObserver(this);
_brightness = WidgetsBinding.instance?.window.platformBrightness ?? Brightness.light;
}
@override
void dispose() {
WidgetsBinding.instance?.removeObserver(this);
super.dispose();
}
@override
void didChangePlatformBrightness() {
setState(() {
_brightness = WidgetsBinding.instance?.window.platformBrightness ?? Brightness.light;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
brightness: _brightness,
),
home: Scaffold(
appBar: AppBar(
title: Text('Brightness Observer'),
),
body: Center(
child: Text('Current brightness: $_brightness'),
),
),
);
}
}
void main() {
runApp(BrightnessObserverWidget());
}
4. 监听系统语言变化
如果应用需要动态响应系统语言的切换,可以通过 didChangeLocales
来监听系统的区域设置变化,从而重新加载国际化配置。
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
class LocaleObserverWidget extends StatefulWidget {
@override
_LocaleObserverWidgetState createState() => _LocaleObserverWidgetState();
}
class _LocaleObserverWidgetState extends State<LocaleObserverWidget> with WidgetsBindingObserver {
Locale _locale = Locale('en', 'US');
@override
void initState() {
super.initState();
WidgetsBinding.instance?.addObserver(this);
_locale = Localizations.localeOf(context);
}
@override
void dispose() {
WidgetsBinding.instance?.removeObserver(this);
super.dispose();
}
@override
void didChangeLocales(List<Locale> localeList) {
setState(() {
_locale = localeList.first;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
supportedLocales: [Locale('en', 'US'), Locale('zh', 'CN')],
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
locale: _locale,
home: Scaffold(
appBar: AppBar(
title: Text('Locale Observer'),
),
body: Center(
child: Text('Current locale: ${_locale.languageCode}-${_locale.countryCode}'),
),
),
);
}
}
void main() {
runApp(LocaleObserverWidget());
}
使用注意事项
- 使用
WidgetsBindingObserver
时,需要在initState
中添加观察者 (addObserver
),并在dispose
中移除观察者 (removeObserver
),以避免内存泄漏。 WidgetsBindingObserver
适合在需要实时响应系统或应用状态变化的场景中使用,帮助提升应用的交互性和响应性。
更多关于flutter 你什么时候使用 WidgetsBindingObserver ?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于flutter 你什么时候使用 WidgetsBindingObserver ?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter开发中,WidgetsBindingObserver
是一个有用的接口,它允许你监听与Flutter引擎的生命周期相关的事件,比如应用启动、暂停、恢复等。这些事件对于需要在特定时机执行某些操作的场景特别有用,比如资源管理、状态持久化、事件监听器的注册与取消注册等。
WidgetsBindingObserver
主要通过实现其两个方法 didChangeAppLifecycleState
和 didChangeMetrics
来使用。以下是一个示例,展示了如何在Flutter应用中使用 WidgetsBindingObserver
来监听应用的生命周期变化:
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class LifecycleObserverExample extends StatefulWidget {
@override
_LifecycleObserverExampleState createState() => _LifecycleObserverExampleState();
}
class _LifecycleObserverExampleState extends State<LifecycleObserverExample> with WidgetsBindingObserver {
AppLifecycleState _currentLifecycleState;
@override
void initState() {
super.initState();
WidgetsBinding.instance?.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance?.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
setState(() {
_currentLifecycleState = state;
// 在这里处理应用生命周期状态的变化
print('AppLifecycleState changed to ${state.toString()}');
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Lifecycle Observer Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Current Lifecycle State: $_currentLifecycleState'),
],
),
),
),
);
}
@override
void didChangeMetrics() {
// 这个方法通常用于监听窗口尺寸的变化,但在本例中我们不需要处理它
}
}
void main() {
runApp(LifecycleObserverExample());
}
代码说明:
-
定义StatefulWidget:
LifecycleObserverExample
是一个有状态的Widget,用于展示当前的应用生命周期状态。 -
实现WidgetsBindingObserver:
_LifecycleObserverExampleState
类实现了WidgetsBindingObserver
接口,这意味着它必须实现didChangeAppLifecycleState
和didChangeMetrics
方法。 -
初始化与清理:
- 在
initState
方法中,通过WidgetsBinding.instance?.addObserver(this);
添加观察者。 - 在
dispose
方法中,通过WidgetsBinding.instance?.removeObserver(this);
移除观察者,以避免内存泄漏。
- 在
-
处理生命周期变化:在
didChangeAppLifecycleState
方法中,通过setState
更新UI,并打印当前的生命周期状态。 -
构建UI:在
build
方法中,构建了一个简单的UI,显示当前的生命周期状态。 -
运行应用:在
main
函数中,运行LifecycleObserverExample
应用。
通过这种方式,你可以轻松地在Flutter应用中监听并响应应用的生命周期事件,从而在合适的时间执行特定的操作。