背景信息:
对于我的flutter项目,我正在使用listview.builder
和provider
:ListView.Builder
:使用provider和buttons
获取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);
},
),
);
}
然后... 其中
singleButton()
:它将根据父窗口小部件中的length
运行。@override
Widget build(BuildContext context) {
final singleButtonInfo = Provider.of<mybuttons>(context).buttonIndex[listIndex];
return FlatButton(
child: Text(singleButtonInfo.text),
onTap: (){
changeText(listIndex);
}
);
}
因此,如果
length
为5,则将有5个带有从0到4的索引的平面按钮。使用
onTap
函数,我想更改该特定按钮的文本(即,如果单击了第3个按钮,那么我只想更改第3个按钮而不重建所有按钮)。changeText(int listIndex){
...logic
notifyListeners();
}
这是问题:
我对
notifyListeners()
的理解是,它将使用Provider.of<T>(context)
通知所有内容,并且将重新构建这些小部件(即,将使用新数据重新构建所有5个按钮)。由于每个按钮都有唯一的索引,是否有办法将要重建的特定按钮作为目标,而忽略其余按钮?
谢谢!
最佳答案
首先,请注意,大多数情况下,您要尝试的优化是毫无意义的。
优化重建通常没有什么好处,可能不值得增加额外的复杂性,并且仅在状态以非常频繁的速度变化(例如动画)时才有用。
就是说,您正在寻找的是Selector。
Selector是使用提供程序的自定义方法,与Consumer / Provider.of相对,提供程序可以过滤不需要的更新。
例如,如果小部件仅需要MyModel.text
,则代替:
final model = Provider.of<MyModel>(context);
return Text(model.text);
我们可以像这样使用Selector:
return Selector<MyModel, String>(
selector: (_, model) => model.text,
builder: (_, text, __) {
return Text(text);
}
);
仅当
builder
更改时,此类代码才会再次调用MyModel.text
,而忽略其他任何更改。