web-dev-qa-db-fra.com

l'exception de rupture «_InternalLinkedHashMap <dynamic, dynamic>» n'est pas un sous-type de type «Map <String, String>»

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?

10
Jeff Mikels

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.

12
Jonah Williams

J'ai utilisé ça

    if(json["key"]!= null){
       this.active_guests = json["key"].cast<String, int>();
     }
7
Mohammed

Vous pouvez envoyer des paramètres JSON imbriqués comme ceci:

  1. Convertissez-le en chaîne en utilisant json.encode.

  2. 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
);
0
Amir Ajorloo