ste*_*Kim 4 provider dart flutter
背景资料:
对于我的颤振项目,我正在使用listview.builder和provider:
ListView.Builder:buttons使用 provider获取信息并且listen是false。
@override
Widget build(BuildContext context) {
final buttons = Provider.of<mybuttons>(context, listen: false);
return Container(
child: ListView.builder(
itemCount: buttons.length,
itemBuilder: (context, index) {
return singleButton(listIndex: index);
},
),
);
}
Run Code Online (Sandbox Code Playgroud)
然后... where, singleButton(): 这将根据length来自父小部件的运行。
@override
Widget build(BuildContext context) {
final singleButtonInfo = Provider.of<mybuttons>(context).buttonIndex[listIndex];
return FlatButton(
child: Text(singleButtonInfo.text),
onTap: (){
changeText(listIndex);
}
);
}
Run Code Online (Sandbox Code Playgroud)
因此,如果length是 5,那么将有 5 个扁平按钮,其索引从 0 到 4。
使用该onTap功能,我想更改该特定按钮的文本(即,如果单击了第三个按钮,那么我只想更改第三个按钮而不重建所有按钮)。
changeText(int listIndex){
...logic
notifyListeners();
}
Run Code Online (Sandbox Code Playgroud)
这是问题:
我的理解notifyListeners()是它会通知所有内容,Provider.of<T>(context)并且这些小部件将被重建(即所有 5 个按钮都将使用新数据重建)。
因为每个按钮都有一个唯一的索引,有没有办法定位要重建的特定按钮而忽略其余按钮?
谢谢!
Rém*_*let 11
首先,请注意您尝试进行的优化在大多数情况下是毫无意义的。
优化重建通常没有什么好处,可能不值得增加复杂性,并且只有在状态以非常频繁的速率(如动画)更改时才有用。
也就是说,您正在寻找的是Selector。
Selector是消费提供者的自定义可能,与Consumer / Provider.of 不同,它有一种过滤不需要的更新的方法。
例如,如果小部件只需要MyModel.text,则代替:
final model = Provider.of<MyModel>(context);
return Text(model.text);
Run Code Online (Sandbox Code Playgroud)
我们可以像这样使用Selector:
return Selector<MyModel, String>(
selector: (_, model) => model.text,
builder: (_, text, __) {
return Text(text);
}
);
Run Code Online (Sandbox Code Playgroud)
此类代码仅在更改时才会builder再次调用,并忽略对其他任何内容的更改。MyModel.text
| 归档时间: |
|
| 查看次数: |
5543 次 |
| 最近记录: |