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