可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I ran 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?
回答1:
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.
回答2:
I used this
if(json["key"]!= null){ this.active_guests = json["key"].cast<String, int>(); }