Flutter:如何从列表视图中删除项目


DBHelper dbHelper = DBHelper();
List<Map<String, dynamic>> lists;
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Map<String, dynamic>>>(
future: dbHelper.selectMemo(userkey, 1),
builder: (context, snapshot){
if(snapshot.hasData){
if(snapshot.data.length != 0){
lists = List<Map<String, dynamic>>.from(snapshot.data);
return ListView.separated(
separatorBuilder: (context, index){
return Divider(
thickness: 0,
);
},
itemCount: lists.length,
itemBuilder: (context, index){
return ListTile(
title: Text(lists[index]["memo"]),
trailing: IconButton(
icon: Icon(Icons.delete),
onPressed: (){
setState(() {
lists = List.from(lists)..removeAt(index);
});
},
),
);
},
);
}
}
},
);
}

这是我的密码。我的列表来自sqlflite。我想从Listview中删除我的项目。但是这个代码不起作用。我不知道我在哪里犯的错。

这种行为是正常的。如果您在build语句中打印一些日志,您会发现每次单击删除按钮(setState(时,Widget都会重新构建。

此外,在每次构建后,列表都会重新分配给DB数据

lists = List<Map<String, dynamic>>.from(snapshot.data);

因此,看起来删除操作不起作用。

如果您看过源代码的Flutter setState部分,就会很好地理解这种现象。

在setState中,首先执行回调,然后标记脏

void setState(VoidCallback fn) {
final dynamic result = fn() as dynamic;
_element.markNeedsBuild();
}

因此,有两种方法可以解决这个问题:

(1( 不要直接更改列表的值,但当按下删除按钮时,可以删除数据库中的数据,这样当Widget再次构建时,从数据库中取出的数据是正确的。

(2( 添加一个标志来判断数据是否初始化,然后在分配列表之前添加一个判断。如果数据已初始化,则不会执行分配操作

我希望它对你有效。^-^

最新更新