目前有个任务,想将客户端的组件做成动态化,可配置。动态化可配置方案,基本有三种实现方式:
native实现,就是数据类型驱动方式。android原生编写模板,然后根据服务端返回的每个数据的type来区分使用哪个模板。大模块可配置,小模块也需要可配置。
优点:加载渲染速度较快。
缺点:不够灵活,增加新的模板需要发布新的Android版本。
使用H5的优点:
缺点:
虽然H5可以实现,奈何自己不想写H5代码
使用FlutterWeb方式实现,原生通过webview加载flutterweb,flutterweb代码放在服务端。
使用Flutter优势:
上述背景随便写写,不喜欢写文字 >.< 。
Android原生这端不需要引入Flutter的sdk,通过WebView进行加载,所以Android原生与Flutter之间的交互,通过中间部分js来进行交互。交互方式可见【Flutter】Android原生WebView(非Flutter WebView)与FlutterWeb交互
中间需要js进行中转交互,上述图细分为
【Flutter】FlutterWeb与Js交互
上述搜索框是在native这边,下面内容是flutter web内容,通过原生的webview加载。本以为的数据交互方式是:点击搜索后,后台返回数据,webview将数据传递到flutterweb的js中,然后通过js将数据传递到flutter代码中来加载更新组件。点击flutter页面的某些数据,会将点击的数据传递到native这边,然后再进行搜索,重新将数据传递到flutter页面,然后更新flutter。这涉及到原生调用js,js调用原生,Flutter调用js,js调用原生。
【Flutter】Android原生WebView(非Flutter WebView)与FlutterWeb交互实质上是native调用js,js调用native;【Flutter】FlutterWeb与Js交互是Flutter调用js,js调用原生。
这么做的理由如下:
现在是,后台返回什么数据。本来以为他们会返回json数据,然后我这边通过拿到json数据,然后解析成Map表,然后遍历Map来获取key和Value,然后填充组件。解析填充这个也是个麻烦。但领导想要通过html标签做成模版,然后Flutter直接解析html标签加载,为啥不直接返回html,然后在通过native的webview加载?都是坑…
既然如此,那只能做吧,交互模型如下:
上述方案好处:html标签类型解析成Flutter控件是自动完成的,如果增加或减少某个字段,不用更改Flutter控件显示部分代码,只需要更爱html标签拼接部分即可。
根据模版类型来自动生成html的标签字符串,比如:
模版一:一行显示两个文本,一个标题,一个内容,如下所示
在垂直方向增加条数不会更改到Android代码,它会自动生成行文本显示,实现了可配置。
模版二:格式相似的展示方式。如下所示,都是文本加空格的展示方式。
这一类样式相同,可以在垂直或水平方向随意增加相同格式而不用改动Android代码,实现了可配置。
模版三:表格类型,如下所示:
表格类型可以增加一行,或者增加一列而不用改动Android代码,实现了可配置。
上述可以通过模版来灵活配置各种查询页面,配置由后台接口返回的数据控制,Android端不用更改代码,但如果增加一个模版类型,则需要更改Android端代码。组合示例如下:
代码就不贴了,直接看github源码吧: