Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

breaking exception '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, String>'

I ran a flutter upgrade today...

I'm now on v0.2.11 and I'm getting a strange runtime error in this function:

Future apiCall([Map params = const {}]) async {
  loading = true;
  Map stringParams = {};
  params.forEach((k,v)=>stringParams[k.toString()] = v.toString());
  Uri url = new Uri.https(apiDomain, apiPath, stringParams);
  print(url);
  var result = await http.post(
    url,
    body: {'apikey': apiKey}
  );
  loading = false;
  print(result.body);
  return json.decode(result.body);
}

I'm calling the function without any params and I get the subtype error.

This code works in DartPad.

Does anyone have an idea what might be going on?

like image 887
Jeff Mikels Avatar asked Apr 13 '18 19:04

Jeff Mikels


3 Answers

The constructor for Uri.https requires a Map with a runtime type of Map<String, String>. When you create stringParams without any type annotations, you are actually creating a Map<dynamic, dynamic>. The correct way to create this for Dart 2 is

Map<String, String> stringParams = {};
// or
var stringParams = <String, String>{};

The reason this used to work is that in Dart 1, even in strong mode, dynamic was fuzzy and acted like both Object and null - meaning a dynamic type was assignable to and from anything. In Dart 2, dynamic acts just like Object, except you can call methods or access properties on it without a downcast.

like image 176
Jonah Williams Avatar answered Nov 20 '22 17:11

Jonah Williams


I used this

    if(json["key"]!= null){
       this.active_guests = json["key"].cast<String, int>();
     }
like image 22
Mohammed Avatar answered Nov 20 '22 16:11

Mohammed


You can send nested JSON params like this:

  1. Convert it to a string using json.encode.

  2. Send "Content-Type:application/json" in header.

var uri = "${Config.baseURL}/your/endpoint";
var headers = {
  'Content-Type': 'application/json'
};
final response = await http.post(
  uri,
  body: json.encode(data),
  headers: headers
);
like image 1
Amir Ajorloo Avatar answered Nov 20 '22 17:11

Amir Ajorloo