如何解决Flutter预期值为'Map< String,dynamic>'类型的值,但是却得到了'List< dynamic>'类型的值 [英] How to fix Flutter Expected a value of type 'Map<String, dynamic>', but got one of type 'List<dynamic>'

查看:110
本文介绍了如何解决Flutter预期值为'Map< String,dynamic>'类型的值,但是却得到了'List< dynamic>'类型的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Flutter Web和RESTful API开发后端的Web应用程序.因此,我正在尝试从api获取数据,使用Flutter Models对其进行序列化,然后返回结果.

I'm developing a web app using Flutter Web and RESTful API for backend. So, I'm trying the fetch the data from the api, serialize it by using Flutter Models, then return the result.

问题是,我得到了这个结果

The Problem is, I'm getting this result

Expected a value of type 'Map<String, dynamic>', but got one of type 'List<dynamic>'

如何解决此问题?

这是我的颤动代码:

模型

// To parse this JSON data, do
//
//     final medicalRecordsModel = medicalRecordsModelFromJson(jsonString);

import 'dart:convert';

class MedicalRecordsModel {
  MedicalRecordsModel({
    this.id,
    this.category,
    this.fileName,
    this.dateTimestamp,
    this.description,
    this.upload,
    this.patientName,
    this.age,
    this.address,
    this.userId,
    this.patientId,
    this.isActive,
  });

  final String id;
  final String category;
  final String fileName;
  final String dateTimestamp;
  final String description;
  final String upload;
  final String patientName;
  final String age;
  final String address;
  final dynamic userId;
  final int patientId;
  final bool isActive;

  factory MedicalRecordsModel.fromJson(Map<String, dynamic> json) {
    return MedicalRecordsModel(
      id: json["id"],
      category: json["category"],
      fileName: json["fileName"],
      dateTimestamp: json["dateTimestamp"],
      description: json["description"],
      upload: json["upload"],
      patientName: json["patientName"],
      age: json["age"],
      address: json["address"],
      userId: json["userId"],
      patientId: json["patientId"],
      isActive: json["isActive"],
    );
  }
}

API连接

import 'dart:convert';
import 'dart:developer';
import 'dart:async';
import 'package:app/src/constants/medical_records.dart';
import 'package:app/src/models/medical_records/medical_records.dart';
import 'package:app/src/pages/Medical-Records/medical_record.dart';
import 'package:http/http.dart' as http;

class MedicalRecordsManager {
  var client = http.Client();
  var url = ConstantMedicalRecords.medical_records_api;

  Future<MedicalRecordsModel> getRecords() async {
    var url = ConstantMedicalRecords.medical_records_api;
    log('$url');
    try {
      final response = await client.get(url);
      if (response.statusCode == 200) {
        return MedicalRecordsModel.fromJson(jsonDecode(response.body));
        // print(recordsModel);
      }
    } catch (Exception) {
      print(Exception);
      print("Error occured");
    }
  }
}


这是我想要获取的JSON数据

Here is the JSON data I want to get

 {
        "id": "103",
        "category": "DOCUMENT",
        "fileName": "Check Up",
        "dateTimestamp": "2021-02-1012:59:46",
        "description": "string",
        "upload": "String",
        "patientName": "1",
        "age": "25",
        "address": "Earth",
        "userId": null,
        "patientId": 12,
        "isActive": true
    }

请帮助我解决这个问题.

Please help me with this one.

推荐答案

此代码将按预期工作:

import 'package:json_helpers/json_helpers.dart';

void main() {
  // responseBody is the same response.body

  // When response is a list of objects
  final list = responseBody1.jsonList((e) => MedicalRecordsModel.fromJson(e));
  var obj = list[0];
  print(obj.category);
  print(obj.fileName);

  // When response is an object
  obj = responseBody2.json((e) => MedicalRecordsModel.fromJson(e));
  print(obj.category);
  print(obj.fileName);
}

final responseBody1 = '''
[
   {
      "id":"103",
      "category":"DOCUMENT",
      "fileName":"Check Up",
      "dateTimestamp":"2021-02-1012:59:46",
      "description":"string",
      "upload":"String",
      "patientName":"1",
      "age":"25",
      "address":"Earth",
      "userId":null,
      "patientId":12,
      "isActive":true
   }
]''';

final responseBody2 = '''
{
   "id":"103",
   "category":"DOCUMENT",
   "fileName":"Check Up",
   "dateTimestamp":"2021-02-1012:59:46",
   "description":"string",
   "upload":"String",
   "patientName":"1",
   "age":"25",
   "address":"Earth",
   "userId":null,
   "patientId":12,
   "isActive":true
}''';

class MedicalRecordsModel {
  final String id;

  final String category;
  final String fileName;
  final String dateTimestamp;
  final String description;
  final String upload;
  final String patientName;
  final String age;
  final String address;
  final dynamic userId;
  final int patientId;
  final bool isActive;
  MedicalRecordsModel({
    this.id,
    this.category,
    this.fileName,
    this.dateTimestamp,
    this.description,
    this.upload,
    this.patientName,
    this.age,
    this.address,
    this.userId,
    this.patientId,
    this.isActive,
  });

  factory MedicalRecordsModel.fromJson(Map<String, dynamic> json) {
    return MedicalRecordsModel(
      id: json['id'] as String,
      category: json['category'] as String,
      fileName: json['fileName'] as String,
      dateTimestamp: json['dateTimestamp'] as String,
      description: json['description'] as String,
      upload: json['upload'] as String,
      patientName: json['patientName'] as String,
      age: json['age'] as String,
      address: json['address'] as String,
      userId: json['userId'] as String,
      patientId: json['patientId'] as int,
      isActive: json['isActive'] as bool,
    );
  }
}

输出:

DOCUMENT
Check Up
DOCUMENT
Check Up

也就是说,当响应是一个对象列表时:

That is, when response is a list of objects:

final list = response.body.jsonList((e) => MedicalRecordsModel.fromJson(e));

当响应是一个对象时:

final object = response.body.json((e) => MedicalRecordsModel.fromJson(e));

如果您不知道结果是什么,则可以尝试两种方法.

If you don't know what the result is, then you can try both methods.

response.body.json((e) => Model.fromJson(e));
response.body.jsonList((e) => Model.fromJson(e));

如果您已经解码了JSON字符串并想要转换结果(或部分结果),则可以使用以下方法:

If you have already decoded a JSON string and want to convert the result (or part of it), you can use the following methods:

如果解码后的 value 的类型为 Map :

If the type of the decoded value is Map:

final object = value.json((e) => Model.fromJson(e));

如果解码后的 value 的类型为 List :

If the type of the decoded value is List:

final objects = value.json((e) => Model.fromJson(e));

这篇关于如何解决Flutter预期值为'Map&lt; String,dynamic&gt;'类型的值,但是却得到了'List&lt; dynamic&gt;'类型的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