推广

flutter-State的生命周期

iseeyu2年前 (2024-02-22)推广130

image.gif

  • initState:当Widget第一次插入到Widget树时会被调用,对于每一个State对象,这个方法只会调用一次。所以,通常在该回调中做一些一次性的操作,如一些初始化操作。(注意:不能在该回调中调用BuildContext.inheritFromWidgetOfExactType(该方法用于在Widget树上获取离当前widget最近的一个父级InheritFromWidget),原因是在初始化完成后,Widget树中的InheritFromWidget也可能会发生变化,所以正确的做法应该在在build()方法或didChangeDependencies()中调用它。)
  • didChangeDependencies():当State对象的依赖发生变化时会被调用;例如:在父widget的build() 中如果包含一个InheritedWidget,然后在之后InheritedWidget发生了变化,那么此时InheritedWidget的子widget的didChangeDependencies()回调都会被调用。
  • build:它主要是用于构建Widget子树
  • reassemble:此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。
  • didUpdateWidget:在widget重新构建时,Flutter framework会调用Widget.canUpdate来检测Widget树中同一位置的新旧节点,然后决定是否需要更新,如果Widget.canUpdate返回true则会调用此回调。正如之前所述,Widget.canUpdate会在新旧widget的key和runtimeType同时相等时会返回true,也就是说在在新旧widget的key和runtimeType同时相等时didUpdateWidget()就会被调用。
  • deactivate:当State对象从树中被移除时,会调用此回调。在一些场景下,Flutter framework会将State对象重新插到树中,如包含此State对象的子树在树的一个位置移动到另一个位置时(可以通过GlobalKey来实现)。如果移除后没有重新插入到树中则紧接着会调用dispose()方法。
  • dispose:当State对象从树中被永久移除时调用;通常在此回调中释放资源。
class LifeCyclePage extends StatefulWidget {
  @override
  _LifeCyclePageState createState() => _LifeCyclePageState();

  @override
  StatefulElement createElement() {
    // print("page1--createElement");
    return super.createElement();
  }
}

class _LifeCyclePageState extends State<LifeCyclePage>
    with WidgetsBindingObserver {
  String title = "点击我";

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print('page1--initState');
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    print(state.toString());
  }

  @override
  void didChangeDependencies() {
    print('page1--didChangeDependencies');
    super.didChangeDependencies();
  }

  @override
  void didUpdateWidget(LifeCyclePage oldWidget) {
    print('page1--didUpdateWidget');
    super.didUpdateWidget(oldWidget);
  }

  @override
  Widget build(BuildContext context) {
    print('page1--build');
    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text("生命周期示例"),
      ),
      body: Column(
        children: <Widget>[
          GestureDetector(
            child: new Text(title ?? ""),
            onTap: () {
              setState(() {
                title = "我变化了";
              });
            },
          ),
         ChildStatefulWidget(),
          FlatButton(
              color: Colors.grey,
              onPressed: () {
                Navigator.of(context)
                    .push(new MaterialPageRoute(builder: (BuildContext c) {
                  return new LifeCyclePage2();
                }));
              },
              child: Text("跳转页面")),
        ],
      ),
    );
  }

  @override
  void reassemble() {
    // TODO: implement reassemble
    super.reassemble();
    print('page1--reassemble');
  }

  @override
  void deactivate() {
    // TODO: implement deactivate
    super.deactivate();
    print('page1--deactivate');
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    //WidgetsBinding.instance.addObserver(this);
    print('page1--dispose');
  }
}

class ChildStatefulWidget extends StatefulWidget {
//  当这个 Widget 首次插入到树中时,框架会调用其 createState 函数以创建一个新的_ChildStatefulWidgetState实例来与该树中的相应位置关联
//  当这个widget的父级重建时,父级将创建一个新的ChildStatefulWidget实例,但是Flutter框架将重用已经在树中的_ChildStatefulWidgetState实例,
//  而不是再次调用createState创建一个新的State。
  @override
  _ChildStatefulWidgetState createState() {
    print("child--createState");
    return _ChildStatefulWidgetState();
  }
}

class _ChildStatefulWidgetState extends State<ChildStatefulWidget> {
  String title = "点击我";

  @override
  Widget build(BuildContext context) {
    print('child--build');
    return GestureDetector(
      child: new Text(title ?? ""),
      onTap: () {
        setState(() {
          title = "我变化了";
        });
      },
    );
  }

  @override
  void initState() {
    print('child--initState');
    super.initState();
  }

  @override
  void didChangeDependencies() {
    print('child--didChangeDependencies');
    super.didChangeDependencies();
  }

  @override
  void didUpdateWidget(ChildStatefulWidget oldWidget) {
    print('child--didUpdateWidget');
    super.didUpdateWidget(oldWidget);
  }

  @override
  void reassemble() {
    print('child--reassemble');
    super.reassemble();
  }

  @override
  void deactivate() {
    print('child--deactivate');
    super.deactivate();
  }

