首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异常:类型类型为“String”不是类型类型“User”的子类型

异常:类型类型为“String”不是类型类型“User”的子类型
EN

Stack Overflow用户
提问于 2020-08-19 15:27:14
回答 1查看 752关注 0票数 0

我正在尝试获取并显示帖子,但是在从json中提取数据时,我得到了一个错误。

模型

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

我试着用

代码语言:javascript
复制
final String author;

而不是以前的版本

但当我尝试的时候它也给了我

代码语言:javascript
复制
Converting object to an encodable object failed: Map<dynamic, dynamic>

我需要将它声明为用户而不是字符串,因为我需要访问作者的信息(用户名、id等)。在岗位上

有谁能解决这个问题吗?

更新1:我从Json获得了一个“用户”引用,所以我必须将它称为用户,这样我就可以引用"User.email“之类的东西。我已经这样声明了用户

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

代码语言:javascript
复制
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:这是一个UUID,我从author (它通过id引用作者)和id获得。顺便说一下,您知道它不是firebase,而是Django,所以我不能使用任何与firebase相关的代码。

代码语言:javascript
复制
[
    {
        "id": "3ab6e7c8-6a4c-42c2-a08d-e8a6c0fcdecb",
        "author": "dbb0446d-d0ec-4c24-9c1e-8ca9b6b06a7d",
        "caption": "caption here",
       
    }
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-19 15:33:22

你不能那样做,因为它仍然是一张地图!

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

代码语言:javascript
复制
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构造函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63490332

复制
相关文章

相似问题

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