Flutter中StatefulWidget的生命周期

StatefulWidget生命周期

StatefulWidget的生命周期如下表所示:

生命周期方法调用时机执行次数
createState创建State对象前1
constructor创建State对象时1
initState当State 对象插入视图树之后1
didChangeDepandenciesState 对象的依赖关系发生变化后>=1
buildState 改动之后>=1
setState需要刷新 UI 时>=1
didUpdateWidget当 widget 配置发生变化时,如调用 setState 触发>=1
deactivatewidget 不可见时>=1
disposewidget 被永久移除1
实例演示

在这里插入图片描述

参考源码如下:

import 'package:demo/utils/logger.dart';
import 'package:demo/widgets/log_list.dart';
import 'package:flutter/material.dart';

class StatefulWidgetLifeCircle extends StatefulWidget {
  @override
  _StatefulWidgetLifeCircleState createState() {
    CusLogger.logger.i("Old -- createState");
    return _StatefulWidgetLifeCircleState();
  }
}

class _StatefulWidgetLifeCircleState extends State<StatefulWidgetLifeCircle> {
  List<String> messages = [];
  int _counter = 0;
  _StatefulWidgetLifeCircleState() {
    CusLogger.logger.i("Old -- constructor");
  }

  @override
  void initState() {
    super.initState();
    CusLogger.logger.i("Old -- initState");
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    CusLogger.logger.i("Old -- didChangeDependencies");
  }

  @override
  void didUpdateWidget(covariant StatefulWidgetLifeCircle oldWidget) {
    super.didUpdateWidget(oldWidget);
    CusLogger.logger.i("Old -- didChangeDependencies");
  }

  @override
  void deactivate() {
    super.deactivate();
    CusLogger.logger.i("Old -- deactivate");
  }

  @override
  void dispose() {
    super.dispose();
    CusLogger.logger.i("Old -- dispose");
  }

  @override
  void setState(VoidCallback fn) {
    super.setState(fn);
  }

  @override
  Widget build(BuildContext context) {
    CusLogger.logger.i("Old -- build");
    return Scaffold(
        appBar: AppBar(
          title: const Text("StatefulWidget生命周期"),
          actions: [
            Container(
              padding: EdgeInsets.only(right: 12),
              alignment: Alignment.center,
              child: Text("数字: " + _counter.toString()),
            )
          ],
        ),
        body: Flex(
          direction: Axis.vertical,
          children: [
            Flexible(
              flex: 7,
              child: ListView.builder(
                  itemBuilder: (context, index) => Container(
                    padding: EdgeInsets.symmetric(vertical: 4, horizontal: 18),
                        child: LogItem(CusLogger.logger.logs[index], index),
                      ),
                  itemCount: CusLogger.logger.logs.length),
            ),
            Flexible(
                flex: 1,
                child: Wrap(
                  spacing: 12,
                  children: [
                    TextButton(
                        onPressed: () {
                          CusLogger.logger.i("old -- setState +1");
                          setState(() {
                            _counter++;
                          });
                        },
                        child: Text("数字 +1")),
                    TextButton(
                        onPressed: () {
                          CusLogger.logger.i("old -- setState -1");
                          setState(() {
                            _counter--;
                          });
                        },
                        child: Text("数字 -1")),
                    TextButton(
                        onPressed: () {
                          CusLogger.logger.clear();
                          if (mounted) setState(() {});
                        },
                        child: Text("清除日志")),
                    TextButton(
                        onPressed: () {
                          Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) => NewPage()))
                              .then((value) {
                                // 推迟两秒等待New page资源释放完成更新状态
                            Future.delayed(
                                Duration(seconds: 2), () => setState(() {}));
                          });
                        },
                        child: Text("新的页面")),
                  ],
                )),
          ],
        ));
  }
}

class NewPage extends StatefulWidget {
  @override
  _NewPageState createState() {
    CusLogger.logger.i("New -- createState");
    return _NewPageState();
  }
}

class _NewPageState extends State<NewPage> {
  @override
  void didUpdateWidget(covariant NewPage oldWidget) {
    super.didUpdateWidget(oldWidget);
    CusLogger.logger.i("New -- didUpdateWidget");
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    CusLogger.logger.i("New -- didChangeDependencies");
  }

  @override
  void deactivate() {
    super.deactivate();
    CusLogger.logger.i("New -- deactivate");
  }

  @override
  void dispose() {
    super.dispose();
    CusLogger.logger.i("New -- dispose");
  }

  @override
  void initState() {
    super.initState();
    CusLogger.logger.i("New -- initState");
  }


  @override
  Widget build(BuildContext context) {
    CusLogger.logger.i("New -- build");
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: (){
            CusLogger.logger.i("New -- 退出");
            Navigator.pop(context);
          },
        ),
        title: Text("新的页面"),
      ),
      body: LogList(),
    );
  }
}
/// LogList
import 'package:demo/utils/logger.dart';
import 'package:flutter/material.dart';

class LogList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
        itemCount: CusLogger.logger.logs.length,
        itemBuilder: (context, index) => Padding(
            padding: EdgeInsets.symmetric(vertical: 6, horizontal: 16),
            child: LogItem(CusLogger.logger.logs[index], index)));
  }
}

class LogItem extends StatelessWidget{

  final String log;
  final int index;


  LogItem(this.log,this.index);
  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        Container(
          width: 32,
          child: Text("${index +1}"),
        ),
        SizedBox(width: 12,),
        Text(log),
      ],
    );
  }

}
/// logger
class Logger {
  Logger._privateConstructor();
  static final Logger _instance = Logger._privateConstructor();
  static Logger get instance { return _instance;}
  List<String> logs = [];
  i(String message){
    logs.add(message);
  }
  clear(){
    logs.clear();
    logs.add("清除日志");
  }
}

class CusLogger {
  static final logger = Logger.instance;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值