Flutter 编辑列表项

Posted

技术标签:

【中文标题】Flutter 编辑列表项【英文标题】:Flutter Edit List Item 【发布时间】:2018-10-14 08:04:55 【问题描述】:

我的颤振飞镖脚本中有一个问题,这是我的脚本:

List<ReplyTile> replytile = new List<ReplyTile>();

replytile.add(
    new ReplyTile(
        member_photo: "photo",
        member_id: "001",
        date: "01-01-2018",
        member_name: "Denis",
        id: "001",
        text: "hallo.."
    )
);

我的问题是:如何在 id = 001.. 的 List 上编辑项目“member_name”?

【问题讨论】:

您是在问如何通过id 在列表中找到一个元素,然后更改其memeber_name 属性? ReplyTile 是小部件吗?小部件应该是不可变的,因此要更改小部件的属性,您必须重建包含ListView 的小部件。例如通过调用setState @JacobPhillips 是的,这就是我的意思.. @boformer ReplyTile 是一个小部件。 【参考方案1】:

这假定ReplyTile 是一个小部件,如果不是,则不需要setState 调用。

如果您可以保证该项目在列表中,请使用:

final tile = replytile.firstWhere((item) => item.id == '001');
setState(() => tile.member_name = 'New name');

如果未找到该项目,则会引发异常。为了防止这种情况,请使用:

final tile = replytile.firstWhere((item) => item.id == '001', orElse: () => null);
if (tile != null) setState(() => tile.member_name = 'New name');

【讨论】:

如果ReplyTile 是一个小部件,这不是一个好的答案,这是我从问题中怀疑的。 @boformer 如果您对这个问题的评论是正确的,我将保持原样继续前进。 太好了,它对我有用。谢谢【参考方案2】:

下面是使用索引更新单个列表项的代码。您可以简单地为其创建一个扩展函数。

extension ListUpdate<T> on List<T> 
  List<T> update(int pos, T t) 
    List<T> list = [];
    list.add(t);
    replaceRange(pos, pos + 1, list);
    return this;
  

并像下面这样使用它来替换一个项目。

replytile.update(
    5, new ReplyTile(
        member_photo: "photo",
        member_id: "001",
        date: "01-01-2018",
        member_name: "Denis",
        id: "001",
        text: "hallo.."
    )
);

【讨论】:

【参考方案3】:

小部件应该是不可变的(带有最终字段),并且不应由父小部件操作。

通常您不应该存储小部件列表。每当调用 build 方法时,都应该从头开始重建小部件。

相反,将显示的数据存储在具有可变字段的单独数据结构中(例如,创建一个类ReplyTileData)。此数据结构应存储在您的State 类中。

build 方法中,读取数据并使用当前数据实例化您的ReplyTile 小部件。

当你想修改数据时,用setState包围修改代码。这将触发完全重建(再次调用build)。

【讨论】:

【参考方案4】:

假设你有一个类似的列表

List list =[id=11,name=aaaa,id=12,name=bbbb,id=13,name=ccc];

现在您只有将要更新的索引数据 假设

var data =id=12,name=bbbb;
int index = list.indexof(data);

现在更新列表为

list.insert(index,id=12,name=fffffff);

现在输出是

print(list);
// [id=11,name=aaaa,id=12,name=fffffff,id=13,name=ccc];

【讨论】:

这将替换该索引处的元素并移动下面的任何内容。从本质上讲,列表的大小会增长。这是不正确的。 我收到此错误未处理的异常:不支持的操作:只读

以上是关于Flutter 编辑列表项的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何检查列表是不是包含通过项?

滑动列表项以获取更多选项(Flutter)

Flutter:按字符搜索列表

Flutter 动画列表:有条件地添加 ListView 项

Flutter 中的动态嵌套列表项选择

如何使用 bloc flutter 更改单个列表项的状态?