Flutter Dart:如何更改类列表中类属性的值

Posted

技术标签:

【中文标题】Flutter Dart:如何更改类列表中类属性的值【英文标题】:Flutter Dart: how can I change the value of a class property in a list of Classes 【发布时间】:2020-01-28 11:42:16 【问题描述】:

您好,当一个类是类列表的一部分时,我无法理解如何管理类的属性

这是我的课程

class BasketItem 
  final String itemDescription;
  final String itemNote;

  BasketItem(
      this.itemDescription,
      this.itemNote);


class AppData 
  static final AppData _appData = new AppData._internal();

  List<BasketItem> basketList = [];
  factory AppData() 
    return _appData;
  
  AppData._internal();


final appData = AppData();

这是我的清单

List<Container> _buildBasketList() 
    return appData.basketList.map((bList) 
      var container = Container(
        child: Builder(
          builder: (context) => Dismissible(
            key: Key(UniqueKey().toString()),
            background: Container(
              margin: EdgeInsets.all(8.0),
              color: kColorAccent,
              child: Align(
                  alignment: Alignment(-0.90, 0.00),
                  child: Icon(Icons.add_comment)),
            ),
            onDismissed: (direction) 
                final newItemToAdd = BasketItem(
                    itemDescription: bList.itemDescription,
                    itemNote: 'xxxxx',);

                appData.basketList.add(newItemToAdd);

                setState(() );
                appData.basketList.remove(bList);

            ,
            child: Stack(...)
          ),
        ),
      );
      return container;
    ).toList();
  

我想执行以下操作:当onDismissed 被执行时,我想将属性itemNote 修改为“xxxxx”。我该怎么做?目前,我删除了已刷过的 BasketItem,并创建了一个新的 BasketItem 并将其添加到列表中。问题是这似乎效率不高,而且它还会将项目添加到列表的末尾,而我想将它保持在它所在的位置/索引处。

谢谢

【问题讨论】:

【参考方案1】:

方法一

BasketItem 中的字段设为非最终字段。所以你可以修改它们。

class BasketItem 
  final String itemDescription;
  /*final*/ String itemNote;

  BasketItem(
      this.itemDescription,
      this.itemNote);

// onDismissed will change itemNote.
....
    onDismissed: (direction) 
                setState(() 
                  bList.itemNote = 'xxxxx';
                );
            ,
...

方法2

内联替换列表内容。不要删除和添加


List<Container> _buildBasketList() 
    return appData.basketList.asMap().map((index, bList) 
      var container = Container(
        child: Builder(
          builder: (context) => Dismissible(
            key: Key(UniqueKey().toString()),
            background: Container(
              margin: EdgeInsets.all(8.0),
              color: kColorAccent,
              child: Align(
                  alignment: Alignment(-0.90, 0.00),
                  child: Icon(Icons.add_comment)),
            ),
            onDismissed: (direction) 
                setState(() 
                  appData.basketList[index] = BasketItem(
                    itemDescription: bList.itemDescription,
                    itemNote: 'xxxxx',);
                );
            ,
            child: Stack(...)
          ),
        ),
      );
      return container;
    ).toList();
  

【讨论】:

以上是关于Flutter Dart:如何更改类列表中类属性的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dart/Flutter 中根据类标签和属性名称抓取数据

Dart中类的getter和setter

如何在 Flutter dart 的列表中的循环内附加数据?

Flutter / Dart / Firebase - 流返回空列表

Flutter Dart - 动态获取类的属性

如何使用 Dart / Flutter 中的列表从列表中删除重复元素?