例外:类型'String'不是类型转换中'用户'类型的子类型

时间:2020-08-19 15:27:14

标签: flutter

我正在尝试获取和显示帖子,但是从json提取数据时遇到错误。

模型

class Post {
  final String id;
  final User author;
  final String caption;


  Post({this.id,this.author, this.caption, }
  );


  factory Post.fromJSON(Map<String, dynamic> jsonMap) {
    return Post(
      id: jsonMap['id'] as String,
      caption: jsonMap['caption'] as String,
      author: jsonMap['author'] as User,
   
    );
  }

  Map toMap(Post post) {
    var map = new Map<String, dynamic>();

    map["id"] = post.id;
    map["caption"] = post.caption;
    map["author"] = post.author;


    return map;
  }

  Map<String, dynamic> toJson() => {
  'id' : id,
  'author' :author,
  'caption' :caption,


  };
   String rawJson = jsonEncode(Map);

  @override
  String toString() {
    var map = this.toMap(Post());
    map["post"] = Post();
    return map.toString();
  }
}

我尝试使用

final String author;

代替以前的版本

但是当我尝试它也会给我

Converting object to an encodable object failed: Map<dynamic, dynamic>

我需要将其声明为User而不是String,因为我需要在帖子中访问作者的信息(用户名,id等。)

有人对此有解决方案吗?

更新1: 我正在从Json Server获得“用户”引用,所以我必须将其称为“用户”,这样我才能引用“ User.email”等内容。 我让用户这样声明

class User {
  final String id;
  final String email;
  final String username;

 User({
    this.id,this.email,this.username,
  });


  factory User.fromJSON(Map<String, dynamic> json) {
    return User(
      id: json['id'] as String,
      email: json['email'] as String,
      username: json['username'] as String,
    );
  }

  Map<String, dynamic> toJson() => {
    'id' : id,
    'email' : email,
    'username' : username,



  };

  Map toMap(User user) {
    var map = new Map<String, dynamic>();
    map["id"] = user.id;
    map["email"] = user.email;
    map["username"] = user.username ;


    return map;
  }


  @override
  String toString() {
    var map = this.toMap(User());
    map["user"] = User();
    return map.toString();
  }
}

更新2:

Future<List<Post>> fetchPosts(http.Client client) async {
  final response = await http.get("$SERVER_IP/api/articles/?format=json");

  return compute(parsePosts, response.body);
}
List<Post> parsePosts(String responseBody) {
  final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
  return parsed.map<Post>((json) => Post.fromJSON(json)).toList();
}

更新3: 这是我从author(它通过id指代作者)和id两者中获取的UUID。 顺便说一句,所以您知道它不是firebase,它是Django,所以我不能使用任何与firebase相关的代码。

[
    {
        "id": "3ab6e7c8-6a4c-42c2-a08d-e8a6c0fcdecb",
        "author": "dbb0446d-d0ec-4c24-9c1e-8ca9b6b06a7d",
        "caption": "caption here",
       
    }
]

1 个答案:

答案 0 :(得分:0)

您不能这样做,因为它仍然是地图!

例如,在User类中解决此问题的方法将是(我已经完成了属性!):

class User {
    String name;
    String lastName;

    const User({
        this.name,
        this.lastName,
    });

    factory User.fromJson(Map<String, dynamic> json) {
        return User(
            name: json['name'],
            lastName: json['lastName'],
        );
    }
}

这里再次使用factory构造函数,但是现在我们将json数据(或映射)解析为User。然后,在Post JSON构造函数中,您必须使用User JSON构造函数。