Flutter热重启后状态丢失怎么办?

设计师明璨 阅读 27

我用Flutter开发时,每次 Hot Restart 都会把页面状态清空,比如表单输入的内容都没了,这调试起来太痛苦了。有没有办法保留状态?

我试过把数据存在 StatefulWidget 的 state 里,但一热重启就重置。是不是得用 Provider 或者 GetX 这类状态管理?不过我只是想临时调试,不想搞那么复杂。

顺便贴个我用 Vue 写的类似逻辑(虽然现在转 Flutter 了,但思路差不多):

<template>
  <input v-model="username" placeholder="输入用户名" />
  <p>当前输入:{{ username }}</p>
</template>

<script>
export default {
  data() {
    return { username: '' }
  }
}
</script>
我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
FSD-爱敏
Hot Restart 本来就是重新启动应用,状态清空是正常的。你要的是 Hot Reload,不是 Hot Restart。

简单说下区别:Hot Reload 是把修改的代码注入到正在运行的 Dart 虚拟机里,状态会保留;Hot Restart 是彻底重启应用,状态当然全没了。

改代码后按 r 是 Hot Reload,按 R 才是 Hot Restart。大部分情况下 Hot Reload 就够了。

但如果你的改动涉及到 initState 这类生命周期方法的修改,Hot Reload 不生效,必须 Hot Restart,这时候状态确实会丢。

有个简单的调试方案,用 SharedPreferences 做临时持久化,几行代码的事:

class _MyFormState extends State {
final _controller = TextEditingController();
final _prefs = SharedPreferences.getInstance();

@override
void initState() {
super.initState();
_loadSavedData();
}

Future _loadSavedData() async {
final prefs = await _prefs;
final saved = prefs.getString('debug_username') ?? '';
_controller.text = saved;
}

Future _saveData(String value) async {
final prefs = await _prefs;
prefs.setString('debug_username', value);
}

@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
controller: _controller,
onChanged: _saveData,
decoration: InputDecoration(hintText: '输入用户名'),
),
Text('当前输入:${_controller.text}'),
],
);
}
}


这样 Hot Restart 后数据还在。调试完把 SharedPreferences 相关代码删掉就行,不用搞 Provider 或者 GetX 那些重的方案。

还有个更省事的办法,用 StateRestoration 属性,但配置稍微麻烦点,调试场景下 SharedPreferences 够用了。
点赞 3
2026-02-28 20:16