文章目录
写在前面
对 Flutter 一些需要相关监听的地方进行记录
内容
WidgetsBindingObserver
混入WidgetsBindingObserver
后,我们可以实现一些监听。
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
@override
void initState() {
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: Builder(
builder: (BuildContext context) {
return Center(
child: Column(
children: [
TextButton(
onPressed: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) {
return SecondPage();
}));
},
child: Text("press")),
],
),
);
},
),
),
);
}
}
App 前后台的监听
在didChangeAppLifecycleState()
里,我们可以监听到 app 在前后台的运行状态。
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
print(state.toString());
super.didChangeAppLifecycleState(state);
}
当按 home 键让 app 从前台退到后台的时候,结果如下:
flutter: AppLifecycleState.inactive
flutter: AppLifecycleState.paused
然后再从后台切换到前台:
flutter: AppLifecycleState.inactive
flutter: AppLifecycleState.resumed
AppLifecycleState
AppLifecycleState
有以下几种状态:
- resumed
- inactive
- paused
- detached
resumed
表示 app 处于可见状态并且可以响应用户的输入
inactive
表示 app 处于不活跃状态并且不可以响应用户的输入
iOS
在 iOS 上,如果有电话来电、Touch ID 的请求,或者是滑动出控制栏等都会让它处于 inactive 状态。
Android
在 Android 上,如果有电话来电、另一个 Activity 获取了焦点(比如说分屏的 app)、画中画的 app、一个系统弹窗等,都会让它处于 inactive 状态。
paused
这个状态意味着应用此时不能被用户看到,不能响应用户的输入,并且在后台运行了。
在这个状态下,Flutter Engine 不会调用 PlatformDispatcher.onBeginFrame
和PlatformDispatcher.onDrawFrame
回调。
detached
在这个状态里,app 还是会被 Flutter Engine 所持有,但却没有被任何宿主 View 持有。也就是说此时 Engine 是在没有 View 的情况下运行。
但目前这个状态应该存在一些回调上的缺陷,可进一步查看 AppLifeCycleState.detached is not called when app is closed quickly #57594