Я не могу создать карту, в которой есть другая карта - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь создать модель регистрации и отправить ее в свой API, но ключ «location» имеет другой объект map / jsonobject, который содержит «тип»: «точка» и «координаты»: [double, double] .

Последний объект json должен выглядеть примерно так

{
    "name": "Arsh Bansal",
    "email": "ab@yahoo.com",
    "password": "123456789",
    "birthday": "06-21-2000",
    "gender": "Male",
    "location": {
        "type": "Point", 
        "coordinates": [13.0987, 88.403]
    },
    "phone_number": "123456789"
}

Ниже приведен код Network Helper:

import 'package:http/http.dart' as http;
import 'dart:convert';

class NetworkHelper {

  NetworkHelper(this.url);
  NetworkHelper.withHeader(this.url, this.headers);

  final String url;
  Map<String, String> headers;

  Future getData() async {

    http.Response response = await http.get(url);

    if(response.statusCode == 200) {
      String data = response.body;

      return jsonDecode(data);
    } else {
      String error = response.body;

    }
  }

  Future<http.Response> postData(Map body) async {

    http.Response response = await http.post(url, headers: headers, body: body);
    return response;

  }

}

Но я получаю сообщение об ошибке ниже

Я получаю следующую ошибку: Необработанное исключение: введите '_InternalLinkedHashMap 'не является подтипом типа' String 'в приведении типа

#0      CastMap.forEach.<anonymous closure> (dart:_internal/cast.dart:288:25)
#1      _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
#2      CastMap.forEach (dart:_internal/cast.dart:287:13)
#3      mapToQuery (package:http/src/utils.dart:17:7)
#4      Request.bodyFields= (package:http/src/request.dart:137:12)
#5      BaseClient._sendUnstreamed (package:http/src/base_client.dart:170:17)
#6      BaseClient.post (package:http/src/base_client.dart:58:7)
#7      post.<anonymous closure> (package:http/http.dart:70:16)
#8      _withClient (package:http/http.dart:166:20)
#9      post (package:http/http.dart:69:5)
#10     NetworkHelper.postData (package:clubinn/services/network_helper.dart:28:36)
#11     Models.createUser (package:clubinn/models/models.dart:72:50)
#12     _SignUpPageState.build.<anonymous closure> (package:clubinn/sc<…>

1 Ответ

0 голосов
/ 26 мая 2020

Ваша проблема заключается в использовании аргумента http.post и body. Если вы читаете документацию, вы можете увидеть, что она описана как:

body устанавливает тело запроса. Это может быть строка, список или карта. Если это строка, она кодируется с использованием кодировки и используется в качестве тела запроса. Тип содержимого запроса по умолчанию будет "text / plain".

...

Если тело является Map, оно кодируется как поля формы с использованием кодировки. Тип содержимого запроса будет установлен на «application / x- www-form-urlencoded»; это не может быть отменено.

https://pub.dev/documentation/http/latest/http/post.html

Ввод body, который вы задаете, исходит из следующего кода:

    Map<String, dynamic> body = {
      "name": name,
      "email": email,
      "password": password,
      "birthday": DOB,
      "gender": gender,
      "location": location.toJson(),
      "phone_number": mobile
    };

Если тип даже не близок к Map<String, String>, так как, например, location дается Map<String, dynamic> как значение:

  Map<String,dynamic> toJson() => {
    "type": type,
    "coordinates": List<double>.from(coordinates.map((x) => x)),
  };

Кроме того, я не думаю, что вы хотите дать body значение Карта в первую очередь. Как вы можете видеть в документации, упомянутой ранее, карты «кодируются как поля формы с использованием кодировки». Вместо этого вы хотите правильно разобрать карту на строку JSON и передать эту строку в качестве тела http.post.

Поэтому вместо этого должно быть что-то вроде этого:

http.Response response = await http.post(url, headers: headers, body: json.encode(body));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...