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

Flutter开发遇Null无法转Map<String,dynamic>及空校验提示异常如何解决

问题原因

  • 直接使用as Map<String, dynamic>对json.decode(response.body)的结果进行强制非空类型转换,此时extractedData被推导为非空的Map类型,后续对非空变量做== null的判断自然会被IDE提示条件永远为false。
  • 当云端没有任何订单数据时,Firebase Realtime Database请求/orders.json会返回null,json.decode(null)的结果也是null,此时将null强制转换为非空的Map<String, dynamic>就会触发运行时类型不匹配异常。

解决方案

  1. 移除强制非空类型转换,将extractedData声明为可空类型Map<String, dynamic>?
  2. 先校验HTTP请求状态码是否正常,再对extractedData做非空判断,确认非空后再执行业务逻辑
  3. 可对各字段取值增加显式类型转换,避免隐式类型转换导致的潜在异常

修改后的完整代码如下:

Future<void> fetchAndSetOrders() async {
  final url =
      Uri.https('shopapp-63-default-rtdb.firebaseio.com', '/orders.json');

  final response = await http.get(url);
  // 先校验请求状态是否正常
  if (response.statusCode != 200) {
    return;
  }
  final List<OrderItem> loadedOrders = [];
  // 声明为可空类型,不做强制非空转换
  final extractedData = json.decode(response.body) as Map<String, dynamic>?;
  // 此时判空逻辑有效,无IDE提示
  if (extractedData == null) {
    return;
  }

  extractedData.forEach((orderId, orderData) {
    loadedOrders.add(
      OrderItem(
        id: orderId,
        amount: orderData['amount'] as double,
        dateTime: DateTime.parse(orderData['dateTime'] as String),
        products: (orderData['products'] as List<dynamic>)
            .map((item) => CartItem(
                  id: item['id'] as String,
                  title: item['title'] as String,
                  quantity: item['quantity'] as int,
                  price: item['price'] as double,
                ))
            .toList(),
      ),
    );
  });
  // 可选:将新订单放在列表前面,可根据业务需求调整
  _orders = loadedOrders.reversed.toList();
  notifyListeners();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:45:07