【问题标题】:Flutter Dismissible Unique KeysFlutter Dismissible 唯一键
【发布时间】:2018-06-23 15:53:47
【问题描述】:

我有一个Dismissible 小部件列表,如下所示:

Dismissible(
            direction: DismissDirection.endToStart,
            key: Key(widget.data[i]),
            onDismissed: (direction) {
              widget.onRemoveRequest(i, widget.data[i]);
            },
            background: Container(
              color: Colors.red,
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisAlignment: MainAxisAlignment.end,
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.only(right: 20.0),
                    child: Text(
                      "Delete",
                      textAlign: TextAlign.right,
                      style: TextStyle(
                        color: Colors.white,
                        fontWeight: FontWeight.w500,
                        fontSize: 16.0,
                      ),
                    ),
                  ),
                ],
              ),
            ),
            child: CustomTextField(
              padding: const EdgeInsets.only(left: 30.0, right: 30.0),
              hintText: widget.newEntryHint,
              text: widget.data[i],
              keyboardType: TextInputType.multiline,
              onChanged: (val) {
                widget.onChanged(i, val);
              },
            ),
          )

它按预期工作,但删除匹配对象时除外。

注意:widget.onRemoveRequest 从源数据widget.data 中删除指定索引处的对象。

widget.dataList&lt;String&gt;。我将这些作为key 提供,但是每当我有两个匹配的字符串并关闭一个时,我都会收到错误,因为Dismissible 没有从树中删除(可以理解)。

A dismissed Dismissible widget is still part of the tree.

那么对于一个字符串列表,即使实际字符串相等/匹配,我如何确保每个都有一个唯一的键?

【问题讨论】:

  • 你是否在没有那个小部件的情况下重建树?
  • 我相信是的。我遍历widget.data(我的字符串)并返回Dismissible 小部件的列表。所以当onDismissed 被调用时,我更新widget.data 并调用setState 来重建。该错误仅在data 字符串匹配时发生,因此我认为是key 是问题所在。

标签: dart key flutter dismissible


【解决方案1】:

您需要为每个数据分配一个唯一标识符。足够独特的东西,不包含任何重复。然后,您可以将该唯一标识符关联到 Key

这不能仅使用StringInt 等原始对象来完成。您需要将数据映射到自定义对象。

下面的类就是一个很好的例子:

class Data {
  final String id;
  final String title;

  Data({this.id, this.title});
}

这将允许您执行以下操作:

Dismissible(
    key: Key(widget.data[i].id),
    ...
)

您可以使用uuid 包或使用自定义算法(例如增量索引)为您的数据生成自定义 ID。

但请确保您的 ID 对于每件商品都是唯一的,并且在该商品的整个生命周期内(即使在更新后)都保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 2018-05-23
    • 1970-01-01
    • 2019-09-10
    • 2018-07-07
    • 1970-01-01
    • 2020-02-11
    相关资源
    最近更新 更多