Flutter项目main.dart初始路由跳转异常:第三判断条件未触发导致无法跳转到LandingPage
问题分析与修复方案
你的第三个条件永远不会执行的核心原因是第二个else if的逻辑表达式恒为true,导致代码永远走不到第三个分支。我们一步步拆解问题:
核心问题拆解
第二个分支的逻辑错误:
你的第二个条件写的是: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永远不会被执行。
- 如果
第三个分支的逻辑漏洞:
第三个条件里的(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
相关产品推荐
相关产品推荐

