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

回到顶部