Flutter空检查运算符空值使用异常:请求提供替代解决方案
解决Flutter空检查运算符用于空值的异常
你遇到的异常是因为代码中value.token!的强制解包运算符!被用在了null值上——当value.token为null时,强制解包会直接抛出空指针异常。同时原代码里value.token.toString() != 'null'的判断逻辑冗余且不够严谨。
以下是几种安全的替代实现方案:
方案1:安全访问+明确空判断
class SplashServices { UserPreferences userPreferences = UserPreferences(); void isLogin() { userPreferences.getUser().then((value) { // 先确保value和token都不为null,再判断token非空 if (value != null && value.token != null && value.token!.isNotEmpty) { Timer(const Duration(seconds: 5), () => Get.toNamed(RouteName.homeView)); } else { Timer(const Duration(seconds: 5), () => Get.toNamed(RouteName.loginView)); } }); } }
方案2:空安全链式调用+默认值
class SplashServices { UserPreferences userPreferences = UserPreferences(); void isLogin() { userPreferences.getUser().then((value) { // 使用?.安全访问,配合??提供默认值,简化判断逻辑 if (value?.token?.isNotEmpty ?? false) { Timer(const Duration(seconds: 5), () => Get.toNamed(RouteName.homeView)); } else { Timer(const Duration(seconds: 5), () => Get.toNamed(RouteName.loginView)); } }); } }
方案3:使用async/await提升代码可读性
class SplashServices { UserPreferences userPreferences = UserPreferences(); Future<void> isLogin() async { final user = await userPreferences.getUser(); // 用空安全链式调用简化判断 if (user?.token?.isNotEmpty ?? false) { await Future.delayed(const Duration(seconds: 5)); Get.toNamed(RouteName.homeView); } else { await Future.delayed(const Duration(seconds: 5)); Get.toNamed(RouteName.loginView); } } }
关键优化点:
- 移除强制解包运算符
!,改用?.安全访问成员,彻底避免空值触发异常 - 用直接的空值判断替代冗余的
toString() != 'null',逻辑更严谨高效 - 可选的async/await写法让代码结构更线性,降低后续维护成本
内容的提问来源于stack exchange,提问作者Dilo
相关产品推荐
相关产品推荐

