class MoreWorkBean extends ChangeNotifier {
///
String buttonName = "查看更多";
void setButtonName(String _name) {
this.buttonName = _name;
notifyListeners();
}
///
String buttonUpdateLabel = "刷新作品";
void setButtonUpdateLabel(String _label) {
this.buttonUpdateLabel = _label;
notifyListeners();
}
}
ChangeNotifierProvider<MoreWorkBean>.value(
value: _bean,
child: Row(
children: [
FlatButton(
onPressed: () {
_bean.setButtonUpdateLabel("刷新") ;
},
child: Consumer<MoreWorkBean>(
builder: (BuildContext context, MoreWorkBean value, Widget child) {
print('触发标签');
return Text(value.buttonUpdateLabel);
},
)),
FlatButton(
onPressed: () {
OneContext().pushNamed(
"MoreWork",
arguments: {"name": "余雄英", "bean": _bean},
).then((value) => print('value ${value}'));
},
child: Consumer<MoreWorkBean>(
builder: (BuildContext context, MoreWorkBean value, Widget child) {
print('触发名字');
return Text(value.buttonName);
},
),
)
],
)
这个时候点击刷新按钮后, 会在控制台打印 ‘触发标签’ 和 ‘触发名字’ , 但其实仅仅只有刷新按钮被触发, 不需要更改名字, 这时候需要用到 Selector
关于Selector的介绍
https://pub.dev/documentation/provider/latest/provider/Selector-class.html
需要Tuple配合使用
https://pub.dev/packages/tuple/install
我们将触发名字的Consumer 更换成Selector的写法后, 点击刷新就不会更改名字了.
Selector<MoreWorkBean, Tuple2<String, String>>(selector: (context, bean) {
return Tuple2(bean.buttonName, bean.buttonName);
}, builder: (BuildContext context, value, Widget child) {
print('触发名字');
return Text(value.item1);
}),
网友评论