做为刚开始接触flutter的iOS开发,json转模型这部分一直是我很是头疼的地方。如今网上能找到的方案通常有两种git
flutter里把反射直接禁掉了,这直接致使咱们不能动态的给模型赋值。咱们须要建立一个又一个的fromJson方法,而后在这个方法里取出一个又一个的数据赋值给模型。这是一部分重复且很是无聊代码。这种方式在使用的工程中也存在一系列的问题:github
工具地址json
json_serializable用到了dart里的注解来自动生成代码。关于注解你能够类比是编译插件,在预编译的时候解析出模型里定义的字段,而后根据这些字段建立与之相对应的fromJson方法。这种方式和上面的方案某些层面很类似,可是又在必定程度上解决了上面提到的一些问题:api
还存在的问题:bash
咱们先来梳理一下iOS里YYModel之类的框架是怎么作json自动转model的。首先经过runtime解析出定义的全部属性名、属性的类型。而后用这些属性名去json里取值赋值给model。那么咱们若是想要作一套相似的库的话咱们须要以下能力闭包
flutter把dart里的反射禁掉了,期望系统的api确定是不现实了。咱们比较容易想到的是咱们能够手动输出这部份内容到一个全局的map里。要用的时候经过className去map里取。手动作确定不现实,这部分的数据是有规律性的,因此经过脚原本作很是合适。你研究过json_serializable的实现的话你必定知道注解。咱们能够用注解或者自定义builder来走一个预编译,在这个阶段咱们能解析类,获取参数名、参数类型。解析出这部分数据以后建立一个文件,而后把这些解析出来的数据根据特定的格式输出一个全局的map到刚才建立的文件里。我这边不聊具体实现,只聊方案。具体注解相关的使用能够看注解相关资料框架
经过上面的步骤咱们能解析出属性的类型、属性名。对于自定义的对象来讲,就会存在一个根据类名来建立对应对象的需求。经过闭包来建立对象,用className作key闭包作value,而后把这边分数据也放到上一步解析出来的map里。工具
className : () => className()
复制代码
动态建立完对象以后咱们须要能给这个对象的属性来动态赋值。和以前建立对象的处理方式相似,咱们也能够经过闭包来作,咱们输出以下格式的内容到上面的map中post
name : (dynamic instance, value) => instance.name = value
复制代码
在作model to json功能的时候咱们须要可以经过一个String格式的name去对象里动态获取这部分的数据。和上面用闭包来处理相似。咱们须要输出以下格式的内容到以前的map中ui
name : (dynamic instance) => instaned.name
复制代码
我这边已经实现了一套框架,配置完以后使用起来成本极低,对于客户端转过来写flutter的同窗也更友好。框架地址,欢迎你们试用。