Flutter : 关于 Flutter 应用上的监听

写在前面

对 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.onBeginFramePlatformDispatcher.onDrawFrame回调。

detached

在这个状态里,app 还是会被 Flutter Engine 所持有,但却没有被任何宿主 View 持有。也就是说此时 Engine 是在没有 View 的情况下运行。

但目前这个状态应该存在一些回调上的缺陷,可进一步查看 AppLifeCycleState.detached is not called when app is closed quickly #57594

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值