Flutter 嵌套提供程序的notifyListeners()未更新UI

Flutter 嵌套提供程序的notifyListeners()未更新UI,flutter,Flutter,我用的是颤振包 我有一个主列表,主列表的每一项都有一个子列表。我可以将项目添加到主列表中,但每次向子列表中添加内容时,UI都不会得到更新。运行代码,添加一些项目并打开它们,然后在那里添加一些项目(这是子列表),您将看到不会看到任何更新,但如果最小化键盘,UI将得到更新。可能是因为我正在使用Provider.of(context)访问子列表的对象,CityName类的notifyListeners()无法运行findById(id)这就是我能想到的 导入“包装:颤振/材料.省道”; 导入“包:pr

我用的是颤振包

我有一个主列表,主列表的每一项都有一个子列表。我可以将项目添加到主列表中,但每次向子列表中添加内容时,UI都不会得到更新。运行代码,添加一些项目并打开它们,然后在那里添加一些项目(这是子列表),您将看到不会看到任何更新,但如果最小化键盘,UI将得到更新。可能是因为我正在使用
Provider.of(context)
访问子列表的对象,
CityName
类的
notifyListeners()
无法运行
findById(id)
这就是我能想到的

导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
回程多供应商(
供应商:[
ChangeNotifierProvider.value(
值:集合(),
),
ChangeNotifierProvider.value(
值:CityName(),
)
],
孩子:MaterialApp(
主页:MyHomePage(),
),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
最终_textEditingController=textEditingController();
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
扩大(
子:ListView(
子项:提供程序(上下文)
.cityNameCollection
.map((集合){
返回收款卡(collection.title、collection.id);
}).toList()),
),
容器(
孩子:排(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
扩大(
孩子:TextField(
控制器:_textededitingcontroller,
自动对焦:对,
),
),
扁平按钮(
已按下:(){
提供者(上下文)
.addCollection(_textEditingController.text);
_textEditingController.clear();
},
子:文本(
“添加”,
),
),
],
),
),
]),
);
}
}
类CollectionCard扩展了无状态小部件{
最后的字符串标题;
最终字符串id;
收款卡(此.title,此.id);
@凌驾
小部件构建(构建上下文){
返回手势检测器(
孩子:卡片(
孩子:填充(
填充:常量边集。对称(水平:10.0,垂直:20),
子:文本(标题),
),
),
onTap:(){
导航器.of(上下文).push(
材料路线(
生成器:(上下文)=>CityNamesList(id),
),
);
},
);
}
}
类CityNamesList扩展了无状态小部件{
最终字符串id;
城市名称列表(this.id);
最终_textEditingController=textEditingController();
@凌驾
小部件构建(构建上下文){
最终项=Provider.of(context).findById(id);
返回脚手架(
appBar:appBar(
标题:文本(项目名称),
),
正文:专栏(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
扩大(
子:ListView(
子项:item.names.map((名称){
返回列表块(
标题:文本(名称),
尾随:图标按钮(
图标:图标(Icons.delete),
已按下:(){
项目名称(名称);
},
),
);
}).toList()),
),
容器(
孩子:排(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
扩大(
孩子:TextField(
控制器:_textededitingcontroller,
自动对焦:对,
),
),
扁平按钮(
已按下:(){
item.addName(_textEditingController.text);
_textEditingController.clear();
},
子:文本(
“添加”,
),
),
],
),
),
],
),
);
}
}
使用ChangeNotifier的类集合{
列出cityNameCollection=[];
void addCollection(值){
城市名称收藏
.add(CityName(title:value,id:DateTime.now().toString());
notifyListeners();
}
CityName findById(id){
返回cityNameCollection.firstWhere((a)=>a.id==id);
}
}
使用ChangeNotifier类CityName{
字符串标题;
字符串id;
列表名称=[];
CityName({this.title,this.id});
void addName(值){
名称。添加(值);
notifyListeners();
}
void removeName(值){
名称。删除(值);
notifyListeners();
}
}

这里有几个问题

1) 您正在
ChangeNotifierProvider.value
中创建
Collection()
,这可能导致重新创建它(不仅仅是现在,而是在代码中进行一些更改之后)。相反,将
ChangeNotifierProvider
builder
一起使用,这将只创建一次值

2) 您正在为
CityName
使用single
ChangeNotifierProvider
,而可以有多个
CityName