我有一个.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);
}
我遵循了所描述的代码生成步骤
答案 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#