先去创建一个 InheritedWidget .. 添加一个类 .. 名字可以是 CounterProvider .. 让它继承一下 .. InheritedWidget ..
这个类里面可以设置一下需要的数据 .. 这些数据都必须是 final 的 .. 就是一但有了值就不能改变了 .. final int count .. 再添加一个 final VoidCallback increaseCount ..
这个小部件里面还需要一个 child .. 类型是 Widget .. 名字叫 child ..
下面添加一个构造函数 .. CounterProvider .. 里面添加一个 this.count .. this.increaseCount .. 还有一个 this.child .. 后面用一个 super,执行一下 superclass 的构造函数 .. 提供一个 child ,对应的值是 child ..
在使用这个 CounterProvider 的时候,我们需要给它提供 count,increaseCount 还有一个 child ..
下面可以再去添加一个静态的方法,用它可以得到这个小部件里的 State .. 就是数据 .. 这里数据指的就是 count 还有 increaseCount ..
static CounterProvider .. 方法的名字叫 of .. 接收一个 BuildContext 类型的 context 参数 .. 方法 return 的是 context.inheritFromWidgetOfExactType .. 类型是 CounterProvider .. 这样我们就可以在其它小部件里面使用这个小部件的 of 方法,得到它里面的 state ..
下面还需要覆盖一个方法 .. 名字是 updateShouldNotify .. 先让这个方法直接 return true .. 它决定了是否通知继承了这个小部件的小部件 .. 当这个小部件重建以后,有时候我们需要去重建继承了这个小部件的小部件,有时候不需要重建 .. 比如这个小部件的数据跟这个 oldWidget 里的数据一样的时候就不需要重建 ..
插入到小部件树
有了这个 InheritedWidget 以后,我们得把它放在小部件树的某个地方 ... 这里我们要把它放在 StateManagementDemo 小部件里面 .. 在它的 Scaffold 外面,包装一个新的小部件 .. 名字就是刚才我们创建的 CounterProvider ..
这个小部件需要一个 count ... 对应的值是 _count .. 还有需要一个 increaseCount .. 对应的值是 _increaseCount ..
这样在这个小部件树下面的所有的小部件,都可以直接得到这个 count 还有 increaseCount ..
获取数据
因为 CounterWrapper 不需要 count 还有 increaseCount ,可以从这个小部件里面去掉这些东西 ..
在这里用的 Counter 也不需要参数了,因为我们现在可以通过 CounterProvider 这个 InheritedWidget 得到这些数据 .. 去掉它们 ..
需要数据的是 Counter 小部件 .. 去掉它的构造函数 .. 把这个 count 还有 increaseCount 放到 build 方法里面 .. 直接设置一下它们的值 .. 这个 count 的值是 CounterProvider 用一下 of 这个静态方法 .. 给它提供一个 context .. 然后直接访问一下它里面的 count ..
下面这个 increaseCount 的值,是 CounterProvider.of .. context .. 里面的 increaseCount ..
保存一下文件 .. 回到模拟器上试一下 ...
界面上会显示出 _count 的值 .. 按一下这个 ActionChip ... 会执行 _increaseCount .. 它会让 _count 的值加上 1 ...
现在这两个数据是我们在 Coutner 小部件里,直接从 CounterProvider 这个 InheritedWidget 里面获取到的 ...
我们在 StateManagementDemo 里面用了一下这个 CounterProvider ..
这个 CounterWrapper 小部件现在已经没有 count 还有 increaseCount 参数了,所以可以把它们去掉 ..
在使用 CounterProvider 的时候,我们提供了它需要的数据 .. 这些数据可以在它下面的小部件里面直接通过 of 这个静态方法从小部件的 context 里面获取到 ...