Flutter三元运算符未按预期工作,登录状态判断异常
问题分析与解决方案
核心问题
你代码里的关键错误是直接在build方法里把Future<bool>和布尔值true做比较。checkIsLoggedIn()是异步函数,返回的是Future<bool>对象,不是直接的布尔值,所以checkIsLoggedIn() == true永远为false,导致页面一直渲染LoginScreen。另外你在initState里调用了checkIsLoggedIn()但没处理返回结果,这部分代码完全没用。
解决方案一:使用FutureBuilder(推荐)
用Flutter提供的FutureBuilder处理异步操作状态,根据异步请求的不同阶段渲染对应页面:
class _HomePageState extends State<HomePage> { Future<bool> checkIsLoggedIn() async { SharedPreferences prefs = await SharedPreferences.getInstance(); var data = prefs.getString('isAuthenticated'); // getString是同步方法,无需await print(data); return data == "true"; // 简化判断逻辑 } @override Widget build(BuildContext context) { return Scaffold( body: FutureBuilder<bool>( future: checkIsLoggedIn(), initialData: false, // 初始状态设为未登录 builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { // 加载中显示加载动画 return const Center(child: CircularProgressIndicator()); } else { return snapshot.data == true ? Profile() : LoginScreen(); } }, ), ); } }
解决方案二:通过State更新登录状态
添加状态变量存储登录状态,在initState里异步获取后更新状态:
class _HomePageState extends State<HomePage> { bool _isLoggedIn = false; @override void initState() { super.initState(); _checkLoginStatus(); } Future<void> _checkLoginStatus() async { SharedPreferences prefs = await SharedPreferences.getInstance(); var data = prefs.getString('isAuthenticated'); print(data); setState(() { _isLoggedIn = data == "true"; }); } @override Widget build(BuildContext context) { return Scaffold( body: _isLoggedIn ? Profile() : LoginScreen(), ); } }
注:这种方法初始化时_isLoggedIn为false,会先显示LoginScreen,异步请求完成后才更新为正确页面,可按需添加过渡加载页面。
内容的提问来源于stack exchange,提问作者swapnil mane
相关产品推荐
相关产品推荐

