Исключение необработанного флаттера: введите '_InternalLinkedHashMap JSON запрос - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок во флаттере, и у меня возникают проблемы с моим приложением, когда я хочу получить значения из JSON.

Проблема возникает из-за моего http-запроса, когда я звоню GetCommands() и я не знаю, чтобы решить это. Я уже делал это однажды в другом приложении с другими данными (JSON тоже), и это сработало ...

Вот основной код:

  var commandsGet = new List<Value>();

  Future<void> GetCommands() async {
    await GET.url(urlTest).then((response) {
      setState(() {
        Iterable list2 = json.decode(response.body);
        commandsGet = list2.map((model) => Value.fromJson(model)).toList();
      });
    });
  }

  Future<void> wait2() async {
    await GetCommands();
  }

  onChange2(commandsData user) {
    setState(() {
      commandselection = user;
      // TEST 
      wait2().then((result) {
        print("This is a test");
      });
      // TEST
    });
  }

Вот мой класс Value:

class Value {
  String device;
  int origin;
  List<Readings> readings;

  Value({
    this.device,
    this.origin,
    this.readings,
  });

  Value.fromJson(Map<String, dynamic> json) {
    device = json['device'];
    origin = json['origin'];
    if (json['readings'] != null) {
      readings = new List<Readings>();
      json['readings'].forEach((v) {
        readings.add(new Readings.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data2 = new Map<String, dynamic>();
    data2['device'] = this.device;
    data2['origin'] = this.origin;
    if (this.readings != null) {
      data2['readings'] = this.readings.map((v) => v.toJson()).toList();
    }
    return data2;
  }
}

А вот ошибки консоли Debug:

[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable<dynamic>'
#0      _MyListScreenState.GetCommands.<anonymous closure>.<anonymous closure> 
package:chat/main.dart:92
#1      State.setState 
package:flutter/…/widgets/framework.dart:1164
#2      _MyListScreenState.GetCommands.<anonymous closure> 
#3      _rootRunUnary  (dart:async/zone.dart:1134:38)
#4      _CustomZone.runUnary  (dart:async/zone.dart:1031:19)
#5      _FutureListener.handleValue  (dart:async/future_impl.dart:140:18)
#6      Future._propagateToListeners.handleValueCallback  (dart:async/future_impl.dart:682:45)
#7      Future._propagateToListeners  (dart:async/future_impl.dart:711:32)
#8      Future._completeWithValue  (dart:async/future_impl.dart:526:5)
#9      _AsyncAwaitCompleter.complete  (dart:async-patch/async_patch.dart:34:15)
#10     _completeOnAsyncReturn  (dart:async-patch/async_patch.dart:293:13)
#11     _withCl<…>

Вот данные JSON:

{
    "device": "Random-Integer-Generator01",
    "origin": 1581956092184,
    "readings": [
        {
            "origin": 1581956092183,
            "device": "Random-Integer-Generator01",
            "name": "RandomValue_Int8",
            "value": "23"
        }
    ]
}

Большое спасибо за вашу помощь ,

1 Ответ

1 голос
/ 18 февраля 2020

Я думаю, что проблема response.body, какой тип? Если response.body уже является картой String и Dynami c, вам не нужно использовать json.decode, просто Value.fromJson(model)

Попробуйте изменить, удалив декодирование и синтаксический анализ прямого response.body, чтобы вывести список как это:

(response.body as List).map((item) => Value.fromJson(item)).toList()

Если не работает, передайте, пожалуйста, какой пакет вы используете для выполнения http-вызова.

Я проверял этот URL http://www.mocky.io/v2/5e4b0ef82f000000bc97d6ee и Dio пакет.

...