未處理的異常:類型“String”不是“Map<String,dynamic>類型的子類型

我不確定到底發(fā)生了什么,因?yàn)槲业拇a運(yùn)行良好,但突然停止工作,我不認(rèn)為我改變了任何與此相關(guān)的東西。我在這件事上糾纏了兩天,搞不清楚自己做錯(cuò)了什么。API返回的數(shù)據(jù)是正確的,返回的狀態(tài)碼是200

我相信這個(gè)錯(cuò)誤與PTWorkoutPlanItem.fromJson()函數(shù)有關(guān)。我不認(rèn)為這與List<AssignedUsers>List<WorkoutPlanItem>模型有任何關(guān)系,因?yàn)楫?dāng)我將這些更改為dynamic時(shí),錯(cuò)誤仍然會(huì)發(fā)生

錯(cuò)誤顯示

[ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: type 'String' is not a subtype of type 'Map<String, dynamic>'

獲取數(shù)據(jù)的代碼:

  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;
}

models

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中返回的內(nèi)容

{
    "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
}
? 最佳回答:

試試這個(gè)。我添加了很多類型轉(zhuǎn)換,但最重要的部分是如何處理List<dynamic>并將每個(gè)元素轉(zhuǎn)換為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,
    );
  }
}

此外,這里還有一個(gè)與Dart 2.12兼容的版本,其中required已添加到命名參數(shù)中,因?yàn)樗鼈兌疾辉试S是null,并且沒(méi)有任何默認(rèn)值:

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;
}
主站蜘蛛池模板: 中文字幕在线不卡一区二区| 激情内射亚州一区二区三区爱妻| 91精品一区二区| 亚洲啪啪综合AV一区| 无码国产精品一区二区免费vr| 亚洲国产专区一区| 波多野结衣中文字幕一区| 国产精品亚洲不卡一区二区三区| 九九无码人妻一区二区三区| 久久精品无码一区二区三区免费| 国产精品久久久久久一区二区三区| 伊人久久大香线蕉AV一区二区 | 欧美一区内射最近更新| 无码一区二区三区免费视频| 国产亚洲福利一区二区免费看| 波多野结衣在线观看一区二区三区| 丰满人妻一区二区三区视频| 无码人妻少妇色欲AV一区二区| 亚洲综合无码一区二区痴汉| 精品成人av一区二区三区| 国精产品999一区二区三区有限| 鲁大师成人一区二区三区| 色狠狠色狠狠综合一区| asmr国产一区在线| 无码中文人妻在线一区| 台湾无码AV一区二区三区| 波多野结衣一区在线| 欧美日韩精品一区二区在线观看 | 中文字幕一区二区在线播放| 在线中文字幕一区| 国产一区二区视频在线观看| 无码国产精品久久一区免费| 久久无码人妻一区二区三区午夜| 国产伦一区二区三区免费| 无码人妻精品一区二区三区9厂| 亚洲国产一区在线| 91午夜精品亚洲一区二区三区 | 亚洲一区免费在线观看| 国产精品免费一区二区三区四区| 精品日本一区二区三区在线观看 | 亚洲V无码一区二区三区四区观看|