美文网首页Flutter
Flutter —生命周期

Flutter —生命周期

作者: wethereornot | 来源:发表于2019-05-19 23:22 被阅读36次

    Flutter 中的生命周期

    flutter 也有自己的生命周期,但跟 Android 比起来就显得弱化了,官方定义的生命周期只有五个,实际应用中还需要WidgetsBindingObserver接口的配合,才能像android中那样 “为所欲为”。

    • initState() 表示当前 State 将和一个 BuildContext 产生关联,但是此时BuildContext
      没有完全装载完成,如果你需要在该方法中获取 BuildContext ,可以 new Future.delayed(const Duration(seconds: 0, (){//context}); 一下。

    • didChangeDependencies() 在 initState() 之后调用,当 State 对象的依赖关系发生变化时,该方法被调用,初始化时也会调用。

    • deactivate() 当 State 被暂时从视图树中移除时,会调用这个方法,同时页面切换时,也会调用。

    • dispose() Widget 销毁了,在调用这个方法之前,总会先调用 deactivate()。

    • didUpdateWidge 当 widget 状态发生变化时,会调用。

    flutter - 生命周期

    常见业务场景:

    1.Widget A打开Widget B: 调用 Navigator.push(B)

    • B构造函数--->B initState--->B didChangeDependencies--->B build--->A deactivate--->A didChangeDependencies.

    2.Widget B退出: Navigator.pop

    • A deactivate--->A didChangeDependencies--->A build--->B deactivate--->B dispose

    可以看出, Flutter打开、关闭Widget时跟安卓、iOS的时序一样, 都是先处理即将显示的界面。

    activity生命周期和Flutter对应关系:

    Flutter提供了WidgetsBindingObserver来监听AppLifecycleState, 而AppLifecycleState有4种状态:

    1、 resumed 界面可见, 同安卓的onResume。

    2、inactive界面退到后台或弹出对话框情况下, 即失去了焦点但仍可以执行drawframe回调;同安卓的onPause;

    3、paused应用挂起,比如退到后台,失去了焦点且不会收到 drawframe 回调;同安卓的onStop;

    4、suspending, iOS中没用,安卓里就是挂起,不会再执行 drawframe 回调;

    下面是生命周期:

    1、初次打开widget时,不执行AppLifecycleState的回调;

    2、按home键或Power键, AppLifecycleState inactive---->AppLifecycleState pause

    3、从后台到前台:AppLifecycleState inactive--->ApplifecycleState resumed

    4、back键退出应用: AppLifecycleState inactive--->AppLifecycleState paused

    
    class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
      AppLifecycleState _lastLifecycleState;
     
      void dispose() {
        super.dispose();
        WidgetsBinding.instance.removeObserver(this);
      }
     
      @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addObserver(this);
      }
     
      @override
      void didChangeAppLifecycleState(AppLifecycleState state) {
        print(state);
      }
     
      ...
    }
    
    

    相关文章

      网友评论

        本文标题:Flutter —生命周期

        本文链接:https://www.haomeiwen.com/subject/sueczqtx.html