Flutter:如何在小部件启动时读取首选项?
我一直在尝试在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,
);
}
}
让我知道是否有帮助。谢谢。
以上是 Flutter:如何在小部件启动时读取首选项? 的全部内容, 来源链接: utcz.com/qa/418323.html