我不太确定发生了什么,因为我的代码运行良好,但突然停止工作,我认为我没有改变任何与此相关的内容。我已经被困在这上面两天了,我不知道我做错了什么。从API返回的数据是正确的,返回状态代码为200。
我认为这个错误与PTWorkoutPlanItem.fromJson()
函数有关。我认为这与List<AssignedUsers>
或List<WorkoutPlanItem>
模型没有任何关系,因为当我将它们更改为dynamic
时,仍然会发生错误。
错误说
[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: type 'String' is not a subtype of type 'Map<String, dynamic>'
获取数据的代码:
getPlanData() async {
var data = PTWorkoutPlanItem.fromJson(
await get(url: 'pt/workouts/plan/' + planId.toString()));
}
// Console logged the response here and it is correct, so this function works
Future<dynamic> get({url}) async {
final response = await http.get(baseUrl + url, headers: headers);
print(response.statusCode);
dynamic res = json.decode(response.body);
return res;
}
模型
class PTWorkoutPlanItem {
int id;
String title;
List<AssignedUsers> assignedUsers;
List<WorkoutPlanItem> workouts;
int ptId;
PTWorkoutPlanItem(
{this.id, this.title, this.assignedUsers, this.workouts, this.ptId});
factory PTWorkoutPlanItem.fromJson(Map<String, dynamic> json) {
return PTWorkoutPlanItem(
id: json['id'],
title: json['title'],
assignedUsers: List.from(json['assignedUsers'])
.map((item) => AssignedUsers.fromJson(item))
.toList(),
workouts: List.from(json['workouts'])
.map((item) => WorkoutPlanItem.fromJson(item))
.toList(),
ptId: json['ptId'],
);
}
}
class AssignedUsers {
int id;
String title;
AssignedUsers({this.id, this.title});
factory AssignedUsers.fromJson(Map<String, dynamic> json) {
return AssignedUsers(id: json['id'], title: json['title']);
}
}
class WorkoutPlanItem {
int id;
String title;
int duration;
int sets;
int rest;
WorkoutPlanItem({this.id, this.title, this.duration, this.sets, this.rest});
factory WorkoutPlanItem.fromJson(Map<String, dynamic> json) {
return WorkoutPlanItem(
id: json['id'],
title: json['title'],
duration: json['duration'],
sets: json['sets'],
rest: json['rest'],
);
}
}
--这就是API中重新处理的内容。
{
"id": 1,
"title": "Pull day",
"assignedUsers": [
{
"id": 1,
"title": "josh"
},
{
"id": 2,
"title": "marus"
}
],
"workouts": [
{
"id": 4,
"title": "Workout item 4",
"duration": 10,
"sets": 3,
"rest": 3
},
{
"id": 1,
"title": "Workout item 1",
"duration": 10,
"sets": 3,
"rest": 3
}
],
"ptId": 1
}
发布于 2021-03-13 20:02:22
尝尝这个。我添加了许多类型转换,但最重要的部分是如何处理List<dynamic>
并将每个元素转换为Map<String, dynamic>
class PTWorkoutPlanItem {
int id;
String title;
List<AssignedUsers> assignedUsers;
List<WorkoutPlanItem> workouts;
int ptId;
PTWorkoutPlanItem(
{this.id, this.title, this.assignedUsers, this.workouts, this.ptId});
factory PTWorkoutPlanItem.fromJson(Map<String, dynamic> json) {
return PTWorkoutPlanItem(
id: json['id'] as int,
title: json['title'] as String,
assignedUsers: (json['assignedUsers'] as List<dynamic>)
.cast<Map<String, dynamic>>()
.map((item) => AssignedUsers.fromJson(item))
.toList(),
workouts: (json['workouts'] as List<dynamic>)
.cast<Map<String, dynamic>>()
.map((item) => WorkoutPlanItem.fromJson(item))
.toList(),
ptId: json['ptId'] as int,
);
}
}
class AssignedUsers {
int id;
String title;
AssignedUsers({this.id, this.title});
factory AssignedUsers.fromJson(Map<String, dynamic> json) {
return AssignedUsers(id: json['id'] as int, title: json['title'] as String);
}
}
class WorkoutPlanItem {
int id;
String title;
int duration;
int sets;
int rest;
WorkoutPlanItem({this.id, this.title, this.duration, this.sets, this.rest});
factory WorkoutPlanItem.fromJson(Map<String, dynamic> json) {
return WorkoutPlanItem(
id: json['id'] as int,
title: json['title'] as String,
duration: json['duration'] as int,
sets: json['sets'] as int,
rest: json['rest'] as int,
);
}
}
此外,这里还有一个与Dart 2.12兼容的版本,其中添加到命名参数中的required
,因为它们都不被允许为null
,并且没有任何默认值:
class PTWorkoutPlanItem {
int id;
String title;
List<AssignedUsers> assignedUsers;
List<WorkoutPlanItem> workouts;
int ptId;
PTWorkoutPlanItem(
{required this.id,
required this.title,
required this.assignedUsers,
required this.workouts,
required this.ptId});
factory PTWorkoutPlanItem.fromJson(Map<String, dynamic> json) {
return PTWorkoutPlanItem(
id: json['id'] as int,
title: json['title'] as String,
assignedUsers: (json['assignedUsers'] as List<dynamic>)
.cast<Map<String, dynamic>>()
.map((item) => AssignedUsers.fromJson(item))
.toList(),
workouts: (json['workouts'] as List<dynamic>)
.cast<Map<String, dynamic>>()
.map((item) => WorkoutPlanItem.fromJson(item))
.toList(),
ptId: json['ptId'] as int,
);
}
}
class AssignedUsers {
int id;
String title;
AssignedUsers({required this.id, required this.title});
factory AssignedUsers.fromJson(Map<String, dynamic> json) {
return AssignedUsers(id: json['id'] as int, title: json['title'] as String);
}
}
class WorkoutPlanItem {
int id;
String title;
int duration;
int sets;
int rest;
WorkoutPlanItem(
{required this.id,
required this.title,
required this.duration,
required this.sets,
required this.rest});
factory WorkoutPlanItem.fromJson(Map<String, dynamic> json) {
return WorkoutPlanItem(
id: json['id'] as int,
title: json['title'] as String,
duration: json['duration'] as int,
sets: json['sets'] as int,
rest: json['rest'] as int,
);
}
}
更新:--您也可以尝试将您的方法更改为:
Future<Map<String, dynamic>> get({url}) async {
final response = await http.get(baseUrl + url, headers: headers);
print(response.statusCode);
final res = json.decode(response.body) as Map<String, dynamic>;
return res;
}
https://stackoverflow.com/questions/66617791
复制相似问题