我对 Flutter 非常陌生,尤其是 ChangeNotifierProvider。我有很多扩展 ChangeNotifier 的 AModel 实例。这些对象在一个类中,该类包含一个列表 listOfModels。此类还扩展了 ChangeNotifier。这是因为我想在 AModel 中的某些内容发生更改时使用 AModel 重建单个 Widget,并且我想在列表本身发生更改时重建整个 Widgets 树。因此,当我必须重建所有小部件时,我使用以下代码:
Widget getWidget(List<AModel> listOfModels) {
final List<ChangeNotifierProvider<aModel>> rootWidgets = [];
for (var model in listOfModels.where((e) => e.foo == bar)) {
rootWidgets.add(ChangeNotifierProvider(
create: (context) => model,
child: Padding(
padding: EdgeInsets.all(5),
child: Consumer<AModel>(
builder: (context, myModel, child) {
return AStatelessWidget(
internalWidget:
getChildWidget(listOfModels, myModel.id),
id: myModel.id,
name: myModel.name,
onTap: _selectDeselect,
onDelete: _delete,
selected: myModel.selected
);
}))));
}
return Row(children: <Widget>[Container()] + rootWidgets);
}
Widget? getChildWidget(
List<AModel> listOfModels, int? fatherId) {
if (fatherId == null) return null;
var col = Wrap(
direction: Axis.vertical,
children: [],
spacing: 5,
runSpacing: 5,
alignment: WrapAlignment.start);
for (var model in listOfModels.where((e) => e.fatherId == fatherId)) {
col.children.add(ChangeNotifierProvider(
create: (context) => model,
child: Padding(
padding: EdgeInsets.all(5),
child: Consumer<AModel>(
builder: (context, myModel, child) {
return AStatelessWidget(
internalWidget:
getChildWidget(listOfModels, myModel.id),
id: myModel.id,
name: myModel.name,
onTap: _selectDeselect,
onDelete: _delete,
selected: myModel.selected
);
}))));
}
return col.children.length == 0 ? null : col;
}
当我将元素添加到 listOfModels 时,一切似乎都正常。我可以选择和取消选择 AStatelessWidget 仅执行该单个小部件的重建。当我尝试从 listOfModels 中删除一个元素时,问题就来了。由于某种原因,消费者仍然访问旧的 AModel 实例。假设我有这种情况:
我想删除Z5。我希望在 Y2 内只看到两个矩形。Z4 一个,Z6 一个。反而出现了Z5……为什么?谢谢你。