未处理的异常:InternalLinkedHashMap <string,dynamic =“”>'不是'List <dynamic>类型的子类型

时间:2019-03-30 09:37:42

标签: dart flutter

我正在尝试从服务器获取JSON响应并将其输出到控制台。

Future<String> login() async {
    var response = await http.get(
        Uri.encodeFull("https://etrans.herokuapp.com/test/2"),
        headers: {"Accept": "application/json"});

    this.setState(() {
      data = json.decode(response.body);
    });


    print(data[0].name);
    return "Success!";
  }
  

未处理的异常:类型为“ _InternalLinkedHashMap”为   不是'List

类型的子类型

可能是什么原因?

11 个答案:

答案 0 :(得分:22)

您可以使用 new Map<String, dynamic>.from(snapshot.value);

对我来说很完美。

答案 1 :(得分:6)

最简单的方法(一维):

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

print(data['name']);

答案 2 :(得分:4)

如果您需要使用通用字段,请采取以下解决方法:

class DicData
{
  int tot;
  List<Map<String, dynamic>> fields;

  DicData({
    this.tot,
    this.fields
  });

 factory DicData.fromJson(Map<String, dynamic> parsedJson) {
    return DicData(
        tot: parsedJson['tot'],
        //The magic....
        fields : parsedJson["fields"] = (parsedJson['fields'] as List)
            ?.map((e) => e == null ? null : Map<String, dynamic>.from(e))
            ?.toList()
    );
  }

}

答案 3 :(得分:2)

如果您使用的是retrofit.dart,并且为带注释的方法声明了错误的返回类型,则会出现此错误:

@GET("/search")
Future<List<SearchResults>> getResults(); 
// wrong! search results contains a List but the actual type returned by that endpoint is SearchResults 

vs

@GET("/search")
Future<SearchResults> getResults(); 
// correct for this endpoint - SearchResults is a composite with field for the list of the actual results

答案 4 :(得分:2)

因为不会改变类型,只是断言。

您需要使用map['eventType'].cast<String, dynamic>()Map<String, dynamic>.from(map['eventType'])

您也可以通过以下方式解决:

Map<String, dynamic> myMap = new Map<String, dynamic>.from(/*Your Source*/ );

答案 5 :(得分:1)

有两种常见的方法可能会出错:

  1. 如果您的响应是json对象,例如
[
    {
      key1: value,
      key2: value,
    },
    {
      key1: value,
      key2: value,
    },

    .....
] 

然后,使用 data [0] [“ name”] ,而不是 data [0] .name 除非我们强制转换为具有name属性的对象,否则不能使用 data [0] .name

我们为此data = json.decode(response.body).cast<ObjectName>();

ObjectName可以是您想要的任何对象(内置或自定义)。但是请确保它具有他的名字属性

  1. 如果您的响应是json对象,例如
{
    dataKey: [
      {
        key1: value1,
        key2: value2,
      } 
    ] 
}

然后json.decode将返回地图,而不是列表

Map<String, dynamic> map = json.decode(response.body);
List<dynamic> data = data["dataKey"];
print(data[0]["name"]);

答案 6 :(得分:1)

这对我有用:

  1. 创建列表数据
  2. 使用Map解码JSON文件
  3. 使用列表对象数据获取JSON文件的名称
  4. 借助索引和列表对象,我已经从JSON文件动态打印了项目
setState(){

    Map<String, dynamic> map = json.decode(response.body);
    Data  = map["name"];
}

// for printing
Data[index]['name1'].toString(),

答案 7 :(得分:1)

如果您使用Firebase Cloud,请确保您不尝试添加具有相同DocumentID的多个数据;

firestore.collection('user').document(UNIQUEID).setData(educandos[0].toJson()).

答案 8 :(得分:0)

您必须将runtimeType中的data中的_InternalLinkedHashMap转换为实际的List

一种方法是使用List.from

final _data = List<dynamic>.from(
  data.map<dynamic>(
    (dynamic item) => item,
  ),
);

答案 9 :(得分:0)

您正在尝试区分 InternalLinkedHashMap 的实例,但这是不可能的。

您应该序列化并将其反序列化Map<String, dynamic>

InternalLinkedHashMap<String, dynamic> invalidMap;

final validMap =
        json.decode(json.encode(invalidMap)) as Map<String, dynamic>;

答案 10 :(得分:-2)

使用json_annotationjson_serializablebuild_runner时出现相同的错误。当为具有类属性的类调用ClassName.fromJson()方法时,就会发生这种情况(例如:class User具有属性类Address)。

作为解决方案,我修改了每个类生成的*.g.dart文件,方法是在方法Map<String, dynamic>)内部进行深层转换的任何地方,将Map<dynamic, dynamic>)更改为_$*FromJson < / p>

唯一的问题是,每次重新生成文件时,都必须再次更改它。