所以我正在实现以下类似内容:
class TempProvider extends ChangeNotifier(){
List<Widget> _list = <Widget>[];
List<Widget get list => _list;
int _count = 0;
int get count => _count;
Future<List<Widget>> getList() async{
addToList(Text('$count'));
List _result = await db....
_result.forEach((_item){
addToList(Button(
onTap: () => increment();
child: Text('Press'),
));
});
}
addToList(Widget widget){
_list.add(widget);
notifyListeners();
}
increment(){
_count += 1;
notifyListeners();
}
}
class Parent extends StatelessWidget{
@override
Widget build(BuildContext context) {
return FutureProvider(
create: (context) => TempProvider().getList(),
child: Child(),
);
}
}
class Child extends StatelessWidget{
@override
Widget build(BuildContext context) {
var futureProvider = Provider.of<List<Widget>>(context);
return Container(
child: futureProvider == null
? Text('Loading...'
: ListView.builder(
itemCount: futureProvider.length,
itemBuilder: (BuildContext context, int index){
return futureProvider[index];
}
),
));
}
}
基本上,这是因为Future的Widget列表是ListView Builder的内容,因为它的对象是从数据库查询中生成的。这些小部件是按钮,当按下这些按钮时应更新“计数”值,并应更新显示最新“计数”值的文本小部件。
我能够测试这些按钮,它们似乎可以正常工作,并且正在通过后端增加_count值,但是,即使Provider值已更新,Text Widget上显示的“ Count”也没有更新。
我想就这里的问题向您寻求帮助,据我所知,只要值更改,事情就应该更新,这是Provider反模式,我是否必须重建整个ListView,还是错过了还有其他东西吗?
我仍然让我熟悉此程序包和飞镖/颤振器,希望您能与我分享您的专业知识。预先非常感谢。
答案 0 :(得分:0)
因此,昨晚和今天早上,我进行了大量研究,并进行了大量试验和错误,而我偶然偶然遇到了一个可行的想法!
您只需要将侦听值放在使用者小部件上,以确保它侦听我们已经在小部件树中实现更高的最近提供者。 (考虑到我已经完成了在FutureProvider小部件下方绘制ListView构建器的操作)
Unhandled: Cannot parse privateKey: Unsupported key format
我还重构了我的小部件,并拔出Button作为无状态小部件以供重用。尽管请确保已将引用的Button预订到具有Counter值的同一父提供程序,并且具有onTap属性通过Provider <>。of
调用增量()函数。希望这对以后的所有人都有帮助!