研究Stateful Widget的生命周期是如何维护的

StatelessWidget很简单,只有一个build

StatefulWidget 生命周期相关函数有

createState
  • Widget创建的第一步,立刻调用

  • 可以被调用多次

  • 调用后,buildContext已经生成

  • 状态并未创建

initState
  • 只会被调用一次,此时view没有渲染,所以buildContext还不能使用

  • 必须调用super.initState

didChangeDependencies
  • 在initState之后立即调用,view已经渲染完成,statefulwidget刷新时不会调用
build
  • 不能返回null
  • 在didChangeDependencies之后调用
  • 每次刷新,build都会重新调用
  • 不要再build里添加其他非必要逻辑
didUpdateWidget
  • widget key发生变化时会调用,一般不会用
deactivate
  • widget将被remove时调用,也有可能重新放入render tree中
dispose
  • 当widget确实被销毁后调用
mounted
  • mounted是个变量,当buildContext可用渲染结束时为true,dispose后变为false

监听App生命周期

  • 在statefulwidget 的state类添加混入WidgetsBindingObserver
1
class _MyScreenState extends State<MyScreen> with WidgetsBindingObserver
  • 在initState里添加监听

    1
    WidgetsBinding.instance.addObserver(this);
  • 在dispose删除监听

    1
    WidgetsBinding.instance.removeObserver(this);
  • 在state类里重写didChangeAppLifecycleState(AppLifecycleState state)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @override
    void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.paused) {
    // went to Background
    }
    if (state == AppLifecycleState.resumed) {
    // came back to Foreground
    }
    }

生命周期状态有4种

  • resumed
  • inactive
  • paused
  • suspending

转自https://medium.com/flutter-community/flutter-lifecycle-for-android-and-ios-developers-8f532307e0c7