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?
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.
I used this
if(json["key"]!= null){
this.active_guests = json["key"].cast<String, int>();
}
You can send nested JSON params like this:
Convert it to a string using json.encode
.
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
);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With