You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:15:02