颤振序列化儿子以列出对象会引发异常

时间:2019-02-10 02:11:06

标签: serialization dart flutter

我有一个.net服务器Web api调用,我试图将客户端部分从Xamarin移植到Flutter。除了json序列化/反序列化之外,大多数情况都对flutter / Dart印象深刻!我的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尝试了手动方法,并且在序列化例程列表时一切正常。但是后来我决定使用here所述的代码生成方式,在我调用jsonDecode时发生以下异常:

“列表”类型不是“地图”类型的子类型

我颤抖的UI代码如下:

_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 :(得分:1)

这不起作用,因为json1是对象的List,而不是Map。

 Map map1 = jsonDecode(json1);

尝试使用此:

List list = jsonDecode(json1);

并获得仅用于测试的第一个元素(在实际情况下,您必须循环列表)

  var test = Routine.fromJson(list[0]);

答案 1 :(得分:0)

很抱歉,上面是DFU错误与stackoverflow。您的想法可行,但是得到了我想要的例程列表,最后得到了

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

然后我在listBuilder中使用例程名称,看起来不错,因此感觉还不错,但是随后我需要将嵌入式计算机列表传递给我的计算机列表小部件。因此,我添加了一个名为MachineList的有状态小部件,如下所示:注意,我将构造函数设置为接受列表

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 /。和../models 痛苦的学习经历,并没有意识到Dart如此敏感,以至于习惯于C#