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

Flutter未处理异常:空值上使用空检查运算符问题排查

问题原因及解决方法

你的错误根源是声明的contacts列表变量从未初始化,一直处于null状态,当你执行contacts!.add(...)时,强制解包null值触发了错误,和userPhoneNumber的空值检查无关。

具体问题点

你在函数内声明了List<String>? contacts;,但只是定义了变量类型,没有创建实际的列表实例(比如= [])。即便后续userPhoneNumber不为null,调用add方法时,contacts依然是null,!强制解包就会抛出"Null check operator used on a null value"错误。

修复代码

把列表变量初始化即可,修改如下:

Future<List<String>?> fetchContacts(List<String> contacts) async {
    QueryResult result = await _client().query(
      QueryOptions(
        document: gql(_fetchContacts),
        variables: {
          'contacts': contacts,
        },
      ),
    );
    // 初始化空列表,不再是null
    List<String> fetchedContacts = [];

    if (result.data != null) {
      int status = result.data!['fetchContacts']['status'];
      int resultCount = result.data!['fetchContacts']['users'].length;

      if (status == 200 && resultCount != 0) {
        for (int i = 0; i < resultCount; i++) {
          final userData = result.data!['fetchContacts']['users'][i];
          final phoneNumber = userData['userPhoneNumber'];
          if (phoneNumber != null) {
            fetchedContacts.add(phoneNumber);
            print(phoneNumber);
          }
        }
      }
    }
    // 根据需求返回:空列表时返回null,或直接返回空列表
    return fetchedContacts.isEmpty ? null : fetchedContacts;
  }

额外优化建议

  • 避免变量名冲突:把内部列表变量改名(比如fetchedContacts),和函数参数的contacts区分开,减少混淆
  • 提取临时变量:把嵌套的result.data!['fetchContacts']['users'][i]提取成userData,提升代码可读性,避免重复取值

内容的提问来源于stack exchange,提问作者Sumchans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:24:50