flutter - 即使在使用 setState() 后返回屏幕时 ListView 不重建?
问题描述
我有一个根据文件夹中文件数填充的列表。在应用程序启动时,它会按预期正确地构建我的列表。
但是在新的笔记屏幕上,用户可以选择在这个文件夹中保存笔记。当我回到这个屏幕时,列表不会根据添加的这个新文件重建。当我关闭应用程序并重新启动时,该文件显示在我的列表中。
遵循此答案:是否可以使用 navigator.pop 刷新或重新加载页面...例如第 1 (nav.push=>2) 页到第 2 页并从第 2 (nav.pop, value) 页返回到第 1 页?我使用.then()
并Navigator.push
重建了我的列表,setState()
但它仍然没有更新。
我究竟做错了什么?下面是我的代码:
class _HomeListViewState extends State<HomeListView> {
Directory easyDir;
var txtList;
@override
void initState(){
super.initState();
easyDir = Directory(widget.folderPath);
buildTxtList();
}
void buildTxtList(){
//list of paths of my txt files in the folder
txtList = easyDir
.listSync()
.map((item) => item.path)
.where((item) => item.endsWith(".txt"))
.toList();
}
@override
Widget build(BuildContext context) {
print(txtList.length);
return ListView.builder(
itemCount: txtList.length,
padding: EdgeInsets.all(10.0),
itemBuilder: (context, index){
File file = new File(txtList[index]);
String name = file.path.split('/').last;
return Card(
color: (index % 2 == 0) ? Colors.grey.shade300 : Colors.white,
shadowColor: Colors.teal,
elevation: 7.0,
child: ListTile(
leading: Icon(Icons.assignment),
title: Text(name),
trailing: Icon(Icons.keyboard_arrow_right),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => NoteEditScreen(
txtPath: file.path,
),
),
).then((value) {
setState(() {
buildTxtList();
});
});
},
onLongPress: () => print('list tile long pressed'),
),
);
},
);
}
}
解决方案
实现此目的的一种方法是向NoteEditScreen()传递一个函数,该函数将在主屏幕中触发回调以重建它(我们已经可以使用buildTxtList函数或仅为它创建一个新函数)
void buildTxtList() {
txtList = easyDir
.listSync()
.map((item) => item.path)
.where((item) => item.endsWith(".txt"))
.toList();
setState(() {}); // To rebuild the Widget
}
然后传下去
Navigator.push(
context,
MaterialPageRoute(builder: (context) =>
NoteEditScreen(onPressed: buildTxtList),
),
);
然后在NoteEditScreen中,首先声明属性,最后在AppBar 中调用它。
注意:您不必调用 AppBar 的前导属性中的函数,您可以在他们完成将注释保存在文件夹中时调用它。
final Function onPressed;
NoteEditScreen({this.onPressed});
appBar: AppBar(
title: Text("Screen 2"),
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
onPressed();
Navigator.pop(context);
}
)
),
注意:您绝对应该看看这两个谈论使用setState(() {})
Empty set state 的帖子有什么意义?
推荐阅读
- python - 为什么当列具有 NaN 值时我的循环停止?
- angular - Angular生成具有动态对象深度的模板
- python - 如何在同一行上获取两个输入
- java - 通过 SSH 命令执行远程脚本:如何知道它是否正确完成
- c - 符合 HID 标准的触摸屏数据包数据结构
- build - 如何解决 docusaurus 构建时出现的错误
- javascript - 在 Linux 电子桌面应用程序的同一 MainController.js 文件中分离电子对话框
- spring-boot - Spring HATEOAS 未显示挂起函数的绝对 URL
- amazon-web-services - 未配置其他网络接口
- r - 用于估计 R 中的广义帕累托分布参数的函数不起作用