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>就会触发运行时类型不匹配异常。
解决方案
- 移除强制非空类型转换,将
extractedData声明为可空类型Map<String, dynamic>? - 先校验HTTP请求状态码是否正常,再对
extractedData做非空判断,确认非空后再执行业务逻辑 - 可对各字段取值增加显式类型转换,避免隐式类型转换导致的潜在异常
修改后的完整代码如下:
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
相关产品推荐
相关产品推荐

