Flutter 使用小部件的SharedReferences获取存储的值的正确方法是什么?

Flutter 使用小部件的SharedReferences获取存储的值的正确方法是什么?,flutter,dart,widget,sharedpreferences,Flutter,Dart,Widget,Sharedpreferences,使用小部件的SharedReferences获取存储的值的正确方法是什么 佩加 错误 我猜是因为小部件在调用SharedReference之前先调用了它?正确的写作方法是什么 示例共享首选项 您的问题是简单的SharedReferences需要一些时间来获取保存在其中的值,当它获取值时,构建函数已经被调用,因此它给您一个非空字符串,必须提供给文本小部件。这是一个错误 解决方案: 因此,请尝试初始化您的Srting名称= 或检查 Text( name!=null? name:'', sty

使用小部件的SharedReferences获取存储的值的正确方法是什么

佩加

错误

我猜是因为小部件在调用SharedReference之前先调用了它?正确的写作方法是什么

示例共享首选项


您的问题是简单的SharedReferences需要一些时间来获取保存在其中的值,当它获取值时,构建函数已经被调用,因此它给您一个非空字符串,必须提供给文本小部件。这是一个错误

解决方案: 因此,请尝试初始化您的Srting名称=

或检查

Text(
  name!=null? name:'',
  style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
  ),
每当sharepref准备好使用字符串时,尝试调用setState

 sharepref .then((onValue) {
      setState(() {
        mUserInfo = onValue;
      });
    }
加载SharedPreferences需要一些时间,因此请使用FutureBuilder:


是的,小部件是在name属性出现之前构建的。当SharedReferences数据到达时,使用FutureBuilder或调用setState以使用非空名称属性重建小部件。我应该将setState放在哪里?getUser是调用SharedReferences的函数?
class SampleSharedPreferences {

  static const NAME = "user_name";

  void store(ABC abc) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString(NAME, name);
  }

  Future<ABC> getUser() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    ABC abc = new ABC();
    abc.name = prefs.getString(USER_NAME);
    return abc;
  }
}
Text(
  name!=null? name:'',
  style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
  ),
 sharepref .then((onValue) {
      setState(() {
        mUserInfo = onValue;
      });
    }
@override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Padding(
              child: FutureBuilder(
                future: getUser, // a previously-obtained Future<String> or null
                builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
                  switch (snapshot.connectionState) {
                    case ConnectionState.none:
                      return Text('Press button to start.');
                    case ConnectionState.active:
                    case ConnectionState.waiting:
                      return CircularProgressIndicator();
                    case ConnectionState.done:
                      if (snapshot.hasError)
                        return Text('Error: ${snapshot.error}');
                      return Text(
                        snapshot.data,
                        style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
                      );
                  }
                  return null; // unreachable
                },
              ),
              padding: const EdgeInsets.only(top: 14.0, left: 14.0),
            ),
          ],
        ),
      ),
    );
  }