【问题标题】:How to assign dio's response data to dart objects?如何将 dio 的响应数据分配给飞镖对象?
【发布时间】:2020-12-09 12:34:29
【问题描述】:

我正在尝试使用 dio 来获取 API 的用户。但是当我尝试将请求转换为 dart 用户列表时它不起作用。

我的编码器和解码器类:是从在线 json 解码器站点生成的。

List<User> userListFromJson(String str) =>
    List<User>.from(json.decode(str).map((x) => User.fromJson(x)));

User userFromJson(String str) => User.fromJson(json.decode(str));

String userToJson(User data) => json.encode(data.toJson());

class User {
  User({
    this.url,
    this.id,
    this.image,
    this.username,
    this.nid,
    this.email,
    this.password,
    this.firstName,
    this.lastName,
    this.isActive,
    this.isStaff,
    this.isAuthority,
    this.isSpecialist,
    this.isGeneralUser,
  });

  String url;
  int id;
  String image;
  String username;
  String nid;
  String email;
  String password;
  dynamic firstName;
  dynamic lastName;
  bool isActive;
  bool isStaff;
  bool isAuthority;
  bool isSpecialist;
  bool isGeneralUser;

  factory User.fromJson(Map<String, dynamic> json) => User(
        url: json["url"] == null ? null : json["url"],
        id: json["id"] == null ? null : json["id"],
        image: json["image"] == null ? null : json["image"],
        username: json["username"] == null ? null : json["username"],
        nid: json["nid"] == null ? null : json["nid"],
        email: json["email"] == null ? null : json["email"],
        password: json["password"] == null ? null : json["password"],
        firstName: json["first_name"],
        lastName: json["last_name"],
        isActive: json["is_active"],
        isStaff: json["is_staff"],
        isAuthority: json["is_authority"],
        isSpecialist: json["is_specialist"],
        isGeneralUser: json["is_general_user"],
      );

  Map<String, dynamic> toJson() => {
        "url": url == null ? null : url,
        "id": id == null ? null : id,
        "image": image == null ? null : image,
        "username": username == null ? null : username,
        "nid": nid == null ? null : nid,
        "email": email == null ? null : email,
        "first_name": firstName,
        "last_name": lastName,
        "is_active": isActive == false ? false : isActive,
        "is_staff": isStaff == false ? false : isStaff,
        "is_authority": isAuthority == false ? false : isAuthority,
        "is_specialist": isSpecialist == false ? false : isSpecialist,
        "is_general_user": isGeneralUser == false ? false : isGeneralUser,
      };
}

返回 dio 响应的我的 Api Request 类。

  Future<dio.Response> getAllUsers() async {
    return await _dio.get(
      '$baseUrl/user/list',
      options: dio.Options(
        contentType: dio.Headers.jsonContentType,
        headers: requestHeader,
      ),
    );
  }

提供者的代码在其中转换和存储响应以供应用使用。

  Future<bool> fetchUsersList() async {
    var resp = await ApIService().getAllUsers();
    if (resp.statusCode == 200) {
      List rawJson = resp.data;
      var users = rawJson.map((e) => userFromJson(e)).toList();
      _setUsersList(users);
      return true;
    } else {
      _setMessage(jsonDecode(resp.data)['detail']);
      _setStatusCode(resp.statusCode);
      return false;
    }
  }

代码运行时会显示如下错误:

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:类型 '_InternalLinkedHashMap' 不是类型 'String' 的子类型

【问题讨论】:

    标签: flutter dio


    【解决方案1】:
    class User {
      String url;
      int id;
      String image;
      String username;
      String nid;
      String email;
      String password;
      dynamic firstName;
      dynamic lastName;
      bool isActive;
      bool isStaff;
      bool isAuthority;
      bool isSpecialist;
      bool isGeneralUser;
      User({
        this.url,
        this.id,
        this.image,
        this.username,
        this.nid,
        this.email,
        this.password,
        this.firstName,
        this.lastName,
        this.isActive,
        this.isStaff,
        this.isAuthority,
        this.isSpecialist,
        this.isGeneralUser,
      });
      
      Map<String, dynamic> toMap() {
        return {
          'url': url,
          'id': id,
          'image': image,
          'username': username,
          'nid': nid,
          'email': email,
          'password': password,
          'firstName': firstName,
          'lastName': lastName,
          'isActive': isActive,
          'isStaff': isStaff,
          'isAuthority': isAuthority,
          'isSpecialist': isSpecialist,
          'isGeneralUser': isGeneralUser,
        };
      }
    
      factory User.fromMap(Map<String, dynamic> map) {
        if (map == null) return null;
      
        return User(
          url: map['url'],
          id: map['id'],
          image: map['image'],
          username: map['username'],
          nid: map['nid'],
          email: map['email'],
          password: map['password'],
          firstName: map['firstName'],
          lastName: map['lastName'],
          isActive: map['isActive'],
          isStaff: map['isStaff'],
          isAuthority: map['isAuthority'],
          isSpecialist: map['isSpecialist'],
          isGeneralUser: map['isGeneralUser'],
        );
      }
    
      String toJson() => json.encode(toMap());
    
      factory User.fromJson(String source) => User.fromMap(json.decode(source));
    
    }
    
      Future<bool> fetchUsersList() async {
       List<User> _setUsersList = [];
    
        var resp = await ApIService().getAllUsers();
        if (resp.statusCode == 200) {
          resp.data.forEach((data) {
              User user = User.fromMap(data);
              _setUsersList.add(user);
            });
          return true;
        } else {
          _setStatusCode(resp.statusCode);
          return false;
        }
      }
    

    【讨论】:

    • 伙计,它在尝试遍历 resp.data.forEach 时显示错误 .... 但确实你的回答帮助我解决了这个问题。
    • 是否可以创建一个通用方法,包含评估响应代码的通用逻辑?就像输入答案中预期的对象类型一样,并在其上调用 .toJson() 。我有很多方法重复了这段代码,这让我感觉很糟糕,它一点也不“干”?
    猜你喜欢
    • 2013-07-28
    • 2020-01-16
    • 2019-08-22
    • 1970-01-01
    • 2021-10-26
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多