序言
這次開發(fā)的App跟BLE Beacon相關(guān),原生負(fù)責(zé)搜索附近的Beacon數(shù)據(jù)并上報到服務(wù)器,F(xiàn)lutter端作為信息展示。本來兩邊是涇渭分明的,但是原生這邊需要獲取到Flutter端請求的Token作為服務(wù)器身份驗證。于是有了這篇最簡單的數(shù)據(jù)交互方法。
1.SharedPreferences
本來打算按部就班的按照 Flutter與原生(Android)的交互 實現(xiàn)交互方法的。跟前端小伙伴簡單溝通了下,發(fā)現(xiàn)Flutter端是使用名為SharedPreferences的插件保存Token的。作為Android 開發(fā)者,對這個名字應(yīng)該相當(dāng)熟悉了。如果它的機制跟Android 原生的SharedPreferences一樣保存為本地Xml,那我豈不是連交互方法都不用寫就能獲取到他的Token了。
2.分析源碼
這里是SharedPreferences的源碼地址
從目錄可以看到其實這個Flutter插件本質(zhì)也只是一個Flutter項目,android 與 ios 文件夾分別對應(yīng)不同的實現(xiàn)。我們進到android目錄下看看到底是怎么實現(xiàn)的。
這個插件的實現(xiàn)還是比較簡單的,SharedPreferencesPlugin就是核心類
這個類實現(xiàn)了MethodCallHandler,通過android.content.SharedPreferences給Flutter端暴露相關(guān)get put 方法,可以看到SP的文件名即是FlutterSharedPreferences
向前端小伙伴要了key,在原生這邊嘗試讀取這個token
sharedPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE)
val token = sharedPreferences.getString("accesstoken", "null")
正當(dāng)自信滿滿的以為能成功讀取發(fā)現(xiàn)拿到的String居然為null,這不合理呀。
不過沒關(guān)系,SharedPreferences是保存在data 里面 shared_prefs 文件夾內(nèi)
打開手機目錄data/data/com..../shared_prefs 看到確實存在FlutterSharedPreferences.xml文件
原來默認(rèn)在前面加了一個flutter.前綴,只掃了兩眼源碼粗心忽略了...補上一個前綴就可以正常讀取了
附上IOS端的實現(xiàn),也比較簡單只是使用了NSUserDefaults
3.尾語
這個方法雖然簡單,局限性也很大。不過很適合我這種場景,我始終認(rèn)為方法千千萬,沒必要一定按照常規(guī)做法,適合自己的才是好方法。