20210703setState()与onChange的区别(1) - ziyouzy/2021blog GitHub Wiki
先说onChange,我们来用Container这个Widget来距离:
Container(
color: Colors.white,
height: 50,
child : Radio(
groupValue: _radioValue,
onChanged: _handleRadioValueChange,
value: 1,
),
可以看到他作为变量值传给了Container的命名参数表,
因此可以说onChanged是各个widget共有的内部字段,
这个内部字段的数据类型则是一个函数,onChange的本质是一个函数变量
而对于setState()可以把他描述成:
如果你想在点击按钮的时候做些什么,那么你需要自己设计个包含setState()的自定义函数,
并将这个自定义函数(注意这里指的不是setState()自身)在初始化某个Widget时作为这个Widget的参数表成员
确切的说这个参数表成员的名字时onPressed()的“变量值”
而onChanged()其实是和onPressed()在使用的时候是地位平等的,我们先要搞懂他们两者的区别
再去思考“setState()在动态更新UI这一功能的流程中起到了什么作用
或者说,其实目前我onChange还没有搞懂”
0703今天在学习的过程中发现了一个全新的东西,同时也是和上述内容属于同一类的东西:ChangeNotifier
https://blog.csdn.net/Mr_Tony/article/details/112345491
一起研究才是最好的!
其属于包import 'package:flutter/material.dart'
首先用他来包裹某个“负责让数据发生变化”的自定义逻辑:
class Counter extends ChangeNotifier{
int _count = 0;//数值计算
int get count => _count;
addCount(){
_count++;
notifyListeners();
}
}
Counter _counter = new Counter();
内部(程序员所自定义的派生类,这里是Counter)先实现让数据发生变化的具体方法(如上述 addCount())
需要注意的是,实例化(Counter _counter = new Counter();)的位置是逻辑的最外层,与class平层,也与class MyApp extends StatefulWidget {}以及class _MyAppState extends State {}平层
不过任何情况下都不需要对class MyApp extends StatefulWidget {}操作些什么,这个派生类的的构造与析构以及业务逻辑都会在_MyAppState内部实现:
Counter _counter = new Counter();
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
_counter.addListener(() {
//数值改变的监听
print('YM------>新数值:${_counter.count}');
});
}
@override
void dispose() {
super.dispose();
_counter.dispose();//移除监听
}
}
可以看到这个类的构造函数内存在着_counter.addListener()也就是说:
无论什么原因一旦函数addCount()被执行,那么MyAppState类以及类内部的一切可视化组件都会刷新了
于是乎,ChangeNotifier其实可以理解成一种触发器,重点不是在于数据发生改变,而是在于数据改变后你执行了notifyListeners()
而notifyListeners()与addListener()就好象是我自己之前所设计的ps机制,重点在于只要一个ChangeNotifier的派生类处于可使用状态
就可以让作用域范围内的多个组件都进行“消息订阅(addListener)”,如:
Counter _counter = new Counter();
class _MyAppState1 extends State<MyApp> {
@override
void initState() {
super.initState();
_counter.addListener(() {
//数值改变的监听
print('MyAppState1------>新数值:${_counter.count}');
});
}
}
class _MyAppState2 extends State<MyApp> {
@override
void initState() {
super.initState();
_counter.addListener(() {
//数值改变的监听
print('MyAppState2------>新数值:${_counter.count}');
});
}
}
ChangeNotifier先聊到这,内容有点多,开一篇新文章