Flutter依据SharedPreferences判断跳转登录/首页 始终跳转首页问题求助
问题根源
你的代码逻辑冲突点出在空值兜底规则和FutureBuilder的判断条件不匹配:
getSharedPrefs()方法中,你用?? ''对取不到邮箱的场景做了兜底,返回空字符串。这意味着该方法永远不会返回null,返回值永远是合法的String类型(要么是存储的邮箱,要么是空串)。snapshot.hasData的判断规则为只要异步返回结果不是null就返回true,所以就算你拿到的是空串,snapshot.hasData也始终为真,自然每次都跳转到Home页面。
修复方案
任选其一即可:
方案1:调整FutureBuilder的判断逻辑
保留现有getSharedPrefs()的实现,只修改判断条件,额外校验字符串非空:
} else if (snapshot.hasData && snapshot.data!.isNotEmpty) { return Home(); } else { return Login(); }
方案2:调整getSharedPrefs()的返回规则
移除空字符串兜底,无邮箱时直接返回null,适配你现有hasData的判断逻辑:
Future<String?> getSharedPrefs() async { SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.getString('email'); }
额外优化建议
不要在FutureBuilder的future参数中直接调用异步方法,否则每次组件重绘都会重新执行一次读取SharedPreferences的逻辑。建议在initState中提前缓存异步结果:
class _MyAppState extends State<MyApp> { // 缓存异步任务 late Future<String?> _emailFuture; Future<String?> getSharedPrefs() async { SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.getString('email'); } @override void initState() { super.initState(); // 初始化时仅执行一次读取 _emailFuture = getSharedPrefs(); } @override Widget build(BuildContext context) { return MaterialApp( title: 'chat app', home: FutureBuilder<String?>( // 传入缓存的异步任务 future: _emailFuture, builder: (context, snapshot) { // 剩余原有builder逻辑保持不变 } ) ); } }
内容的提问来源于stack exchange,提问作者josef
相关产品推荐
相关产品推荐

