我一直试图根据我的共享偏好设置加载不同的页面,但没有成功。
基于stackoverflow中的几个帖子,我最终得到了以下解决方案:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:testing/screens/login.dart';
import 'package:testing/screens/home.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Widget page = Login();
Future getSharedPrefs() async {
String user = Preferences.local.getString('user');
if (user != null) {
print(user);
this.page = Home();
}
}
@override
void initState() {
super.initState();
this.getSharedPrefs();
}
@override
Widget build(BuildContext context) {
return MaterialApp(home: this.page);
}
}
class Preferences {
static SharedPreferences local;
/// Initializes the Shared Preferences and sets the info towards a global variable
static Future init() async {
local = await SharedPreferences.getInstance();
}
}
变量user
不为null,因为print(user)
返回预期值,但login
屏幕始终处于打开状态。
2条答案
按热度按时间ruoxqz4g1#
您的问题是构建方法在getSharedPrefs future完成之前返回。getSharedPrefs在被调用后立即返回,因为它是一个“FireandForget”,而你不等待它。看到你不能在你的initState函数中等待,这是有意义的。
这就是您要使用FutureBuilder小部件的地方。创建一个返回布尔值的Future(如果你想要更多的状态,也可以使用枚举),并使用一个Future构建器作为你的Home子对象来返回正确的小部件。
创造你的未来
如果user为null,则返回true。在Future构建器中使用此Future来监听值更改并做出相应响应。
我运行了这个代码,它工作正常。您应该看到一个蓝屏时,登录是必需的和一个红色的屏幕时,有一个用户存在。取消注解showLoginPage中要测试的行。
bjp0bcyl2#
有一个更干净的方法来做到这一点。假设您有一些路由和一个名为initialized的布尔SharedPreference键。在调用**runApp()方法之前,需要使用WidgetsFlutterBinding.ensureInitialized()**函数。
SharedPreference类代码: