трепетать сериализовать сына, чтобы список объектов выдает исключение - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть вызов web api сервера .net, который я пытаюсь перенести клиентскую часть на Flutter из Xamarin.больше всего впечатляет флаттер / дартс, за исключением того, что сериализация / десериализация json - это боль!Мой API возвращает список упражнений, которые имеют встроенный список машин.это довольно простой и нормальный материал.мой сгенерированный JSON выглядит так:

[
{"id":1,"
Name":"back",
"userid":1,
"cloned":0,
"Machines":
    [
        {"machineid":2,
        "Name":"Leg Extension","PictureUrl":"https://l},
        {"machineid":3,"Name":"yoga ball","PictureUrl":"https://
         }

Изначально я попробовал ручной подход с dart.convert, и все сработало для моей сериализации списка подпрограмм.однако затем я решил использовать генерацию кода, как описано здесь мой код через следующее исключение, когда я вызвал jsonDecode:

тип 'List' не является подтипом типа 'Map'

мой код пользовательского интерфейса выглядит следующим образом:

_fetchData() async {
setState(() {
  isLoading = true;
});

final response =
await http.get("http://fitnesspal.azurewebsites.net/api/routines");
if (response.statusCode == 200) {
 // list = (json.decode(response.body) as List)
 //     .map((data) => new Routine.fromJson(data))
  //    .toList();
//  final jsonResponse = json.decode(response.body);
  try {
    String json1 = response.body;
    Map map1 = jsonDecode(json1);
    var test = Routine.fromJson(map1);
  }
  catch (e) {
    print(e.toString());
  }


  setState(() {
    isLoading = false;
  });
} else {
  throw Exception('Failed to load photos');
}

}

import 'package:json_annotation/json_annotation.dart';
import 'package:fitnesspal/Models/Machine.dart';
part 'Routine.g.dart';

@JsonSerializable(nullable: false)
class Routine{
 final int id;
  final String name;
 @JsonKey(name: 'Machines')
 List<Machine> Machines;

 Routine({this.id,this.name,this.Machines});

 factory Routine.fromJson(Map<String, dynamic> json) =>
  _$RoutineFromJson(json);
 Map<String, dynamic> toJson() => _$RoutineToJson(this);

}

Я выполнил описанные шаги генерации кода

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

извините, выше была ошибка DFU со стекомВаша идея сработала, но чтобы получить список нужных мне подпрограмм, я получил:

list = (jsonDecode(response.body) as List)
     .map((data) => new Routine.fromJson(data))
     .toList();

Затем я использую имя подпрограммы в своем listBuilder и выглядит хорошо, поэтому чувствую себя довольно хорошо, но затем мне нужно пройтивстроенный список машин в мой список машинпоэтому я добавляю виджет с состоянием с именем MachineList следующим образом: обратите внимание, я настроил свой конструктор так, чтобы он принимал List

class MachineList extends StatefulWidget {
final List<Machine> machines;
MachineList({Key key, this.machines}) : super(key: key);
@override
_MachineListState createState() => _MachineListState(machines);

}

, затем снова в main.dart. Я хочу перемещаться в элементе спискаontap:

Navigator.push(
                  context,
                  MaterialPageRoute(
                     builder: (context) => MachineList(
                         machines: list[index].machines)
                  )
             );

lib / main.dart: 122: 82: Ошибка: тип аргумента 'dart.core :: List <# lib1 :: Machine>' не может быть присвоен типу параметра'dart.core :: List <# lib2 :: Machine>

OMG, откуда он берёт lib2 из

****, обнаружил, что моя проблема не соответствует регистру при импорте В Dart двабиблиотеки одинаковы, если и только если они импортируются с использованием одного и того же URI.Если используются два разных URI, у меня было ... / Models /.и ../модели болезненный опыт обучения, так как не понимал, что Дарт был настолько чувствителен, что привык к c #

0 голосов
/ 10 февраля 2019

Это не работает, потому что json1 - это List объектов, а не Map.

 Map map1 = jsonDecode(json1);

Попробуйте использовать это:

List list = jsonDecode(json1);

И просто получите первый элементдля тестирования (в реальном сценарии вам придется зацикливать список)

  var test = Routine.fromJson(list[0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...