微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有嵌套消费者的特定实例的 ChangeNotifierProvider

如何解决具有嵌套消费者的特定实例的 ChangeNotifierProvider

我对 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,selected: myModel.selected
          );
      }))));
}

return col.children.length == 0 ? null : col;
}

当我将元素添加listofModels 时,一切似乎都正常了。我可以选择和取消选择 AStatelessWidget 仅执行该单个小部件的重建。当我尝试从 listofModels 中删除一个元素时,问题就出现了。出于某种原因,消费者仍然访问旧的 AModel 实例。假设我遇到了这种情况:

Image1

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

Image2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。