ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
[TOC] ## 概述 <details> <summary>counter.dart</summary> ``` class _CounterWidgetState extends State<CounterWidget> { int _counter = 0; @override void initState() { super.initState(); //初始化状态 _counter = widget.initValue; print("initState"); } @override Widget build(BuildContext context) { print("build"); return Scaffold( body: Center( child: TextButton( child: Text('$_counter'), //点击后计数器自增 onPressed: () => setState( () => ++_counter, ), ), ), ); } @override void didUpdateWidget(CounterWidget oldWidget) { super.didUpdateWidget(oldWidget); print("didUpdateWidget "); } @override void deactivate() { super.deactivate(); print("deactivate"); } @override void dispose() { super.dispose(); print("dispose"); } @override void reassemble() { super.reassemble(); print("reassemble"); } @override void didChangeDependencies() { super.didChangeDependencies(); print("didChangeDependencies"); } } ``` </details> - `initState`:当 widget 第一次插入到 widget 树时会被调用,对于每一个State对象,Flutter 框架只会调用一次该回调,所以,通常在该回调中做一些一次性的操作,如状态初始化、订阅子树的事件通知等 - `didChangeDependencies()`:当State对象的依赖发生变化时会被调用;例如:在之前`build()`中包含了一个`InheritedWidget`,典型的场景是当系统语言 Locale 或应用主题改变时,Flutter 框架会通知 widget 调用此回调 - `build()`:此回调读者现在应该已经相当熟悉了,它主要是用于构建 widget 子树的,会在如下场景被调用: 1. 在调用`initState()`之后。 2. 在调用`didUpdateWidget()`之后。 3. 在调用`setState()`之后。 4. 在调用`didChangeDependencies()`之后。 5. 在State对象从树中一个位置移除后(会调用deactivate)又重新插入到树的其他位置之后 - `reassemble()`:此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。 - `didUpdateWidget ()`:在 widget 重新构建时,Flutter 框架会调用`widget.canUpdate`来检测 widget 树中同一位置的新旧节点,然后决定是否需要更新 - `deactivate()`:当 State 对象从树中被移除时,会调用此回调 - `dispose()`:当 State 对象从树中被永久移除时调用;通常在此回调中释放资源 流程图 ![](https://img.kancloud.cn/5e/b8/5eb8cbaaefc55eb95905273dcf2cff5d_701x869.png)