为什么Flutter应用中SQLite数据库的数据仅在重启后才更新
问题原因
- 列表页的
FutureBuilder绑定的获取笔记列表请求仅在页面首次构建时执行一次,从编辑页返回列表页时没有触发重新拉取逻辑,所以展示的依然是旧数据 - 编辑页的新增、修改笔记操作没有等待数据库异步执行完成就触发了页面返回,可能存在数据库操作未完成就回到列表页的问题
修复方案
步骤1:调整编辑页的异步操作逻辑
给新增、修改操作加上await,确保数据库操作完成后再返回列表页,修改后的按钮点击逻辑如下:
_NoteButton((widget.noteMode == NoteMode.Adding ? 'Save note' : 'Edit note'), widget.noteMode == NoteMode.Adding ? Colors.lightBlue : Colors.yellow, () async { if (widget.noteMode == NoteMode.Adding) { final title = _titleController.text; final text = _textController.text; await NoteProvider.insertNote({ 'title': title, 'text': text }); } else if (widget.noteMode == NoteMode.Editing){ await NoteProvider.updateNote({ 'id': widget.note?['id'], 'title': _titleController.text, 'text': _textController.text, }); } Navigator.pop(context); } ),
步骤2:列表页添加返回刷新逻辑
修改列表页跳转编辑页的代码,监听页面返回事件,返回后调用setState触发页面重新构建,重新拉取最新的笔记列表:
onTap: () { Navigator.push( context, MaterialPageRoute(builder: (context) => NotePage(NoteMode.Editing, notes[index])) ).then((_) { // 返回后触发刷新,让FutureBuilder重新执行getNoteList setState(() {}); }); },
新增笔记的入口跳转也需要加上同样的then回调逻辑。
可选优化
可以把NoteProvider.getNoteList()抽成页面State的一个Future类型变量,避免页面其他状态变更导致的不必要重复请求:
// 页面State内定义 late Future<List<Map>> noteListFuture; @override void initState() { super.initState(); noteListFuture = NoteProvider.getNoteList(); } // 刷新时重新赋值 void refreshNotes() { setState(() { noteListFuture = NoteProvider.getNoteList(); }); } // FutureBuilder绑定该变量 future: noteListFuture,
跳转回调里直接调用refreshNotes()即可。
内容的提问来源于stack exchange,提问作者Grimmer
相关产品推荐
相关产品推荐

