我一直在try 阅读Widget创业公司的首选项,但一直无法找到解决方案. 我希望在TextField(他们可以更改)中显示用户名,并将其存储在Preferences中,以便在他们返回页面时立即显示.

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,
             )
  }
}

I got the idea for using async on initState() from :
flutter timing problems on stateful widget after API call
But the async seems to cause this error on startup :

'package:flutter/src/widgets/framework.dart': Failed assertion: line 967 pos 12: 
'_debugLifecycleState == _StateLifecycle.created': is not true.

我寻找了FutureBuilder的示例,但似乎找不到任何与我正在try 做的事情相似的示例.

推荐答案

我建议不要在initState()上使用异步.但是,您可以用另一种方式来实现这一点,方法是将SharedReference封装在另一个函数中,并将其声明为async.

我已经修改了你的代码.请判断一下这个能不能用.非常感谢.

修改代码:

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相关问答推荐

未处理异常:字符串类型不是值类型子类型的子类型'

Flutter 动画列表一次构建所有项目,而不是仅构建可见的项目

IsScrollable为True时如何删除Flutter 选项卡栏左侧填充

flutter -当使用SingleChildScrollView包装我的列小部件时,它不会填充整个高度

Flutter 应用程序中的Firebase实时数据库中的orderByChild()不适用于我

点击表情符号按钮后,Flutter 文本域文本编辑控制器将文本恢复为原始值

关闭模式,但再次打开时微件条件相同

如何使文本表格域在抖动中变圆?

框中的Flutter 适配图像

在使用FutureProvider时,我想显示用于加载的指示器,但无法自定义大小

集装箱堆放和定位时的高度问题

Flutter 附近的连接

Flutter:如何在现有布局之上显示圆角布局?

有没有办法在没有收缩包装的情况下在列中使用 ListView.Builder?

从子集合sem中获取参考学年&&课程名称的值

将 String 与 List 元素进行比较时出现问题

在 Flutter 中读取 Firebase 数据库数据时遇到问题

Flutter 中父容器顶部的 Gridview 间距额外区域

Flutter如何从左到右连续 Select 多个列表项而不跳过任何

在自动完成中 Select 值后保持键盘焦点