在一个 HTTP 客户端,可以先请求一下我们的文件信息接口,然后观察一下返回来的数据是什么样的。用 GET 方法请求,接口地址是 nid-node.ninghao.co/files/ 文件的 ID,然后是 metadata 。
你会发现返回来的数据里面有文件的 ID,size 大小,宽度还有高度,另外还有一个 metadata 字段,它里面包含了照片里面带的一些信息,比如拍摄用的相机,镜头,光圈大小,快门速度,处理用的软件等等。我们现在可以选择使用其中的几个数据,后面我们会把它们放在内容页面上显示。下面可以根据这些东西去定义两个数据类型。
在项目下面新建一个文件,放在 lib/file 的下面,名字是 file.dart ,文件里定义一个类,用 JsonSerializable 标注一下。类的名字叫 File ,在它里面添加一个 int? 类型的 id,一个 int? 类型的 size ,一个 int? 类型的 width ,还有一个 int? 类型的 height。
然后它里面还有一个 metadata,这个属性的类型可以单独定义一下,比如我们叫它 FileMetadata? 名字是 metadata 。
一个构造方法,File,添加几个带名字的参数,this.id,this.size,this.width ,this.height 还有 this.metadata。
因为我在终端运行了 build_runner watch 命令,所以项目文件有变化的时候就会自动编译需要的代码。这里就是会自动生成这个 file.g.dart 这个文件。
FileMetadata
下面再定义一个数据类型,名字是 FileMetadata ,这个类也要用 JsonSerializable 标注一下。在这个类里面添加一个 double? 类型的 focalLength ,表示焦距,一个 double? 类型的 fNumber,表示光圈大小的数字,一个 double? 类型的 exposureTime ,曝光时长,再添加一个 int? 类型的 iSO,表示的是感光度。
然后再添加一个 String? 类型的 make,相机的品牌,一个 String? 类型的 model,相机的型号,一个 String? 类型的 lensMake,镜头品牌,一个 String? 类型的 lensModel ,镜头型号。
再添加一个 String? 类型的 software,处理用的软件。再添加一个 int? 类型的 createDate ,拍摄日期,int? 类型的 modifyDate,编辑日期,最后再添加一个 int? 类型的 exposureProgram,选择使用的曝光模式。
然后添加一个构造方法,FileMetadata ,里面添加几个带名字的参数,this.focalLength,this.fNumber,this.exposureTime,this.iSO,this.make,this.model,this.lensMake, this.lensModel, this.software,this.createDate,this.modifyDate,还有 this.exposureProgram。
首字母小写
注意这里我们定义的这些属性首字母都是小写的,这是 dart 语言制定的规则。不过我们的文件信息接口返回来的数据,字段的名字首字母是大写的。
所以在这个 fromJson 工厂方法里面,可以处理一下使用它的时候提供的这个数据。先声明一个 Map
下面用一个 for in 循环,final item in json.entries 。 在循环里面,声明一个 key,等于 ${item.key[0].toLowerCase()} 后面再加上 ${item.key.subString(1)} 。 再声明一个 value ,值是 item.value 。
然后设置一下 _json 的值,等于一个 map,先把 _json 原来的东西放进来,再加上新的一个 key: value 。 这里我们其实就是把 Map 里的 key 的名字的首字母改成了小写的。
最后把这个处理好的 _json 交给 _$FileMetadataFromJson 这个函数。