Flutter 颤振+;SharedReferences:生成函数返回null

Flutter 颤振+;SharedReferences:生成函数返回null,flutter,sharedpreferences,flutter-futurebuilder,Flutter,Sharedpreferences,Flutter Futurebuilder,我正在尝试访问SharedReferences并创建一个名为“first_run”的永久文件 在应用程序的第一次启动时,它应该返回“true”,然后将其更改为false 我声明了一个未来函数,它根据这个函数返回true或false 现在我得到了一个Wrapper()小部件,它显示加载,主屏幕()或登录屏幕() 基于未来函数的结果 为什么构建函数返回null? 如何避免更新应用程序时删除“第一次运行” 代码如下: 导入“包装:颤振/材料.省道”; 导入“包:firebase_auth/fireb

我正在尝试访问SharedReferences并创建一个名为“first_run”的永久文件

在应用程序的第一次启动时,它应该返回“true”,然后将其更改为false

我声明了一个未来函数,它根据这个函数返回true或false

现在我得到了一个Wrapper()小部件,它显示加载,主屏幕()或登录屏幕() 基于未来函数的结果

为什么构建函数返回null? 如何避免更新应用程序时删除“第一次运行”

代码如下:

导入“包装:颤振/材料.省道”;
导入“包:firebase_auth/firebase_auth.dart”;
导入“package:shared_preferences/shared_preferences.dart”;
导入“../screens/home_screen.dart”;
导入“../screens/login_screen.dart”;
导入“../providers/auth_provider.dart”;
类包装器扩展了StatefulWidget{
@凌驾
_WrapperState createState()=>\u WrapperState();
}
类_包装器状态扩展状态{
FirebaseAuth auth=FirebaseAuth.instance;
@凌驾
void initState(){
AuthProvider().isUserLoggedIn();
super.initState();
}
@凌驾
小部件构建(构建上下文){
未来建设者(
future:hasAlreadyStarted(),
生成器:(上下文,快照){
如果(snapshot.hasData==true){
返回LoginScreen();
}否则{
返回循环预测器(
背景颜色:Colors.deepOrange,
);
}
},
);
}
Future hasAlreadyStarted()异步{
SharedReferences prefs=等待SharedReferences.getInstance();
if(prefs.getBool(“首次运行”)==true){
prefs.setBool(“第一次运行”,false);
返回true;
}否则{
返回false;
}
}

}
您需要
返回
关键字

@override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: hasAlreadyStarted(),
      builder: (context, snapshot) {
        if (snapshot.hasData == true) {
          return LoginScreen();
        } else {
          return CircularProgressIndicator(
            backgroundColor: Colors.deepOrange,
          );
        }
      },
    );
  }

除了您需要一个
返回值
(另一个答案已经指出),您也不应该每次调用构建方法时都产生一个新的未来

 Future<bool> _yourFuture;

 @override
  void initState() {
    AuthProvider().isUserLoggedIn();

    super.initState();

    _yourFuture = hasAlreadyStarted(); // <= start it once
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _yourFuture, // <= reference it for every build
Future\u你的未来;
@凌驾
void initState(){
AuthProvider().isUserLoggedIn();
super.initState();
_yourFuture=hasAlreadyStarted()//