Flutter 如何在小部件构建之前获取共享首选项数据?

Flutter 如何在小部件构建之前获取共享首选项数据?,flutter,sharedpreferences,android-bottomappbar,Flutter,Sharedpreferences,Android Bottomappbar,我有一些带有提示文本和底部导航的文本字段。在第1页的文本字段中输入的文本将在更改后保存到共享首选项中 当我再次单击第2页下一页的底部导航并返回到第1页时,它看起来像是小部件重建,并将在小部件上显示共享首选项存储数据之前显示hintText 我试图在initState期间获取SharedReference数据,但它不起作用。我也尝试过使用future builder,但是当我在TextField中键入值时,该值不是很平滑,有时文本会在前后字符之间闪烁。我不确定我应该使用哪种方法,或者我的编码是否错

我有一些带有提示文本和底部导航的文本字段。在第1页的文本字段中输入的文本将在更改后保存到共享首选项中

当我再次单击第2页下一页的底部导航并返回到第1页时,它看起来像是小部件重建,并将在小部件上显示共享首选项存储数据之前显示hintText

我试图在initState期间获取SharedReference数据,但它不起作用。我也尝试过使用future builder,但是当我在TextField中键入值时,该值不是很平滑,有时文本会在前后字符之间闪烁。我不确定我应该使用哪种方法,或者我的编码是否错误

有人能告诉我应该用哪种方法吗

提前谢谢

login.dart

  @override
  Widget build(BuildContext context){

    return new Scaffold(
        appBar: new AppBar(
          title: Text('Login Page'),
        ),

        body: bottomNav[currentBottomNavIndex],

        bottomNavigationBar: BottomNavigationBar(
          onTap: onTapped,
          currentIndex: currentBottomNavIndex,
          type: BottomNavigationBarType.fixed,
          items: [
            BottomNavigationBarItem(
              icon: Icon(Icons.home),
              title: Text("Page1"),
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.mail),
              title: Text('Page2'),
            ),
          ],
        ),


    );

  }
第1页省道

class Page1 extends StatefulWidget {

  @override
  State<StatefulWidget> createState() {
    return _Page1State();
  }
}

class _Page1State extends State<Page1> {

  TextEditingController name = TextEditingController();

  String name_str;

  Future<String> getName(String key) async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();

    name_str = prefs.getString(key);

    setState(() {
      name = new TextEditingController(text: name_str);
    });

    return name_str;
  }

  Future<bool> setName(String key, String value) async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();

    return prefs.setString(key, value);
  }

  @override
  void initState() {
    super.initState();
    getName('name');
  }


  @override
  Widget build(BuildContext context) {


   //return FutureBuilder(

        //future: getName('name'),
        //builder: (BuildContext context, AsyncSnapshot<String> snapshot) {

        //      if (snapshot.hasData) {

                return Container(

                    margin: EdgeInsets.all(100.0),
                    width: 185,
                    child: Center(
                        child: TextField(

                          controller: name,
                          textAlign: TextAlign.center,
                          decoration: new InputDecoration(
                            hintText: "Name (Original)",
                          ),

                          onTap:() {
                            name.clear();
                            setName('name', '');

                          },

                          onChanged: (String str) {
                            setState(() {
                              name_str = str;
                              setName('name', str);
                            });
                          },
                        )
                    )
                );
     //         }else{
     //           return Container();
     //         }

     //   }
    //);

  }
}

我认为问题就在这里

setState(() {
  name = new TextEditingController(text: name_str);
});
这样做

新文本编辑控制器文本:name_str

将创建一个新实例,只需使用共享首选项更新name controller的值即可

 setState(() {
      name.text=name_str;
    });

这应该适合你

谢谢。它起作用了。我有多个文本字段,您知道如何将future builder与多个文本字段一起使用吗?您想将future builder用于什么目的?
 setState(() {
      name.text=name_str;
    });