flutter 初始化前的共享首选项延迟-扑动

3lxsmp7m  于 2022-12-24  发布在  Flutter
关注(0)|答案(1)|浏览(142)

我正在使用共享首选项保存用户名和登录状态,即使在关闭应用程序后也是如此。我在main. dart中使用的共享首选项很好,因为我在main函数中使用了它,并将其设置为异步,但当我尝试在其他类中使用它时,在加载页面之前,我看到一个暗红色屏幕,持续时间不到一秒,这让我的应用程序变得如此丑陋。我该怎么做才能修复它?
下面是我的代码:

late bool _isEditingText;
TextEditingController _editingController = TextEditingController();
late String initialText ;
SharedPreferences? _prefs;
@override
void initState(){
  super.initState();
  initializePreference().whenComplete((){
    setState(() {});
  });
}

Future<void> initializePreference() async{
  _prefs = await SharedPreferences.getInstance();
  String? name = _prefs?.getString('name');
  if (name == null) {
    _isEditingText = true;
    initialText = 'Enter ur name';
  } else {
    _isEditingText = false;
    initialText = name;
  }
}
    • 更新:**抱歉没有包括我的确切错误...这里是:

第一个月

smdncfj3

smdncfj31#

我认为你在初始化所有小部件之前执行了setState。因此,你可以如下更新initState

void initState(){
  super.initState();
  WidgetsBinding.instance!.addPostFrameCallback((_) async {
    initializePreference().whenComplete((){
      setState(() {});
    });
   });
}

如果它没有导致问题,那么你必须显示加载指示符。就像最初没有数据指示符时,一旦你从setState中的SharedPreference获得数据-你必须删除指示符并加载数据。
您可以使用CircularProgressIndicator来实现这一点。
初始化布尔变量,

var isDataLoad = false;

一旦你在whenComplete()中得到数据,就把它设置为true,然后基于这个变量你就可以声明你的小部件了。

isDataLoad ? Container( // Your widgets where you use "initialText" ) : CircularProgressIndicator();

相关问题