flutter - 从子小部件的 ListView 构建器中删除项目
问题描述
我需要能够从子小部件中删除列表视图中的特定项目。然而,让这件事变得困难的是 ontap() 删除功能是在子小部件中定义的。
如何从孩子更改父小部件的状态?
父列表视图生成器
ListView.builder(
shrinkWrap: true,
physics:
BouncingScrollPhysics(),
itemCount: snapshot
.data.datas.length,
itemBuilder:
(context, index) {
if (snapshot
.data
.datas[index]
.daysToOccurrence >=
0) {
if (_isSearching ==
false) {
return OrganizationList(
id: snapshot
.data
.datas[index]
.id);
} else {
return snapshot
.data
.datas[index]
.id
.toLowerCase()
.contains(
_searchText
.toLowerCase())
? OrganizationList(
id: snapshot
.data
.datas[
index]
.id,
)
: Container();
}
} else {
return Container();
}
}),
OrganizationList 小部件(在子小部件中定义)
Align(
alignment: Alignment.bottomLeft,
child: GestureDetector(
onTap: () async {
setState(() {
_isLoading = true;
});
await _organizationBloc
.delete(widget.id);
setState(() {
_isLoading = false;
});
},
child: Text(
"Delete",
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.black54,
),
),
))
解决方案
找到了解决方案。诀窍是在父窗口小部件中定义一个删除方法,将 ObjectKey() 传递给子窗口小部件,并将 voidCallback 参数传递给子窗口小部件。
voidCallback 将映射到父窗口小部件中的删除方法,您可以从子窗口小部件调用该函数。
父小部件
void _deleteItem(Organization item, List<Organization> organizationList) {
organizationList.remove(item);
setState(() {});
}
更新了 ListViewBuilder
ListView.builder(
key: UniqueKey(),
shrinkWrap: true,
physics:
BouncingScrollPhysics(),
itemCount: snapshot
.data.datas.length,
itemBuilder:
(context, index) {
if (snapshot
.data
.datas[index]
.daysToOccurrence >=
0) {
if (_isSearching ==
false) {
return OrganizationList(
key: ObjectKey(
snapshot.data
.datas[
index]),
onDeleteClicked: () =>
_deleteItem(
snapshot.data.datas[
index], snapshot.data.datas),
id: snapshot
.data
.datas[index]
.id);
} else {
return snapshot
.data
.datas[index]
.id
.toLowerCase()
.contains(
_searchText
.toLowerCase())
? OrganizationList(
id: snapshot
.data
.datas[
index]
.id,
)
: Container();
}
} else {
return Container();
}
}),
然后在具有删除功能的子小部件中,我可以调用它:
widget.onDeleteClicked();
推荐阅读
- wix - 如何使用 WiX 安装程序将“C:/User/public/Abc/HiddenFile.txt”中的文件标记为隐藏?
- javascript - 如何更改数据切换按钮的背景颜色
- python - Python,高阶函数,范围问题,我不能在返回列表之前重置它
- python - pyspark list 迭代到变量
- c++ - Clion `cout` 和 `cin` 组合导致控制台无法正常工作
- authentication - 有没有办法为应用程序提供代理身份验证?
- r - 如何使用 add_global_p (car, gtsummary) 在逻辑回归表中显示 p 值的 3 个有效数字
- scheme - 编写奇数的Scheme过程总和
- javascript - 异步 Nodejs API 延迟第一个请求
- python - Matplotlib:数据神秘偏移