首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未处理的异常:类型'String‘不是'Map<String,dynamic>’类型的子类型

未处理的异常:类型'String‘不是'Map<String,dynamic>’类型的子类型
EN

Stack Overflow用户
提问于 2021-03-13 19:40:22
回答 1查看 3.1K关注 0票数 1

我不太确定发生了什么,因为我的代码运行良好,但突然停止工作,我认为我没有改变任何与此相关的内容。我已经被困在这上面两天了,我不知道我做错了什么。从API返回的数据是正确的,返回状态代码为200。

我认为这个错误与PTWorkoutPlanItem.fromJson()函数有关。我认为这与List<AssignedUsers>List<WorkoutPlanItem>模型没有任何关系,因为当我将它们更改为dynamic时,仍然会发生错误。

错误说

代码语言:javascript
运行
复制
[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: type 'String' is not a subtype of type 'Map<String, dynamic>'

获取数据的代码:

代码语言:javascript
运行
复制
  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;
}

模型

代码语言:javascript
运行
复制
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中重新处理的内容。

代码语言:javascript
运行
复制
{
    "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
}
EN

Stack Overflow用户

回答已采纳

发布于 2021-03-13 20:02:22

尝尝这个。我添加了许多类型转换,但最重要的部分是如何处理List<dynamic>并将每个元素转换为Map<String, dynamic>

代码语言:javascript
运行
复制
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,并且没有任何默认值:

代码语言:javascript
运行
复制
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,
    );
  }
}

更新:--您也可以尝试将您的方法更改为:

代码语言:javascript
运行
复制
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;
}
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66617791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档