精华内容
参与话题
问答
  • flutter 生命周期

    万次阅读 2018-09-13 22:20:26
    flutter中的State生命周期和android以及React Native的生命周期类似。 先看一张生命周期的流程图: 大致可以分为3个阶段: 初始化 状态变化 组件移除 初始化 State初始化时会依次执行 : 构造函数 &...

    前言:生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情,
    flutter中的State生命周期和android以及React Native的生命周期类似。

    先看一张生命周期的流程图:

    这里写图片描述
    大致可以分为3个阶段:

    • 初始化
    • 状态变化
    • 组件移除

    初始化

    State初始化时会依次执行 : 构造函数 > initState > didChangeDependencies > Widget build , 此时页面加载完成。

    然后我们看一下每个函数的意义:

    构造函数

    调用次数:1次

    这个函数严格意义上来讲不属于生命周期的一部分,因为这个时候State的widget属性为空,无法在构造函数中访问widget的属性 。但是构造函数必然是要第一个调用的。可以在这一部分接收前一个页面传递过来的数据。

    initState

    Called when this object is inserted into the tree.

    调用次数:1次

    当插入渲染树的时候调用,这个函数在生命周期中只调用一次。这里可以做一些初始化工作,比如初始化State的变量。

    didChangeDependencies

    Called when a dependency of this [State] object changes.

    • 初始化时,在initState()之后立刻调用
    • 当依赖的InheritedWidget rebuild,会触发此接口被调用

    这个函数会紧跟在initState之后调用,并且可以调用BuildContext.inheritFromWidgetOfExactType,那么BuildContext.inheritFromWidgetOfExactType的使用场景是什么呢?最经典的应用场景是

    new DefaultTabController(length: 3, child: new TabBar(
          tabs: [ "主页","订单","我的" ]
          .map( (data)=>new Text(data) ).toList(),
          
    

    TabBar本来需要定义一个TabController,但是在外面套一层DefaultTabController就不需要定义TabContrller了,看下源码:

    
    @override
      void didChangeDependencies() {
        super.didChangeDependencies();
        _updateTabController();
        _initIndicatorPainter();
      }
    
    void _updateTabController() {
        final TabController newController = widget.controller ?? DefaultTabController.of(context);
        ...
        }
    

    注意到这里DefaultTabController.of(context)

    static TabController of(BuildContext context) {
        final _TabControllerScope scope = context.inheritFromWidgetOfExactType(_TabControllerScope);
        return scope?.controller;
      }
    

    实际上就是调用BuildContext.inheritFromWidgetOfExactType,也就说在didChangeDependencies中,可以跨组件拿到数据。

    #运行时

    build

    调用次数:多次

    初始化之后开始绘制界面,当setState触发的时候会再次被调用

    didUpdateWidget

    Called whenever the widget configuration changes.

    祖先节点rebuild widget时调用 .当组件的状态改变的时候就会调用didUpdateWidget.

    理论上setState的时候会调用,但我实际操作的时候发现只是做setState的操作的时候没有调用这个方法。而在我改变代码hot reload时候会调用 didUpdateWidget 并执行 build…

    实际上这里flutter框架会创建一个新的Widget,绑定本State,并在这个函数中传递老的Widget。
    这个函数一般用于比较新、老Widget,看看哪些属性改变了,并对State做一些调整。

    需要注意的是,涉及到controller的变更,需要在这个函数中移除老的controller的监听,并创建新controller的监听。

    组件移除

    组件移除,例如页面销毁的时候会依次执行:deactivate > dispose

    deactivate

    Called when this object is removed from the tree.

    在dispose之前,会调用这个函数。实测在组件可见状态变化的时候会调用,当组件卸载时也会先一步dispose调用。

    dispose

    Called when this object is removed from the tree permanently.

    调用次数:1次

    一旦到这个阶段,组件就要被销毁了,这个函数一般会移除监听,清理环境。

    ##reassemble
    hot reload调用

    名称 状态
    initState 插入渲染树时调用,只调用一次
    didChangeDependencies state依赖的对象发生变化时调用
    didUpdateWidget 组件状态改变时候调用,可能会调用多次
    build 构建Widget时调用
    deactivate 当移除渲染树的时候调用
    dispose 组件即将销毁时调用

    实际场景

    假设我们从A页面跳转到B页面, 那么A,B页面的生命周期会是怎样的呢?

    B页面进入初始化状态,依次执行4个函数:构造函数 > initState > didChangeDependencies > Widget build , 此时页面加载完成,进入运行态。
    此时A页面依次执行deactivate > build函数。注意 此时A页面并未卸载。

    然后我们假设B页面只有一个按钮,点击B页面中的按钮,改变按钮的文字,会执行widget的build方法 ,(理论上也应该执行didUpdateWidget,但我这里没有)。

    这时,我们点击返回键从B页面返回到A页面。
    A页面重新显示,B页面开始卸载。
    那么A先执行deactivate > build , 然后B页面依次执行:deactivate > dispose
    此时A页面进入运行态,B页面移除。

    本次示例B页面代码:

    /*
     * Created by 李卓原 on 2018/9/13.
     * email: zhuoyuan93@gmail.com
     *
     */
    
    import 'package:flutter/material.dart';
    
    class NewsDetailPage extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => NewsDetailState();
    }
    
    class NewsDetailState extends State<NewsDetailPage> {
      int text = 1;
    
      NewsDetailState() {
        print('构造函数');
      }
    
      @override
      void initState() {
        print('init state');
        super.initState();
      }
    
      @override
      void didChangeDependencies() {
        print('didChangeDependencies');
        super.didChangeDependencies();
      }
    
      @override
      Widget build(BuildContext context) {
        print('widget build');
    
        return Scaffold(
          body: Center(
            child: _loading(),
          ),
          appBar: AppBar(
            title: Text('咨询详情'),
          ),
        );
      }
    
      @override
      void didUpdateWidget(NewsDetailPage oldWidget) {
        print('组件状态改变:didUpdateWidget');
        super.didUpdateWidget(oldWidget);
      }
    
      @override
      void deactivate() {
        print('移除时:deactivate');
        super.deactivate();
      }
    
      @override
      void dispose() {
        print('移除时:dispose');
        super.dispose();
      }
    
      //预加载布局
      Widget _loading() {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            CircularProgressIndicator(
              strokeWidth: 1.0,
            ),
            Container(
              child: Text("正在加载"),
              margin: EdgeInsets.only(top: 10.0),
            )
          ],
        );
      }
    }
    
    
    

    Tips:

    下面内容来自咸鱼技术团队.

    • 当ListView中的item滚动出可显示区域的时候,item会被从树中remove掉,此item子树中所有的state都会被dispose,state记录的数据都会销毁,item滚动回可显示区域时,会重新创建全新的state、element、renderobject

    • 使用hot reload功能时,要特别注意state实例是没有重新创建的,如果该state中存在一下复杂的资源更新需要重新加载才能生效,那么需要在reassemble()添加处理,不然当你使用hot reload时候可能会出现一些意想不到的结果,例如,要将显示本地文件的内容到屏幕上,当你开发过程中,替换了文件中的内容,但是hot reload没有触发重新读取文件内容,页面显示还是原来的旧内容.

    • didChangeDependencies有两种情况会被调用。

    • 创建时候在initState 之后被调用

    • 在依赖的InheritedWidget发生变化的时候会被调用

    • 正常的退出流程中会执行deactivate然后执行dispose。但是也会出现deactivate以后不执行dispose,直接加入树中的另一个节点的情况。

    • 这里的状态改变包括两种可能:1.通过setState内容改变 2.父节点的state状态改变,导致孩子节点的同步变化。

    App生命周期

    需要指出的是如果想要知道App的生命周期,那么需要通过WidgetsBindingObserver的didChangeAppLifecycleState 来获取。通过该接口可以获取是生命周期在AppLifecycleState类中。常用状态包含如下几个:

    名称 状态
    resumed 可见并能响应用户的输入
    inactive 处在并不活动状态,无法处理用户响应
    paused 不可见并不能响应用户的输入,但是在后台继续活动中

    一个实际场景中的例子:

    在不考虑suspending的情况下:从后台切入前台生命周期变化如下: AppLifecycleState.inactive->AppLifecycleState.resumed;

    从前台压后台生命周期变化如下: AppLifecycleState.inactive->AppLifecycleState.paused;

    class _MyWalletScreenState extends State<MyWalletScreen>
        with WidgetsBindingObserver {
    
     @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addObserver(this);
      }
    
      @override
      void dispose() {
        WidgetsBinding.instance.removeObserver(this);
        super.dispose();
      }  
    
      void didChangeAppLifecycleState(AppLifecycleState state) async {
        if (state == AppLifecycleState.resumed) {
          getData();
        }
      }
    }
    

    记得注册和移除监听。

    展开全文
  • Flutter生命周期

    千次阅读 2019-07-10 15:09:53
    一、在android 中Activty中有自己的生命周期,七大生命周期 1.onCreate() // 在Activity生命周期开始时被调用 2.onRestart() //当activity从停止状态重新启动时调用 3.onStart() //当activity对用户即将可见的...

    初学flutter,随笔记录

    一、在android 中Activty中有自己的生命周期,七大生命周期

    1.onCreate()  // 在Activity生命周期开始时被调用

    2.onRestart() //当activity从停止状态重新启动时调用

    3.onStart() //当activity对用户即将可见的时候调用。

    4.onResume() //当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经 可以传递给它

    5.onPause()// 当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。

    6.onStop()// 当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。

    7.onDestroy() // 在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况

    二、在我们的Flutter中同样也是有生命周期,接下来我们说说Flutter的生命周期

    开始前认识一个功能性的组件:Widget

    Flutter中几乎所有的对象都是一个Widget,与原生开发中“控件”不同的是,Flutter中的widget的概念更广泛,它不仅可以表示UI元素,也可以表示一些功能性的组件如:用于手势检测的 GestureDetector widget、用于应用主题数据传递的Theme等等。而原生开发中的控件通常只是指UI元素

          在initState这个方法,网络请求的时候亦或是变量的初始化,就是需要写到这个方法中来

      @override
     void initState() {
       // TODO: implement initState
       super.initState();
       _loadItemPage();
     }

    State初始化时会依次执行 : 构造函数 > initState > didChangeDependencies > Widget build , 此时页面加载完成。

    [x]初始化(插入渲染树)

    构造函数:不属于生命周期,因为这个时候State的widget属性为空,此时无法在构造函数中访问widget属性

    1、initState:

     /// Called when this object is inserted into the tree.
    这个函数在生命周期中只调用一次。这里可以做一些初始化工作,比如初始化State的变量

    2、didChangeDependencies:

     /// Called when a dependency of this [State] object changes.
     
    这个函数会紧跟在initState之后调用

    [x]状态改变(在渲染树中存在)

    3、didUpdateWidget:

    /// Called whenever the widget configuration changes.
    当组件的状态改变的时候就会调用didUpdateWidget,比如调用了setStat、[x]销毁(从渲染树中移除)

    4、deactivate:

    /// Called when this object is removed from the tree.
    在dispose之前,会调用这个函数。

    5、dispose:

    /// Called when this object is removed from the tree permanently.
    一旦到这个阶段,组件就要被销毁了,这个函数一般会移除监听,清理环境。


    initState :   插入渲染树时调用,只调用一次
    didChangeDependencies :   state依赖的对象发生变化时调用
    didUpdateWidget:    组件状态改变时候调用,可能会调用多次
    build :   构建Widget时调用
    deactivate:    当移除渲染树的时候调用
    dispose:    组件即将销毁时调用
     

    这个函数在生命周期中只调用一次。这里可以做一些初始化工作,比如初始化State的变量。

    import 'package:flutter/material.dart';
    
    class LifeState extends StatefulWidget {
      @override
      _lifeStates createState() => _lifeStates();
    }
    
    class _lifeStates extends State<LifeState> {
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
        print('initState');
      }
    
      @override
      void didChangeAppLifecycleState(AppLifecycleState state) {
        print(state.toString());
      }
    
      @override
      void didChangeDependencies() {
        // TODO: implement didChangeDependencies
        super.didChangeDependencies();
        print('didChangeDependencies');
      }
    
      @override
      void didUpdateWidget(LifeState oldWidget) {
        super.didUpdateWidget(oldWidget);
        print('didUpdateWidget');
      }
    
      @override
      Widget build(BuildContext context) {
        print('build');
        // TODO: implement build
        return MaterialApp(
          home: Center(
              child: GestureDetector(
            child: new Text('lifeCycle'),
            onTap: () {
              Navigator.of(context)
                  .push(new MaterialPageRoute(builder: (BuildContext c) {
                return new Text('sdfs');
              }));
            },
          )),
        );
      }
    
      @override
      void reassemble() {
        // TODO: implement reassemble
        super.reassemble();
        print('reassemble');
      }
    
      @override
      void deactivate() {
        // TODO: implement deactivate
        super.deactivate();
        print('deactivate');
      }
    
      @override
      void dispose() {
        // TODO: implement dispose
        super.dispose();
        print('dispose');
      }
    }
    
    1. widget

      initState
      didChangeDependencies
      build
    2. 退出页面

      deactivate
      dispose
    3. 点击热加载按钮

      reassemble
      didUpdateWidget
      build
    4. app从显示到后台(home键)

      AppLifecycleState.inactive
      AppLifecycleState.paused
    5. app从后台回到前台

    AppLifecycleState.inactive
    AppLifecycleState.resumed

    如图:

    完整生命周期如下:

    1. 创建一个State对象时,会调用StatefulWidget.createState;
    2. 和一个BuildContext相关联,可以认为被加载了(mounted);
    3. 调用initState;
    4. 调用didChangeDependencies;
    5. 经过上述步骤,State对象被完全的初始化了,调用build;
    6. 如果有需要,会调用didUpdateWidget;
    7. 如果处在开发模式,热加载会调用reassemble;
    8. 如果它的子树(subtree)包含需要被移除的State对象,会调用deactivate;
    9. 调用dispose,State对象以后都不会被构建;
    10. 当调用了dispose,State对象处于未加载(unmounted),已经被dispose的State对象没有办法被重新加载(remount)。
    展开全文
  • flutter生命周期

    2019-08-01 23:18:46
    flutter中的生命周期前言各个函数didUpdateWidget总结一下原创不易 前言 和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数体现在了State上面.理解flutter生命...

    前言

    和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数体现在了State上面.理解flutter的生命周期,对我们写出一个合理的控件至关重要.
    组件State的生命周期整理如下图:
    在这里插入图片描述
    大致可以看成三个阶段
    初始化(插入渲染数)
    状态改变(在渲染树中存在)
    销毁(从渲染书树中移除)

    各个函数

    构造函数不属于生命周期,因为这时候State的widget属性为空,如果要在构造函数中访问widget的属性是行不通的.但是构造函必然是第一个调用的.

    initState
    当插入渲染树的时候调用,这个函数在生命周期中调用一次,这里可以做一些初始化工作,比如初始化State的变量.

    didChangeDependecies
    这个函数会紧跟在initState之后调用,并且可以调用BuildContext.inheritFromWidgetOfExactType,那么BuildContext.inheritFromWidgetOfExactType的使用场景是什么那?最经典的应用场景是

    new DefaultTabController(length: 3, child: new TabBar(
          tabs: [ "主页","订单","我的" ]
          .map( (data)=>new Text(data) ).toList(),
    

    TabBar本来需要定义一个TabController,但是在外边套一层DfaultTabController就不需要定义TabContrller了,看下源码:

    @override
      void didChangeDependencies() {
        super.didChangeDependencies();
        _updateTabController();
        _initIndicatorPainter();
      }
    
    void _updateTabController() {
        final TabController newController = widget.controller ?? DefaultTabController.of(context);
        ...
    
    

    注意到这里DefaultTabController.of(context)

     static TabController of(BuildContext context) {
        final _TabControllerScope scope = context.inheritFromWidgetOfExactType(_TabControllerScope);
        return scope?.controller;
      }
    

    实际上就是调用uildContext.inheritFromWidgetOfExactType,也就是说didChangeDependencies中,可以跨组件拿到数据

    didUpdateWidget

    当组件的状态改变的时候就会调用didUpdateWidget,比如调用了setState实际上这里flutter框架会创建一个新的Widget,绑定本State,并对State做些调用.需要注意的是,涉及到controller的变更,需要在这个函数中移除老的controller的监听,并创建新controller的监听.
    比如还是TabBar:在这里插入图片描述

    deactiveate
    在dispose之前,会调用这个函数.
    dispose
    一旦到这个阶段,组件就要被销毁了,这个函数一般会移除监听,清理环境.
    还是TabBar:
    在这里插入图片描述

    总结一下

    阶段 调用次数
    构造函数 1
    initState 调用次数
    didChangeDependencies
    didUpdateWideget 1
    deactivete 1
    deactivate 1
    dispose 1

    原创不易

    链接:https://segmentfault.com/a/1190000015211309

    展开全文
  • Flutter 生命周期

    2020-11-26 15:53:44
    flutter中的State生命周期和android以及React Native的生命周期类似。 先看一张生命周期的流程图: 大致可以分为3个阶段: 初始化 状态变化 组件移除 初始化 State初始化时会依次执行 : 构造函数 > ...

    原文链接:https://blog.csdn.net/u011272795/article/details/82695920

    前言:生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情,
    flutter中的State生命周期和android以及React Native的生命周期类似。

    先看一张生命周期的流程图:

    这里写图片描述
    大致可以分为3个阶段:

    • 初始化
    • 状态变化
    • 组件移除

    初始化

    State初始化时会依次执行 : 构造函数 > initState > didChangeDependencies > Widget build , 此时页面加载完成。

    然后我们看一下每个函数的意义:

    构造函数

    调用次数:1次

    这个函数严格意义上来讲不属于生命周期的一部分,因为这个时候State的widget属性为空,无法在构造函数中访问widget的属性 。但是构造函数必然是要第一个调用的。可以在这一部分接收前一个页面传递过来的数据。

    initState

    Called when this object is inserted into the tree.

    调用次数:1次

    当插入渲染树的时候调用,这个函数在生命周期中只调用一次。这里可以做一些初始化工作,比如初始化State的变量。

    didChangeDependencies

    Called when a dependency of this [State] object changes.

    • 初始化时,在initState()之后立刻调用
    • 当依赖的InheritedWidget rebuild,会触发此接口被调用

    这个函数会紧跟在initState之后调用,并且可以调用BuildContext.inheritFromWidgetOfExactType,那么BuildContext.inheritFromWidgetOfExactType的使用场景是什么呢?最经典的应用场景是

    new DefaultTabController(length: 3, child: new TabBar(
          tabs: [ "主页","订单","我的" ]
          .map( (data)=>new Text(data) ).toList(),
          
    

    TabBar本来需要定义一个TabController,但是在外面套一层DefaultTabController就不需要定义TabContrller了,看下源码:

    
    @override
      void didChangeDependencies() {
        super.didChangeDependencies();
        _updateTabController();
        _initIndicatorPainter();
      }
    
    void _updateTabController() {
        final TabController newController = widget.controller ?? DefaultTabController.of(context);
        ...
        }
    

    注意到这里DefaultTabController.of(context)

    static TabController of(BuildContext context) {
        final _TabControllerScope scope = context.inheritFromWidgetOfExactType(_TabControllerScope);
        return scope?.controller;
      }
    

    实际上就是调用BuildContext.inheritFromWidgetOfExactType,也就说在didChangeDependencies中,可以跨组件拿到数据。

    #运行时

    build

    调用次数:多次

    初始化之后开始绘制界面,当setState触发的时候会再次被调用

    didUpdateWidget

    Called whenever the widget configuration changes.

    祖先节点rebuild widget时调用 .当组件的状态改变的时候就会调用didUpdateWidget.

    理论上setState的时候会调用,但我实际操作的时候发现只是做setState的操作的时候没有调用这个方法。而在我改变代码hot reload时候会调用 didUpdateWidget 并执行 build…

    实际上这里flutter框架会创建一个新的Widget,绑定本State,并在这个函数中传递老的Widget。
    这个函数一般用于比较新、老Widget,看看哪些属性改变了,并对State做一些调整。

    需要注意的是,涉及到controller的变更,需要在这个函数中移除老的controller的监听,并创建新controller的监听。

    组件移除

    组件移除,例如页面销毁的时候会依次执行:deactivate > dispose

    deactivate

    Called when this object is removed from the tree.

    在dispose之前,会调用这个函数。实测在组件可见状态变化的时候会调用,当组件卸载时也会先一步dispose调用。

    dispose

    Called when this object is removed from the tree permanently.

    调用次数:1次

    一旦到这个阶段,组件就要被销毁了,这个函数一般会移除监听,清理环境。

    ##reassemble
    hot reload调用

    名称 状态
    initState 插入渲染树时调用,只调用一次
    didChangeDependencies state依赖的对象发生变化时调用
    didUpdateWidget 组件状态改变时候调用,可能会调用多次
    build 构建Widget时调用
    deactivate 当移除渲染树的时候调用
    dispose 组件即将销毁时调用

    实际场景

    假设我们从A页面跳转到B页面, 那么A,B页面的生命周期会是怎样的呢?

    B页面进入初始化状态,依次执行4个函数:构造函数 > initState > didChangeDependencies > Widget build , 此时页面加载完成,进入运行态。
    此时A页面依次执行deactivate > build函数。注意 此时A页面并未卸载。

    然后我们假设B页面只有一个按钮,点击B页面中的按钮,改变按钮的文字,会执行widget的build方法 ,(理论上也应该执行didUpdateWidget,但我这里没有)。

    这时,我们点击返回键从B页面返回到A页面。
    A页面重新显示,B页面开始卸载。
    那么A先执行deactivate > build , 然后B页面依次执行:deactivate > dispose 。
    此时A页面进入运行态,B页面移除。

    本次示例B页面代码:

    /*
     * Created by 李卓原 on 2018/9/13.
     * email: zhuoyuan93@gmail.com
     *
     */
    
    import 'package:flutter/material.dart';
    
    class NewsDetailPage extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => NewsDetailState();
    }
    
    class NewsDetailState extends State<NewsDetailPage> {
      int text = 1;
    
      NewsDetailState() {
        print('构造函数');
      }
    
      @override
      void initState() {
        print('init state');
        super.initState();
      }
    
      @override
      void didChangeDependencies() {
        print('didChangeDependencies');
        super.didChangeDependencies();
      }
    
      @override
      Widget build(BuildContext context) {
        print('widget build');
    
        return Scaffold(
          body: Center(
            child: _loading(),
          ),
          appBar: AppBar(
            title: Text('咨询详情'),
          ),
        );
      }
    
      @override
      void didUpdateWidget(NewsDetailPage oldWidget) {
        print('组件状态改变:didUpdateWidget');
        super.didUpdateWidget(oldWidget);
      }
    
      @override
      void deactivate() {
        print('移除时:deactivate');
        super.deactivate();
      }
    
      @override
      void dispose() {
        print('移除时:dispose');
        super.dispose();
      }
    
      //预加载布局
      Widget _loading() {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            CircularProgressIndicator(
              strokeWidth: 1.0,
            ),
            Container(
              child: Text("正在加载"),
              margin: EdgeInsets.only(top: 10.0),
            )
          ],
        );
      }
    }
    
    
    

    Tips:

    下面内容来自咸鱼技术团队.

    • 当ListView中的item滚动出可显示区域的时候,item会被从树中remove掉,此item子树中所有的state都会被dispose,state记录的数据都会销毁,item滚动回可显示区域时,会重新创建全新的state、element、renderobject

    • 使用hot reload功能时,要特别注意state实例是没有重新创建的,如果该state中存在一下复杂的资源更新需要重新加载才能生效,那么需要在reassemble()添加处理,不然当你使用hot reload时候可能会出现一些意想不到的结果,例如,要将显示本地文件的内容到屏幕上,当你开发过程中,替换了文件中的内容,但是hot reload没有触发重新读取文件内容,页面显示还是原来的旧内容.

    • didChangeDependencies有两种情况会被调用。

    • 创建时候在initState 之后被调用

    • 在依赖的InheritedWidget发生变化的时候会被调用

    • 正常的退出流程中会执行deactivate然后执行dispose。但是也会出现deactivate以后不执行dispose,直接加入树中的另一个节点的情况。

    • 这里的状态改变包括两种可能:1.通过setState内容改变 2.父节点的state状态改变,导致孩子节点的同步变化。

    App生命周期

    需要指出的是如果想要知道App的生命周期,那么需要通过WidgetsBindingObserver的didChangeAppLifecycleState 来获取。通过该接口可以获取是生命周期在AppLifecycleState类中。常用状态包含如下几个:

    名称 状态
    resumed 可见并能响应用户的输入
    inactive 处在并不活动状态,无法处理用户响应
    paused 不可见并不能响应用户的输入,但是在后台继续活动中

    一个实际场景中的例子:

    在不考虑suspending的情况下:从后台切入前台生命周期变化如下: AppLifecycleState.inactive->AppLifecycleState.resumed;

    从前台压后台生命周期变化如下: AppLifecycleState.inactive->AppLifecycleState.paused;

    class _MyWalletScreenState extends State<MyWalletScreen>
        with WidgetsBindingObserver {
    
     @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addObserver(this);
      }
    
      @override
      void dispose() {
        WidgetsBinding.instance.removeObserver(this);
        super.dispose();
      }  
    
      void didChangeAppLifecycleState(AppLifecycleState state) async {
        if (state == AppLifecycleState.resumed) {
          getData();
        }
      }
    }
    

    记得注册和移除监听。

    展开全文
  • Flutter生命周期 & Widget 的生命周期& Inherited数据传递 详细代码参见Demo Demo地址 -> flutter_testdemo5 1、Flutter生命周期 1、什么是生命周期 生命周期本质上就是回调方法(函数) 这些...
  • 一个规范flutter生命周期的Widget基类,并且封装了基本属性,加快开发速度~
  • flutter生命周期分3个阶段6个钩子函数 1. 初始化 2. 状态变化 3. 组件移除 1. 初始化 构造函数 > initState > didChangeDependencies > build 页面构建完成 initState:插入渲染树时调用,只调用一次,...
  • 发现Flutter生命周期不大符合自己的业务,想要安卓提供的onCreate onResume等相似的生命周期 在参考其他现有的生命周期管理插件后发现还存在部分问题,所以在第三方的基础上去实现生命周期管理 目前还存在以下...
  • 如下代码: class _HomePageState extends State<HomePage> with WidgetsBindingObserver { @override void initState() { super.initState();... WidgetsBinding.instance.addObserver(this);...
  • react angular vue
  • Flutter应用程序中,生命周期涉及两个,一个是 Widget 的生命周期,一个是应用程序的生命周期,本文章说明通过 flutter_life_state 依赖库实现在 Flutter 中类似 Android 中Activity的生命周期监听,类似 iOS ...
  • Flutter生命周期

    千次阅读 2019-07-05 14:04:07
    如果你是 Android、iOS、React、Vue 的开发人员,那么你一定不会对生命周期感到陌生,当你在学习 Flutter 的时候,Flutter 也有自己的生命周期。本篇文章就讲讲 Flutter生命周期,从而知道应该在哪里来写业务逻辑...
  • Flutter生命周期

    2019-06-12 08:57:40
    生命周期: initState() 表示当前 State 将和一个 BuildContext 产生关联,但是此时BuildContext 没有完全装载完成,如果你需要在该方法中获取 BuildContext ,可以 new Future.delayed(const Duration(seconds: 0, ...
  • Flutter state生命周期

    2019-04-11 18:27:15
    最近研究flutter生命周期,当然已经有大牛早已深入探究填坑了 ! 但是 还是有些疑问!例如 didUpdateWidget为什么没有调用? 其实api早已经说明白了:父widget 重新build时调用!! /// Called whenever the ...
  • Flutter - 生命周期

    2019-09-27 00:18:29
    StatefulWidget 需要借助于 State 对象,...Flutter 中的 Widget 也存在生命周期,并且通过 State 来体现。 而 App 则是一个特殊的 Widget。除了需要处理视图显示的各个阶段(即视图的生命周期)之外,还需要应对应...

空空如也

1 2 3 4 5 ... 17
收藏数 323
精华内容 129
关键字:

flutter 生命周期