9
votes

le type 'int' n'est pas un sous-type de type 'String' dans le type cast lors de l'envoi d'une demande de publication

J'ai une erreur étrange lors de l'envoi d'une demande de publication.

E/flutter (32582): [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:
E/flutter (32582): type 'int' is not a subtype of type 'String' in type cast
E/flutter (32582): #0      CastMap.forEach.<anonymous closure> (dart:_internal/cast.dart:286:25)
E/flutter (32582): #1      __InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin.forEach (dart:collection/runtime/libcompact_hash.dart:370:8)
E/flutter (32582): #2      CastMap.forEach (dart:_internal/cast.dart:285:13)
E/flutter (32582): #3      mapToQuery (package:http/src/utils.dart:17:7)
E/flutter (32582): #4      Request.bodyFields= (package:http/src/request.dart:128:17)
E/flutter (32582): #5      BaseClient._sendUnstreamed (package:http/src/base_client.dart:163:17)
E/flutter (32582): <asynchronous suspension>
E/flutter (32582): #6      BaseClient.post (package:http/src/base_client.dart:54:7)
E/flutter (32582): #7      post.<anonymous closure> (package:http/http.dart:70:16)
E/flutter (32582): #8      _withClient (package:http/http.dart:166:20)
E/flutter (32582): <asynchronous suspension>
E/flutter (32582): #9      post (package:http/http.dart:69:5)
E/flutter (32582): #10     _MainModel&Model&ConnectedModel&UsersModel&ActivitiesModel.createActivity (package:activmap/scoped-models/connectedModel.dart:62:15)
E/flutter (32582): <asynchronous suspension>
E/flutter (32582): #11     _NewActivityState.save (package:activmap/pages/newActivity.dart:271:11)
E/flutter (32582): <asynchronous suspension>
E/flutter (32582): #12     _NewActivityState.build.<anonymous closure> (package:activmap/pages/newActivity.dart:248:30)
E/flutter (32582): #13     _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:507:14)
E/flutter (32582): #14     _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:562:30)
E/flutter (32582): #15     GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
E/flutter (32582): #16     TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)
E/flutter (32582): #17     TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:175:7)
E/flutter (32582): #18     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:315:9)
E/flutter (32582): #19     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)
E/flutter (32582): #20     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)
E/flutter (32582): #21     _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:180:19)
E/flutter (32582): #22     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:158:22)
E/flutter (32582): #23     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:138:7)
E/flutter (32582): #24     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:101:7)
E/flutter (32582): #25     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:85:7)
E/flutter (32582): #26     _invoke1 (dart:ui/hooks.dart:168:13)
E/flutter (32582): #27     _dispatchPointerDataPacket (dart:ui/hooks.dart:122:5)

c'est l'erreur:

// this map is passed to a function
final Map<String, dynamic> activityData = {
  "userId": 1,
  "name": activityName.text,
  "description": activityDescription.text,
  "startAt": activityStartAt.text,
  "endsAt": activityEndAt.text,
  "lat": _latitude,
  "long": _longitude,
  "category": 2,
  "status": "pending"
};

// this code bellow is inside a async function
final http.Response response =
        await http.post(Uri.encodeFull(url), body: activityData);

Je le fais fonctionner correctement sur un autre écran, la seule différence que je peux voir est que celui qui fonctionne n'a que des chaînes, tandis que celui-ci a int, double et String.


6 commentaires

quelle est la ligne de l'erreur? /connectedModel.dart:62 pourriez-vous ajouter cette ligne


@diegoveloper c'est cette ligne final http.Response response = await http.post(Uri.encodeFull(url), body: activityData); et aussi quand j'imprime (activityData) il s'imprime correctement.


@diegoveloper après avoir reçu la réponse, je vérifie if (response.statusCode != 201) {} else { // here I go to another page}


@diegoveloper ok! c'est l'url: tapographics.com/api/activity


@diegoveloper c'est un gist gist.github.com/chadidi/48f4a3630fc5d947d39b67e19f48a994 afin que vous puissiez voir le code que je l'ai déjà imprimé et c'est correct.


vérifiez ma réponse ci-dessous


3 Réponses :


13
votes

Pour résoudre votre problème, il vous suffit d'encoder les données avant de les envoyer.

    final Map<String, dynamic> activityData = {
      "user_id": "1",
      "name": activityName.text,
      "description": activityDescription.text,
      "startAt": activityStartAt.text,
      "endsAt": activityEndAt.text,
      "lat": "$_latitude",
      "long": "$_longitude",
      "category": "2",
      "status": "pending"
    };

     final http.Response response =
    await http.post(Uri.encodeFull(url), body: activityData);

Si votre API ne prend pas en charge JSON, il vous suffit de transmettre toutes vos données sous forme de chaîne.

 import 'dart:convert';
 ...

 final http.Response response =
    await http.post(Uri.encodeFull(url), body: json.encode(activityData));


5 commentaires

le problème est que mon API ne lit pas json et c'est mieux si je peux l'utiliser sans encodage.


et aussi comme je l'ai mentionné, cela fonctionne très bien sans json.encode dans une autre fonction !!!


Cela a fonctionné Je l'ai essayé plus tôt avec .toString () et "1" mais n'a pas fonctionné, maintenant ça marche !! merci, pensez-vous que ce bogue devrait être signalé ou que ce comportement est attendu?


Je pense que c'est le comportement attendu puisque vous transmettez des données brutes, toutes les données doivent être String et non primitives, vérifiez simplement ces lignes du code flutter: mapToQuery (package: http / src / utils.dart: 17: 7) E / flutter (32582): # 4 Request.bodyFields = (paquet: http / src / request.dart: 128: 17)


L'ajout d'en- headers: {'content-type': 'application/json'} fait l'affaire pour moi.



1
votes

Check out requests - une bibliothèque flutter pour faire des requêtes http (inspirée du module de requêtes python)

Publication de l' application/x-www-form-urlencoded :

var r = await Requests.post("https://reqres.in/api/users", json: {
    "userId": 10,
    "id": 91,
    "title": "aut amet sed",
    "body": "libero voluptate eveniet aperiam sed\nsunt placeat suscipit molestias\nsimilique fugit nam natus\nexpedita consequatur consequatur dolores quia eos et placeat",
  });

r.raiseForStatus();
dynamic body = r.json();
print(json['id']);

Publication de l' application/json :

var r = await Requests.post(
  "https://reqres.in/api/users", body: {
    "userId": 10,
    "id": 91,
    "title": "aut amet sed",
  },
  bodyEncoding: RequestBodyEncoding.FormURLEncoded);

r.raiseForStatus();
dynamic json = r.json();
print(json['id']);


0 commentaires

1
votes

Étape 1: utilisez "content-type": "application/json" dans l'en-tête

Étape 2: encodez votre corps comme jsonEncode( {"param1": 10, "param2":20,"param3": "abc","param4": true})

Exemple de code comme

 headers: {
      "content-type": "application/json",
    },
    body:jsonEncode( {
      "qualificationId": 10,
      "year":2001,
      "instituteName": "example",
      "isActive": true
    })


0 commentaires