无网络时App未按Token存在逻辑跳转至Home页面问题求助
核心问题定位
断网重启App时,bearerTokenProvider读取本地Token失败,导致bearer为null,进而跳转到登录页。但联网时读取正常,说明Token读取逻辑可能依赖网络状态,或者本地存储的Token读取存在异步时序问题。
具体排查与解决方向
检查
bearerTokenProvider的实现
确认Provider内部是否在读取本地Token时,执行了需要网络的操作(比如附带了Token有效性校验的网络请求)。如果是,断网时校验请求失败会导致返回null,这就违背了“仅判断Token是否存在”的初衷。应修改Provider,让它只负责从本地存储(如SharedPreferences、Hive)读取Token,不做网络校验。确保本地Token读取的可靠性
本地存储的读取应是纯本地操作,不依赖网络。可以直接在navigate方法中替换为原生本地存储读取逻辑做测试,比如:// 示例:用SharedPreferences直接读取 final prefs = await SharedPreferences.getInstance(); final bearer = prefs.getString('bearer_token');如果这样能正常读取到Token,说明问题出在
bearerTokenProvider的实现上。处理异步读取的时序问题
检查SplashScreen的生命周期,确保navigate方法在Widget完全挂载后执行,避免因!mounted提前返回导致跳转逻辑未执行。可以将navigate放在initState的postFrameCallback中:@override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { navigate(); }); }分离Token存在性判断与有效性校验
跳转逻辑只判断Token是否存在,Token的有效性校验(比如过期、失效)放在Home页面完成:进入Home后,若断网则显示无网络弹窗;若联网则发起校验请求,校验失败再跳转登录页。这样既符合预期的跳转逻辑,又能保证Token的有效性。
内容的提问来源于stack exchange,提问作者Aiman

