Flutter中Future局部变量返回null,空检查运算符报错排查
问题描述
在Flutter 3.7.7版本中,以下Future函数内的局部变量sp始终返回null,调试时触发_CastError (Null check operator used on a null value)错误。该代码在旧版Flutter中可正常运行,需要修复让此Future正确返回StatusUser枚举值。
相关代码
enum StatusUser { telahMasuk, belumMasuk, berhasilMasuk, gagalMasuk } class MyClass { Future<StatusUser> muatSeting(String? key) async { StatusUser? sp; final data = await getUserData(); try { if (data != null) { final dataToken = jsonDecode( APIUser().decodeJWT(data['token'].toString().split('.')[1])); if (new DateTime.now().millisecondsSinceEpoch - dataToken['tgl_verify'] < 864000) { sp = StatusUser.telahMasuk; } } else { sp = StatusUser.belumMasuk; } } catch (e) { print(e); } return sp!; } }
环境信息
❯ flutter doctor Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 3.7.7, on Ubuntu 22.04.2 LTS 5.19.0-38-generic, locale id_ID.UTF-8) Checking Android licenses is taking an unexpectedly long time...[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3) [✓] Chrome - develop for the web [✓] Linux toolchain - develop for Linux desktop [!] Android Studio (not installed) [✓] VS Code (version 1.76.2) [✓] Connected device (3 available) [✓] HTTP Host Availability
问题分析与修复方案
问题根源
- 分支赋值遗漏:当
data不为null,但时间差判断不满足条件时,sp未被赋值,保持初始null状态。 - 异常分支未处理赋值:若
try块内抛出异常(比如data['token']不存在、JWT解码失败等),sp依然为null,最后用!强制解包触发空检查错误。 - 新版Flutter对空安全的检查更严格,旧版的隐式null容忍机制导致之前代码能运行。
修复代码
给sp设置默认值,完善所有分支的赋值逻辑,确保sp不会为null:
enum StatusUser { telahMasuk, belumMasuk, berhasilMasuk, gagalMasuk } class MyClass { Future<StatusUser> muatSeting(String? key) async { // 初始化默认值,从根源避免null StatusUser sp = StatusUser.belumMasuk; final data = await getUserData(); try { if (data != null) { final token = data['token']; // 先验证token是否存在,避免后续报错 if (token != null) { final tokenPayload = token.toString().split('.')[1]; final dataToken = jsonDecode(APIUser().decodeJWT(tokenPayload)); final tglVerify = dataToken['tgl_verify']; // 验证时间字段有效性 if (tglVerify != null) { final currentTime = DateTime.now().millisecondsSinceEpoch; if (currentTime - tglVerify < 864000) { sp = StatusUser.telahMasuk; } } } } } catch (e) { print(e); // 异常时明确设置状态 sp = StatusUser.gagalMasuk; } // 无需强制解包,直接返回 return sp; } }
修复说明
- 初始化
sp时直接赋值默认值StatusUser.belumMasuk,彻底避免null。 - 增加对
data['token']和dataToken['tgl_verify']的空判断,减少异常触发概率。 - 异常捕获后给
sp赋值StatusUser.gagalMasuk,明确异常状态。 - 移除
!强制解包操作,符合空安全规范。
内容的提问来源于stack exchange,提问作者pras
相关产品推荐
相关产品推荐

