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.
3 Réponses :
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));
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.
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']);
É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 })
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