【问题标题】:Flutter Dart: how can I change the value of a class property in a list of ClassesFlutter Dart:如何更改类列表中类属性的值
【发布时间】: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 并将其添加到列表中。问题是这似乎效率不高,而且它还会将项目添加到列表的末尾,而我想将它保持在它所在的位置/索引处。

谢谢

【问题讨论】:

    标签: list class flutter dart


    【解决方案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();
      }
    

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 2021-08-20
      • 2020-07-06
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多