J'ai exécuté la mise à niveau de flutter aujourd'hui ...
Je suis maintenant sur v0.2.11 et j'obtiens une étrange erreur d'exécution dans cette fonction:
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);
}
J'appelle la fonction sans aucun paramètre et j'obtiens l'erreur de sous-type.
Ce code fonctionne dans dartpad.
Quelqu'un at-il une idée de ce qui pourrait se passer?
Le constructeur de Uri.https
nécessite une carte avec un type d'exécution Map<String, String>
. Lorsque vous créez stringParams
sans annotation de type, vous créez en fait un Map<dynamic, dynamic>
. La bonne façon de créer ceci pour Dart 2 est
Map<String, String> stringParams = {};
// or
var stringParams = <String, String>{};
La raison pour laquelle cela fonctionnait est que dans Dart 1, même en mode fort, dynamic
était flou et agissait à la fois comme Object
et null
- ce qui signifie qu'un type dynamique était assignable à et de tout. Dans Dart 2, dynamic
agit exactement comme Object
, sauf que vous pouvez appeler des méthodes ou accéder à ses propriétés sans downcast.
J'ai utilisé ça
if(json["key"]!= null){
this.active_guests = json["key"].cast<String, int>();
}
Vous pouvez envoyer des paramètres JSON imbriqués comme ceci:
Convertissez-le en chaîne en utilisant json.encode
.
Envoyez "Content-Type: application/json" dans l'en-tête.
var uri = "${Config.baseURL}/your/endpoint";
var headers = {
'Content-Type': 'application/json'
};
final response = await http.post(
uri,
body: json.encode(data),
headers: headers
);