请求回来的这个列表数据需要处理一下才能使用,可以先把 JSON 格式的数据转换成 Map 类型的数据,然后再把它转换成某个特定类型的数据,这些类型里面我要使用 Json Serializable 自动生成 fromJson 还有 toJson 方法,这些类都有一些共同的地方,所以我提前准备了两个代码片断。
在 .vscode 下面,打开定义代码片断的这个文件,xb2_flutter.code-snippets,这里你会看到有一个 JsonSerializable Import 代码片断,输入 jsli 可以得到这个代码片断,这个代码片断带导入。下面还有一个 JsonSerializable 片断,这个片断不带导入,可以用 jsl 这个关键词快速得到这个代码片断。你可以找到这个项目的代码仓库,然后复制这个文件里的这两个代码片断,把它放在你自己的项目里的这个文件里面。
Post
下面可以新建一个文件,放在 lib/post 的下面,名字是 post.dart,我们可以根据请求接口得到的这组数据,去定义一下这个类型。输入 jsli ,可以快速得到一个数据类型,part 文件的名字叫 post.g.dart,这个文件一会儿会使用命令自动生成。按下 tab 键,输入类的名字,Post。
这个类里面有一个工厂方法,名字是 fromJson ,方法接收一个参数,类型是 Map
类里面还有一个方法叫 toJson,它返回的类型是 Map
这个类会使用 @JsonSerializable 注释一下,可以把它的 explicitToJson 这个参数的值设置成 true,这样会明确地调用这个类型嵌套的类型的 toJson 方法。
下面在这个类里面再去添加一些属性,int? 类型的 id,String? 类型的 title,String? 类型的 content,再添加一个 PostUser? 类型的 user,一会儿再去定义这个 PostUser,再添加一个 int? 类型的 totalComments,然后是 PostFile? 类型的 file,List
在构造方法里面添加一些参数,this.id,this.title,this.content,this.user,this.totalComments ,this.file,this.tags,this.totalLikes,还有 this.liked 。
PostUser
然后再去定义这里需要的 PostUser,PostFile 还有 PostTag 这些类型。定义一个类,名字是 PostUser,里面添加几个属性,int? id,String? name,还有 int? avatar。在构造方法里,添加一个 this.id,this.name 还有 this.avatar。
PostFile
下面再定义一个 PostFile 这个类型,它里面有 int? id,int? width,还有 int? height ,在构造方法里添加一个 this.id,this.width 还有 this.height。
PostTag
最后再定义一个类型,名字叫 PostTag,添加两个属性,int? id,String? name, 在构造方法里添加一个 this.id,还有 this.name。
运行 build 命令
在终端,项目所在目录的下面,运行一下 flutter pub run build_runner build ,这个命令会根据刚才定义的类型,自动生成需要的代码。完成以后,你会发现这里多了一个文件,名字是 post.g.dart,在这个文件里会包含自动生成的一些方法。
这些方法在 post.dart 这个文件里定义的这些类里面会用到,定义这些类的时候,我们把 JsonSerializable 的 explicitToJson 设置成了 true,所以在自动生成的对应的 ToJson 方法里面,如果有嵌套的类型,这里会明确的调用它的 toJson() 方法。