我只想在用户第一次打开应用程序时显示入职屏幕,所以在入职屏幕的最后一页,我将OnBoardingStatus value设置为"Done“并移动到主屏幕。但是,当用户下一次打开应用程序时,此代码会使入职屏幕闪烁几毫秒,然后打开mainScreen。
以下是我的代码
class App2 extends StatefulWidget {
App2({Key key}) : super(key: key);
@override
_App2State createState() => _App2State();
}
class _App2State extends State<App2> {
String onBoardingStatus;
@override
void initState() {
// TODO: implement initState
getOnBoardingStatus();
super.initState();
}
Future<void> getOnBoardingStatus() async {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences prefs = await SharedPreferences.getInstance();
var onboardingstatus = prefs.getString('OnBoardingStatus');
setState(() {
onBoardingStatus = onboardingstatus;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: onBoardingStatus != null
? MainScreen()
: OnboardingScreen());
}
}发布于 2020-04-16 21:31:34
目前,您无法知道onBoardingStatus是否为null,因为尚未检索到SharedPreferences实例,或者因为OnBoardingStatus确实为空。您可以使用FutureBuilder解决此问题
class App2 extends StatelessWidget {
App2({Key key}) : super(key: key);
Future<String> getOnBoardingStatus() async =>
(await SharedPreferences.getInstance()).getString('OnBoardingStatus');
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: getOnBoardingStatus(),
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
//TODO: Return a widget that indicates loading
}
return Scaffold(
body: snapshot.data != null
? MainScreen()
: OnboardingScreen());
},
);
}
}然而,我不认为这是最好的解决方案。对于初学者来说,App2应该从外部获取状态-这样,如果你决定改变你的存储解决方案,你就不需要接触App2了。
https://stackoverflow.com/questions/61250468
复制相似问题