【问题标题】:Unhandled Exception: type 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast未处理的异常:类型“Null”不是类型转换中“Map<String, dynamic>”类型的子类型
【发布时间】:2021-12-16 19:47:25
【问题描述】:
import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;

import './cart.dart';

class OrderItem {
 final String id;
  final double amount;
  final List<CartItem> products;
  final DateTime dateTime;

  OrderItem({
    required this.id,
    required this.amount,
    required this.products,
    required this.dateTime,
  });
}

class Orders with ChangeNotifier {
  List<OrderItem> _orders = [];

  List<OrderItem> get orders {
    return [..._orders];
  }

错误块(当我检查 null 时,vscode 说操作数不能为 null,因此条件始终为 false。此外,我收到一条错误消息,提示 Unhandled Exception: type 'Null' is not a subtype类型转换中的“Map”类型。

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

    final response = await http.get(url);
    final List<OrderItem> loadedOrders = [];
    final extractedData = json.decode(response.body) as Map<String, dynamic>;
    if (extractedData == null) {
      return;
    }

    extractedData.forEach((orderId, orderData) {
      loadedOrders.add(
        OrderItem(
          id: orderId,
          amount: orderData['amount'],
          dateTime: DateTime.parse(orderData['dateTime']),
          products: (orderData['products'] as List<dynamic>)
              .map((item) => CartItem(
                    id: item['id'],
                    title: item['title'],
                    quantity: item['quantity'],
                    price: item['price'],
                  ))
              .toList(),
        ),
      );
    });
    _orders = loadedOrders;
    notifyListeners();
  }

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我认为您正在使用具有 nullsafety 的 Flutter 2.0 +。 因此,您无法检查未明确定义可为空的变量是否为“空”。

    尝试定义

    final response = await http.get(url);
    final extractedData = json.de...
    

    作为

    final response? = await http.get(url);
    final extractedData? = json....
    

    slove 操作数不能为空,所以条件永远为假

    然后你可以使用'??'检查null运算符或您已经在使用的 if 条件。

    我不知道为什么会出现“'Null' 不是 'Map' 类型的子类型”。因为您的 http.get(url) 不应该以任何方式返回“Null”。

    【讨论】:

    • 当我添加这些问号时,它会在我使用“响应”和“提取数据”的地方显示一条红线,并显示最终变量“响应”无法读取,因为它可能在这点。确保在必要的执行时分配它
    • 如果您现在确定您的响应不为 NULL。然后尝试使用“!”访问该变量在末尾。例子。回应!
    • “!”将无效,因为接收器不能为空。尝试删除“!”操作员。我得到的错误
    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2020-08-20
    • 2019-09-26
    • 2021-05-21
    • 1970-01-01
    • 2021-01-17
    • 2021-07-11
    相关资源
    最近更新 更多