做爲剛開始接觸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的同窗也更友好。框架地址,歡迎你們試用。