我一直在尝试在Widget启动时阅读首选项,但一直无法找到解决方案。我希望在TextField中显示用户名(他们可以更改),并将其存储在首选项中,以便在他们返回页面时立即显示它。
class _MyHomePageState extends State<MyHomePage> { TextEditingController _controller; : : Future<Null> storeName(String name) async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString("name", name); } @override initState() async { super.initState(); SharedPreferences prefs = await SharedPreferences.getInstance(); _controller = new TextEditingController(text: prefs.getString("name")); } @override Widget build(BuildContext context) { : : return new TextField( decoration: new InputDecoration( hintText: "Name (optional)", ), onChanged: (String str) { setState(() { _name = str; storeName(str); }); }, controller: _controller, ) } }
我有在initState()上使用async的想法,来自: API调用后,有状态小部件上的抖动计时问题, 但是async似乎在启动时导致此错误:
'package:flutter/src/widgets/framework.dart': Failed assertion: line 967 pos 12: '_debugLifecycleState == _StateLifecycle.created': is not true.
我在寻找FutureBuilder的示例,但似乎找不到与我尝试执行的操作类似的示例。
我建议不要在initState()上使用异步。但是您可以通过将您的SharedPreferences包装在另一个函数中并将其声明为异步来以不同的方式进行操作。
我已经修改了您的代码。请检查是否可行。非常感谢。
修改后的代码:
class _MyHomePageState extends State<MyHomePage> { TextEditingController _controller; String _name; Future<Null> getSharedPrefs() async { SharedPreferences prefs = await SharedPreferences.getInstance(); _name = prefs.getString("name"); setState(() { _controller = new TextEditingController(text: _name); }); } @override void initState() { super.initState(); _name = ""; getSharedPrefs(); } @override Widget build(BuildContext context) { return new TextField( decoration: new InputDecoration( hintText: "Name (optional)", ), onChanged: (String str) { setState(() { _name = str; storeName(str); }); }, controller: _controller, ); } }
让我知道是否有帮助。谢谢。