0

我对 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 实例。假设我有这种情况:

图片1

我想删除Z5。我希望在 Y2 内只看到两个矩形。Z4 一个,Z6 一个。反而出现了Z5……为什么?谢谢你。

图片2

4

0 回答 0