背景信息:

对于我的flutter项目,我正在使用listview.builderprovider:
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,而忽略其他任何更改。

07-24 09:44
查看更多