Flutter Hot Restart后输入框内容为什么总是清空?
大家好,我在用Flutter开发表单页面时遇到个问题:每次修改代码后点击Hot Restart,输入框里的内容就全没了,这很影响调试体验。比如我之前输入的用户名和密码都得重新填,有没有办法保留这些临时数据啊?
我试过把controller放在State里,像这样:_TextEditingController _nameCtrl = TextEditingController(),但重启后还是空的。也检查过initState没做错,难道是Hot Restart会完全重置所有状态吗?
另外,如果用Provider管理全局状态会不会好一点?比如这样:
class FormModel extends ChangeNotifier {
String _username = '';
set username(String val) {
_username = val;
notifyListeners();
}
}
但这样写的话,Hot Restart后数据还是没保存。是不是需要配合什么持久化方案?或者有其他更简单的解决办法?
但如果你确实需要在Hot Restart后保留数据,可以考虑配合一些轻量级的持久化方案。比如用SharedPreferences来存储临时数据,代码大概长这样:
在页面初始化的时候调用loadUsername方法加载上次保存的数据。这样即使Hot Restart了,数据也能从本地存储中恢复。
说实话,平时开发时我也不爱写这么多代码,但这个方案确实能解决问题。如果你觉得太麻烦,也可以考虑只在关键表单字段上加这个逻辑。至于Provider本身,它主要是用来做状态管理的,并不能解决Hot Restart清空状态的问题。
不过有几个办法可以改善调试体验。最简单的就是用Hot Reload而不是Hot Restart,Hot Reload不会重置状态,输入框的内容会保留。如果你只是改了一些UI样式或者非状态相关的代码,记得用Hot Reload就好。
如果一定要用Hot Restart,那就得想办法把数据临时存起来。你可以用一个静态变量来保存输入框的值,比如在你的State类外面定义一个静态Map:
然后在你的TextEditingController初始化时,从这个静态变量里读取之前保存的值:
这样即使Hot Restart了,输入框的内容也会从静态变量里恢复。
至于你说的Provider,它其实也是基于内存的状态管理,Hot Restart后同样会被清空。如果想更进一步,可以用shared_preferences这种轻量级的持久化方案,但对调试来说有点重了,我个人觉得上面的静态变量方法就够用了。
希望这些建议能帮到你,要是还有问题随时交流!