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

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
问题分析与修复方案

问题根源

  1. 分支赋值遗漏:当data不为null,但时间差判断不满足条件时,sp未被赋值,保持初始null状态。
  2. 异常分支未处理赋值:若try块内抛出异常(比如data['token']不存在、JWT解码失败等),sp依然为null,最后用!强制解包触发空检查错误。
  3. 新版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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:30:30