【问题标题】:E/Flutter Unhandled Exception: type _InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, String>?E/Flutter 未处理异常:类型 _InternalLinkedHashMap<dynamic, dynamic>' 不是类型 'Map<String, String> 的子类型?
【发布时间】:2021-07-11 20:30:05
【问题描述】:

我在 Flutter 的项目中工作,我正在尝试从服务器获取 JSON 响应并将其输出到控制台。显示错误:

Unhandled Exception: type '_InternalLinkedHashMap&lt;dynamic, dynamic&gt;' is not a subtype of type 'Map&lt;String, String&gt;'

我该如何解决这个问题?

错误:

调用 API:

import 'package:http/http.dart' as http;
import 'package:omie/app/data/models/consulta_extrato_model.dart';
import 'package:shared_preferences/shared_preferences.dart';

class ConsultaExtratoApi {
  static Future<List<ConsultaExtratoModel>> getExtrato(String conta,
      String codIntCC, String dataInicial, String dataFinal) async {
    var prefs = await SharedPreferences.getInstance();
    String token = (prefs.getString("tokenclientes") ?? "");
    var extratos;
    var url = "https://XXXXXXXXXXXXXXXXXXXXXXXXX/api/v1/financas/extrato/";

    Map headers = {
      'Content-Type': 'application/json',
      "Authorization": "Bearer $token"
    };
    print("STATUS CONSULTA TOKEN ===>>>: $token");
    Map<String, dynamic> _params = {
      "call": "ListarExtrato",
      "param": [
        {
          "nCodCC": codIntCC,
          "cCodIntCC": codIntCC,
          "dPeriodoInicial": dataInicial,
          "dPeriodoFinal": dataFinal
        }
      ]
    };

    print("STATUS CONSULTA HEADER ===>>>: $headers");
    print("STATUS CONSULTA PARAMS ===>>>: $_params");
    print("STATUS CONSULTA URL ===>>>: $url");

    var _body = json.encode(_params);

    print("STATUS CONSULTA BODY ===>>>: $_body");
    var response = await http.post(url, headers: headers, body: _body);

    // Map<String, dynamic> data = new Map<String, dynamic>.from(json.decode(response.body));

    print("STATUS CONSULTA response ===>>>: $response");
    print("STATUS CONSULTA response body ===>>>: ${response.body}");

    Map mapResponse = jsonDecode(response.body);

    print("STATUS CONSULTA mapResponse ===>>>: $mapResponse");

    if (response.statusCode == 200) {
      extratos = ConsultaExtratoModel.fromJson(mapResponse);
      print("STATUS CONSULTA extratos ===>>>: $extratos");
    }
    return extratos;
  }
}

型号

class ConsultaExtratoModel {
  String call;
  List<Param> param;

  ConsultaExtratoModel({this.call, this.param});

  ConsultaExtratoModel.fromJson(Map<String, dynamic> json) {
    call = json['call'];
    if (json['param'] != null) {
      param = new List<Param>();
      json['param'].forEach((v) {
        param.add(new Param.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['call'] = this.call;
    if (this.param != null) {
      data['param'] = this.param.map((v) => v.toJson()).toList();
    }
    return data;
  }

  String toString(){
    return 'CONSULTA EXTRATO MODEL (call: $call), param: $param';
  }
}

class Param {
  int nCodCC;
  String cCodIntCC;
  String dPeriodoInicial;
  String dPeriodoFinal;

  Param(
      {this.nCodCC, this.cCodIntCC, this.dPeriodoInicial, this.dPeriodoFinal});

  Param.fromJson(Map<String, dynamic> json) {
    nCodCC = json['nCodCC'];
    cCodIntCC = json['cCodIntCC'];
    dPeriodoInicial = json['dPeriodoInicial'];
    dPeriodoFinal = json['dPeriodoFinal'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['nCodCC'] = this.nCodCC;
    data['cCodIntCC'] = this.cCodIntCC;
    data['dPeriodoInicial'] = this.dPeriodoInicial;
    data['dPeriodoFinal'] = this.dPeriodoFinal;
    return data;
  }

  String toString(){
    return 'CONSULTA EXTRATO PARAMS (call: $nCodCC), param: $cCodIntCC, dPeriodoInicial: $dPeriodoInicial, dPeriodoFinal: $dPeriodoFinal';
  }
}

可能是什么原因?

【问题讨论】:

  • 我相信这条线Map mapResponse = jsonDecode(response.body); 可能是问题所在。将其更改为 final mapResponse = Map&lt;String, String&gt;.from(jsonDecode(response.body)); 是否可以正常工作?

标签: json api flutter rest http-post


【解决方案1】:

改变这个:

 var response = await http.post(url, headers: headers, body: _body);

到这里:

 var response = await http.post(url, headers: jsonEnconde(headers), body: jsonEnconde(_body));

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 2020-08-20
    • 2019-08-07
    • 2021-02-11
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2018-09-24
    • 2021-10-06
    相关资源
    最近更新 更多