gpt4 book ai didi

flutter 提供程序 : notifyListeners() to specific target

转载 作者:行者123 更新时间:2023-12-03 02:50:37 26 4
gpt4 key购买 nike

背景信息:

对于我的 flutter 项目,我使用 listview.builderprovider :
ListView.Builder : 获取 buttons信息使用提供者和 listenfalse .

@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功能,我想更改该特定按钮的文本(即,如果单击了第三个按钮,那么我只想更改第三个按钮而不重建所有按钮)。
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更改,并忽略对其他任何内容的更改。

关于 flutter 提供程序 : notifyListeners() to specific target,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59078717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com