  @override
  void dispose() {
    print('child--dispose');
    super.dispose();
    //WidgetsBinding.instance.addObserver(this);
  }
}

class LifeCyclePage2 extends StatefulWidget {
  @override
  _LifeCyclePageState createState(){
    return new _LifeCyclePageState();
  }

  @override
  StatefulElement createElement() {
    // TODO: implement createElement
//    print("page2--createElement");
    return super.createElement();
  }
}

class _LifeCyclePageState extends State<LifeCyclePage2> with WidgetsBindingObserver {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print('page2---initState');
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    print(state.toString());
  }

  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
    print('page2---didChangeDependencies');
  }

  @override
  void didUpdateWidget(LifeCyclePage2 oldWidget) {
    // TODO: implement didUpdateWidget
    super.didUpdateWidget(oldWidget);
    print('page2---didUpdateWidget');
  }

  @override
  Widget build(BuildContext context) {
    print('page2---build');
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text("生命周期示例2"),
      ),
    );
  }

  @override
  void reassemble() {
    // TODO: implement reassemble
    super.reassemble();
    print('page2---reassemble');
  }

  @override
  void deactivate() {
    // TODO: implement deactivate
    super.deactivate();
    print('page2---deactivate');
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    //WidgetsBinding.instance.addObserver(this);
    print('page2---dispose');
  }
}


进入页面1:
I/flutter (26059): page1–initState
I/flutter (26059): page1–didChangeDependencies
I/flutter (26059): page1–build
I/flutter (26059): child–createState
I/flutter (26059): child–initState
I/flutter (26059): child–didChangeDependencies
I/flutter (26059): child–build

点击 第一个”点击我”: setState
I/flutter (26059): page1–build
I/flutter (26059): child–didUpdateWidget
I/flutter (26059): child–build

点击 第二个”点击我”:
I/flutter (26059): child–build

跳转页面2:
I/flutter (26059): page2—initState
I/flutter (26059): page2—didChangeDependencies
I/flutter (26059): page2—build

返回页面1:
I/flutter (26059): page2—deactivate
I/flutter (26059): page2—dispose

退出页面1:
I/flutter (26059): page1–deactivate
I/flutter (26059): child–deactivate
I/flutter (26059): child–dispose
I/flutter (26059): page1–dispose

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://0291.com.cn/post/56386.html

相关文章

市场营销基础知识点(三)

市场营销基础知识点(三)

45,产品生命周期 产品开发期。开发期是指企业找到新产品构思并进行研究开发的时期。在产品开发过程中,销售为零,并且需要投入大量的资金。 介绍期。介绍期是指新产品被引入,销售缓慢增长的时期。在这一时期,由于新产品引入市场需要巨额的和销售费用...

我来教你专题页面的seo优化工作应该怎么做。

我来教你专题页面的seo优化工作应该怎么做。

不同企业对网站的需求也不一样,我们有时候会为了一些突发或者特别的事情做一个专题,那么针对这些专题页面我们该如何进行优化比较好呢?别着急,今天小编就为大家针对这个问题分享相关的内容吧。 1.专题页面制作,可以参考一些游戏网站的专题页面,可以将游戏网站的专题页分析研究一下,看这类专题...

提升招聘质量第二步:渠道管理

提升招聘质量第二步:渠道管理

一名优秀的招聘人员一定是善于借助各种资源来交付自己的招聘任务的。他懂得面对什么样的岗位,采用什么样的打法去排兵布阵能够最快地找到合适的人选。 近期我刚做完我们公司一季度招聘渠道的使用效果分析,首先来和大家分享一下我统计的结果。补充一下大背景是:我们公司是一家物流供应链背...

【市场营销论文】A建筑公司市场营销策略优化研究

【市场营销论文】A建筑公司市场营销策略优化研究

本文来源:996论文网 摘要 党的十九大以来,国家进入高质量发展新时代,全新的发展环境给建筑业带来了深刻影响。高质量发展驱动新需求,建筑业细分不断分化升级,从满足低端需要向满足中端高端需要转变。建筑业供给侧呈现众多新趋势,新基建作为新结构性力量出现,建筑企业要在构建产业新...

今日头条推广优势有哪些?具体效果怎么样?

哈喽,大家好,今天媒介盒子小编又来跟大家分享软文的了,本篇分享的主要是:今日头条推广优势有哪些?具体效果怎么样?  近年来科技快速发展,人们获取信息从以前简单的从报纸获取,到现在从手机电脑获取新闻、视频、照片等相关最新咨询。而作为最大新闻咨讯平台,头条拥有巨大的内容价值和潜...

为什么别人的钱能生钱,而我的就不行?!

为什么别人的钱能生钱,而我的就不行?!

人这一辈子都在和钱打交道。小时候要费劲巴拉的攒钱买零食买玩具,成年后要做理财做投资,往财务自由的终极目标前进。但是钱生钱可不是一件简单的事,大家都说“你不理财,财不理你”。然而越来越多的人发现,你去理财,财有的时候也不理你。老是看着别人眼馋,自己投进去的却没砸出几点水星,很...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片