You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:15:37