тип '_InternalLinkedHashMap'не является подтипом типа' Iterable <dynamic>'[решено] - PullRequest
0 голосов
/ 17 октября 2019

Я создаю почтовый запрос, используя пакет http. Мой код

final params = {
        'cartItem': {
          'sku': product.sku,
          'qty': '1',
          'quote_id': "xxxxx",
          'price': product.price.toString()
        }
      };
      final body = jsonEncode(params);
      var uri = Uri.parse(ClientConfigs.loadBasicURL()+APIPath.guestCartsPath+quoteID+"/items");
      uri = uri.replace(queryParameters: params);
      final response = await http.post(uri, headers: {'Authorization': 'Bearer ' + ClientConfigs.accessToken}, body: body);

Он сломался за исключением того, что type '_InternalLinkedHashMap<String, String>' is not a subtype of type 'Iterable<dynamic>', и он указал на этот код внутри класса uri.dart:

queryParameters.forEach((key, value) {
      if (value == null || value is String) {
        writeParameter(key, value);
      } else {
        Iterable values = value; // Here is the broken point
        for (String value in values) {
          writeParameter(key, value);
        }
      }
    });

Так что мой вопрос заключается в том, как сделатьотправить запрос с вложенным телом, как у меня. Спасибо за вашу помощь.

ОБНОВЛЕНИЕ: Спасибо @ChennaReddy Проблема в том, что я добавил uri = uri.replace(queryParameters: params);, что недопустимо для queryParameters. И я заметил, что мне нужно изменить «» на «», например: «cartItem» вместо «cartItem», я не уверен насчет кодировки Dart, но меняю так, чтобы запрос работал.

1 Ответ

0 голосов
/ 17 октября 2019

Эта ошибка возникает из-за этой строки:

uri = uri.replace(queryParameters: params);

Цель этого состоит в том, чтобы заменить параметры URI на новые, вот пример:

var uri = Uri.parse("http://www.example.com/?q=test");
final replaceParams = {"q":"othertest"};
uri = uri.replace(queryParameters: replaceParams);
print(uri);

Выходные данныебудет:

I/flutter ( 6060): http://www.example.com/?q=othertest

Итак, это параметры для GET запросов.


В вашем случае вы путаете uri.replace() для GET параметров и передаете туда параметры POST. Итак, кажется, что вам не нужно вызывать метод uri.replace(), и это решило бы эту ошибку.

...