flutter - Flutter 根据首选项数据显示登录或主屏幕
问题描述
我知道很多人都问过这个问题,但我试图处理代码但没有成功。用户登录后,我将使用共享首选项来存储我的电子邮件,一旦注销,该电子邮件就应该被删除。那工作正常。当应用程序启动时,它应该使用共享首选项从手机读取电子邮件,如果电子邮件存在,则用户已登录并应导航到 Home() 屏幕,否则如果电子邮件不存在,则用户未登录等应该导航到 Login() 屏幕。下面是我的代码,当我启动应用程序时,即使用户已注销,它也始终显示 Home() 屏幕。任何人都可以帮助我知道我在哪里做的不对。提前致谢。
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Future<String> getSharedPrefs() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String _email = prefs.getString('email') ?? '';
return _email;
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'chat app',
home: FutureBuilder<String>(
future: getSharedPrefs(),
builder: (
BuildContext context,
AsyncSnapshot<String> snapshot,
) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return const Text('Error');
} else if (snapshot.hasData) {
return Home();
} else {
return Login();
}
} else {
return Text('State: ${snapshot.connectionState}');
}
},
),
);
}
}
解决方案
您的 snapshot.hasData 将始终为真,因为如果电子邮件不存在,您将在getSharedPrefs方法中返回空字符串。
您应该修改它以snapshot.hasData && snapshot.data.isNotEmpty
使其按预期工作。
推荐阅读
- python - 如何使用python并行化sql插入?
- docusignapi - Docusign 信封自定义字段 - 验证
- php - 在php中运行两个标头?
- javascript - 显示更多/显示更少 在 Elemenor 中的某个部分上切换
- python - 转换日期格式保持其类型 python
- python - 循环和抓取金融代码
- ssl - OpenLDAP:连接到 Active Directory 时出错
- java - 在 Spring Boot 应用程序中启动 Eureka 服务器时出错
- python - 查找 2 个元素是否在同一个子列表中
- php - 如何在select php中将从数据库中获取的选项添加到末尾