Flutter + SharedPreferences:构建函数返回 null
Flutter + SharedPreferences: a build function returned null
我正在尝试访问 SharedPreferences 并创建一个名为“first_run”的永久文件。
在第一次启动应用程序时,它应该return“true”,然后将其更改为 false。
我声明了一个未来的函数,return true 或 false 基于此。
现在我得到了一个 Wrapper() 小部件,它显示正在加载...、HomeScreen() 或 LoginScreen()
基于未来函数的结果。
为什么构建函数 return 为空?
如何避免在更新应用程序时删除“first_run”?
代码如下:
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../screens/home_screen.dart';
import '../screens/login_screen.dart';
import '../providers/auth_provider.dart';
class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}
class _WrapperState extends State<Wrapper> {
FirebaseAuth auth = FirebaseAuth.instance;
@override
void initState() {
AuthProvider().isUserLoggedIn();
super.initState();
}
@override
Widget build(BuildContext context) {
FutureBuilder(
future: hasAlreadyStarted(),
builder: (context, snapshot) {
if (snapshot.hasData == true) {
return LoginScreen();
} else {
return CircularProgressIndicator(
backgroundColor: Colors.deepOrange,
);
}
},
);
}
Future <bool> hasAlreadyStarted() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
if (prefs.getBool("first_run") == true) {
prefs.setBool("first_run", false);
return true;
} else {
return false;
}
}
}
您需要 return
个关键字
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: hasAlreadyStarted(),
builder: (context, snapshot) {
if (snapshot.hasData == true) {
return LoginScreen();
} else {
return CircularProgressIndicator(
backgroundColor: Colors.deepOrange,
);
}
},
);
}
除了你需要一个 return
之外(另一个答案已经指出),你也不应该在每次调用构建方法时都生成一个新的 Future。
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
我正在尝试访问 SharedPreferences 并创建一个名为“first_run”的永久文件。
在第一次启动应用程序时,它应该return“true”,然后将其更改为 false。
我声明了一个未来的函数,return true 或 false 基于此。
现在我得到了一个 Wrapper() 小部件,它显示正在加载...、HomeScreen() 或 LoginScreen() 基于未来函数的结果。
为什么构建函数 return 为空? 如何避免在更新应用程序时删除“first_run”?
代码如下:
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../screens/home_screen.dart';
import '../screens/login_screen.dart';
import '../providers/auth_provider.dart';
class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}
class _WrapperState extends State<Wrapper> {
FirebaseAuth auth = FirebaseAuth.instance;
@override
void initState() {
AuthProvider().isUserLoggedIn();
super.initState();
}
@override
Widget build(BuildContext context) {
FutureBuilder(
future: hasAlreadyStarted(),
builder: (context, snapshot) {
if (snapshot.hasData == true) {
return LoginScreen();
} else {
return CircularProgressIndicator(
backgroundColor: Colors.deepOrange,
);
}
},
);
}
Future <bool> hasAlreadyStarted() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
if (prefs.getBool("first_run") == true) {
prefs.setBool("first_run", false);
return true;
} else {
return false;
}
}
}
您需要 return
个关键字
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: hasAlreadyStarted(),
builder: (context, snapshot) {
if (snapshot.hasData == true) {
return LoginScreen();
} else {
return CircularProgressIndicator(
backgroundColor: Colors.deepOrange,
);
}
},
);
}
除了你需要一个 return
之外(另一个答案已经指出),你也不应该在每次调用构建方法时都生成一个新的 Future。
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