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

Flutter项目main.dart初始路由跳转异常:第三判断条件未触发导致无法跳转到LandingPage

问题分析与修复方案

你的第三个条件永远不会执行的核心原因是第二个else if的逻辑表达式恒为true,导致代码永远走不到第三个分支。我们一步步拆解问题:

核心问题拆解

  1. 第二个分支的逻辑错误:
    你的第二个条件写的是:

    else if (token != null || token != "null")
    

    这个表达式永远为true!因为:

    • 如果token是null,那么token != "null"就是true(null和字符串"null"不是一回事)
    • 如果token不是null,那么token != null就是true
      所以只要第一个条件(token == null || token == "null")不满足,第二个分支就会被触发,后面的第三个else if永远不会被执行。
  2. 第三个分支的逻辑漏洞:
    第三个条件里的(token != null || token != "null") && (name != null || name != "null")同样用错了逻辑运算符——应该用&&而不是||,你需要的是同时满足token既不是null也不是"null",name同理,而不是满足其中一个就行。

修复后的代码逻辑

我们重构整个初始路由的判断逻辑,按优先级从高到低处理:

  • 先判断token是否无效 → 跳登录页
  • 再判断用户是否缺少基础信息(名字或地址信息)→ 跳完善信息页
  • 最后判断用户状态是否为inactive/null → 跳LandingPage
  • 以上都不满足 → 默认跳HomePage

修改后的main函数代码如下:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  var token = await Preferences.loadData("token");
  var name = await Preferences.loadData("name");
  var zipCode = await Preferences.loadData("zipCode");
  var city = await Preferences.loadData("city");
  var state = await Preferences.loadData("state");
  var country = await Preferences.loadData("country");
  var status = await Preferences.loadData("status");
  var image = await Preferences.loadData("image");

  print("name -- $name");
  print("zipCode -- $zipCode");
  print("city -- $city");
  print("state -- $state");
  print("country -- $country");
  print("token -- $token");
  print("status -- $status");
  print("image -- $image");

  // 先定义几个辅助布尔值,让逻辑更清晰
  bool isTokenValid = token != null && token != "null";
  bool isNameValid = name != null && name != "null";
  bool hasCompleteAddress = zipCode != null && zipCode != "null" 
      && city != null && city != "null" 
      && state != null && state != "null" 
      && country != null && country != "null";
  bool shouldGoToLanding = status == null || status == "null" || status == "inactive";

  if (!isTokenValid) {
    // 无效token,跳登录页
    initialRoute = LoginPage();
  } else if (!isNameValid || !hasCompleteAddress) {
    // 名字为空 或 地址信息不全,跳完善信息页
    initialRoute = EnterDetails();
  } else if (shouldGoToLanding) {
    // token有效、信息完整,但状态是inactive/null,跳LandingPage
    initialRoute = LandingPage();
  } else {
    // 所有条件都满足,跳主页
    initialRoute = HomePage();
  }

  await Firebase.initializeApp();
  runApp(const MyApp());
}

关键优化点说明

  • 用辅助布尔变量替代复杂的表达式,让代码可读性大幅提升,也更容易排查逻辑问题
  • 把条件按优先级排序,确保每个分支都能被正确触发
  • 修复了逻辑运算符的错误(把错误的||换成&&,确保判断的是"同时满足"而非"任一满足")

这样修改后,当你的token、name、地址信息都有效,但status为"inactive"时,就会正确跳转到LandingPage了。

内容的提问来源于stack exchange,提问作者Deepak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:37:29