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

Flutter调用Post API存储MongoDB数据时触发空值检查运算符异常

解决Flutter调用Post API时的空值异常问题

问题场景

尝试通过Flutter调用Post API将用户数据存储到MongoDB时,触发以下异常:

E/flutter ( 9199): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Null check operator used on a null value

相关代码:

Future<void> postData() async {
  final url = Uri.parse('http://10.0.2.2:3000/data');

  final data = {
    'username': user!.displayName,
    'email': user!.email,
    'uid': user!.uid,
  };
  final jsonData = jsonEncode(data);

  final response = await http.post(url, body: jsonData, headers: {
    'Content-Type': 'application/json',
  });

  if (response.statusCode == 200) {
    print('Post request successful');
    print(response.body);
  } else {
    print('Error: ${response.statusCode}');
  }
} 

问题原因

异常直接由代码中的user!触发:当user变量为null时,使用!强制解包空值会抛出该异常。说明调用postData()方法时,user尚未完成初始化,或是已变为null状态。

解决方案

  1. 先校验user非空再执行操作
    在方法开头添加空值判断,避免强制解包空值:
Future<void> postData() async {
  // 先校验user是否为空
  if (user == null) {
    print('Error: User instance is null');
    return;
  }

  final url = Uri.parse('http://10.0.2.2:3000/data');

  final data = {
    'username': user!.displayName,
    'email': user!.email,
    'uid': user!.uid,
  };
  final jsonData = jsonEncode(data);

  final response = await http.post(url, body: jsonData, headers: {
    'Content-Type': 'application/json',
  });

  if (response.statusCode == 200) {
    print('Post request successful');
    print(response.body);
  } else {
    print('Error: ${response.statusCode}');
  }
}
  1. 处理user字段可能为空的情况
    如果user非空,但displayName或email可能为null,可以配合空安全访问符?.和默认值避免后续JSON编码错误:
final data = {
  'username': user!.displayName ?? 'Unknown User',
  'email': user!.email ?? 'no-email@example.com',
  'uid': user!.uid,
};
  1. 确保user初始化完成后再调用方法
    检查user的赋值时机,比如在身份验证流程(如Firebase Auth)中,需等待用户登录状态确认后再调用postData()。可以通过监听auth状态变化来实现:
// 示例:Firebase Auth状态监听
FirebaseAuth.instance.authStateChanges().listen((User? currentUser) {
  if (currentUser != null) {
    user = currentUser;
    // 此时调用postData才安全
    postData();
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:45:20