新建一個Flutter工程,android模塊。
員工經過長期磨合與沉淀,具備了協作精神,得以通過團隊的力量開發出優質的產品。創新互聯堅持“專注、創新、易用”的產品理念,因為“專注所以專業、創新互聯網站所以易用所以簡單”。公司專注于為企業提供網站建設、成都做網站、微信公眾號開發、電商網站開發,重慶小程序開發公司,軟件專業公司等一站式互聯網企業服務。
1,只有一個Activity組件,它是Dart層繪制Widget的容器。
2,Application配置FlutterApplication。
應用Application配置io.flutter.app.FlutterApplication類,App首次啟動時,初始化。
調用FlutterMain.startInitialization()方法。
initConfig方法,從AndroidManfest.xml配置的applicaion節點獲取meta-data數據,初始化以下默認值。
這些值都是使用中用到的name,例如,抽取apk中asset資源時,flutter_assets打包目錄,打包產物data名稱。
initResources方法, 初始化資源。
在Flutter打包apk的asset目錄下,包括fluttter_asset目錄/資源項,將資源從apk中抽取,保存在 Context.getDir("flutter", 0) 目錄下。
/data/user/0/包名/app_flutter目錄。
在目錄中創建一個時間戳文件,根據apk版本和包信息記錄的lastUpdateTime更新時間,第二次啟動時,若apk未更新,不需要再次抽取。
加載so庫,libflutter.so,System.loadLibrary()。
主頁面繼承FlutterActivity,配置啟動模式singleTop。
FlutterActivity類在io.flutter.app包, (區別io.flutter.embedding.android包), 組件生命周期委托給FlutterActivityDelegate類。
組件啟動,onCreate方法。
FlutterMain.ensureInitializationComplete方法,確保資源成功抽取完成,創建FlutterView視圖(io.flutter.view),繼承SurfaceView類,setContentView方法,設置組件主布局即FlutterView視圖。
最后,根據Bundle路徑,runBundle()加載運行,
調用FlutterView的runFromBundle方法,入口點在dart的main方法,
通過FlutterNativeView,調用FlutterJNI的native方法。
nativeRunBundleAndSnapshotFromLibrary方法。
任重而道遠
在Tree中從上往下高效傳遞數據的基類widget , 定義為:abstract class InheritedWidget extends ProxyWidget
Flutter的響應式開發與React類似,數據都是自頂向下的。
假設有祖先組點A,中間經過結點B, C,然后到結點D,D需要從A中獲取數據f,那按照自頂向下數據流轉,f需要依次傳遞給B及C,最后才到C。這樣開發極為不靈活,成本也比較高。所有Flutter需要有跨結點(只能是祖先后代節點,不能跨兄弟節點)高效傳遞數據的方案。
大體意思如下:
InheritedWidget 是在樹中高效向下傳遞信息的基類部件;
調用[BuildContext.inheritFromWidgetOfExactType]方法可以從 BuildContext 中獲取到最近的 InheritedWidget 類型的實例;
在 InheritedWidget 類型的控件被引用,也就是調用過 inheritFromWidgetOfExactType 方法后,當 InheritedWidget 自身狀態改變時,會導致引用了 InheritedWidget 類型的子控件重構(rebuild)。
這里隨便定義一個人 Person 類。
創建一個類繼承 InheritedWidget,并實現 updateShouldNotify 方法。
之前說到調用[BuildContext.inheritFromWidgetOfExactType]方法可以從 BuildContext 中獲取到最近的 InheritedWidget 類型的實例,所以此處定義一個靜態的 of 方法,通過傳入的 context 獲取到最近的 InheriedDataWidget 實例。
1.定義數據模型
這里隨便定義一個 Person 類。
2.自定義 InheritedWidget 控件類
創建一個類繼承 InheritedWidget,并實現 updateShouldNotify 方法。
之前說到調用[BuildContext.inheritFromWidgetOfExactType]方法可以從 BuildContext 中獲取到最近的 InheritedWidget 類型的實例,所以此處定義一個靜態的 of 方法,通過傳入的 context 獲取到最近的 InheriedDataWidget 實例。
3.InheriedDataWidget 的使用
InheriedDataWidget 使用起來也很簡單,它本身也是一個控件,只要在任意一個頁面的子控件調用其構造方法就行,這里我們定義一個形如的 Widget 樹。
WidgetA 是一個 StatefulWidget 類型的控件,可以調用 setState 刷新,如果是繼承人 Stateless 類型的控件,那我們也可以通過 Stream 或者其他方式刷新數據,感興趣的請看[什么是 Stream? Dart
WidgetA1_1 類
WidgetA1_2 類
WidgetA1_3 類
當我們點擊 floatingActionButton 的時候,WidgetA1, WidgetA1_1, WidgetA1_2 的控件都會更新 Person 的信息,而且每點 floatingActionButton 一次, 當我們點擊 floatingActionButton 的時候,WidgetA1, WidgetA1_1, WidgetA1_2 的控件都會更新 Person 的信息,而且每點 floatingActionButton 一次,都會輸出:
如果我們試圖在和 WidgetA 的同一層級的兄弟節點去訪問 InheriedDataWidget 的 Person 數據,是不行的,因為父節點中并沒有插入 InheriedDataWidget。
把 WidgetB 和 WidgetA 保持同一節點
這也體現了 Inheried(遺傳) 這一單詞的特性,遺傳只存在于父子。兄弟不存在遺傳的關系。
這種數據共享的方式在某些場景還是很有用的,就比如說全局主題,字體大小,字體顏色的變更,只要在 App 根層級共享出這些配置數據,然后在觸發數據改變之后,所有引用到這些共享數據的地方都會刷新,這換主題,字體是不是就很輕松,事實上 Theme.of(context).primaryColor 之流就是這么干的。
以上就是有關InheritedWidget的使用。
自己也是從事Android開發5年有余了;整理了一些Android開發技術核心筆記和面經題綱,有關更多Android開發進階技術資料、面經題綱、核心技術筆記; 想要進階自己、拿高薪的同學請私信我回復“核心筆記”或“面試”領取!
2017年底因公司業務組合部門調整,新的團隊部分維護的項目用React Native技術混合開發。為適應環境變化,開啟瘋狂RN學習之旅,晚上回來啃資料看視頻。可能由于本身對RN技術體驗不感冒或者在環境之下強迫學習有點不爽。開始尋找代替方案,Fluter像一束曙光引起了我的注意,之后一直關注并利用閑余時間開始探索。2018年一直學習到使用Flutter寫項目,從0.2.0開始到現在1.5版本的發布,終于開始慢慢的爬出坑位了,但是因為部分控件感覺還是不如原生控件好用,因而Flutter提供了PlatformView部件。近期因項目中嚴重使用依賴地圖,故而做了Fluterr使用原生IOS高德地圖調研。因為我本身是一名android開發人員,初學IOS并記錄下來。
PlatformView是 flutter 官方提供的一個可以嵌入 Android 和 iOS 平臺原生 view 的小部件。
在我們實際開發中,我們遇到一些 flutter 官方沒有提供的插件可以自己創建編寫插件來實現部分功能,但是原生View在 flutter 中會遮擋住flutter 中的小部件,比如你想使用高德地圖sdk、視頻播放器、直播等原生控件,就無法很好的與 flutter 項目結合。
1、info.plist文件設置
2、 ios 端實現原生組件PlatformView提供原生view
3 、ios 端創建PlatformViewFactory用于生成PlatformView
4、 ios 端創建FlutterPlugin用于注冊原生組件
5 、flutter 平臺嵌入 原生view
iOS端的UiKitView目前還只是preview狀態, 默認是不支持的, 需要手動打開開關, 在info.plist文件中新增一行io.flutter.embedded_views_preview為true.
創建類 FlutterMapView 并實現FlutterPlatformView 協議
FlutterMapView.h
FlutterMapView.m
FlutterMapFactory.h
FlutterMapFactory.m
FlutterMapPlugin.h
FlutterMapPlugin.m
請前往 高德開放平臺控制臺 申請 iOS Key。
注意:Bundle Identifier需要與申請的時候填寫的一致
地圖依賴的庫列舉如下:
基礎 SDK AMapFoundationKit.framework
第一步:將解壓后的MAMapKit.framework 文件 copy 或 拖拽 到工程文件夾中,左側目錄選中工程名,在 TARGETS-Build Phases- Link Binary With Libaries 中點擊“+”按鈕,在彈出的窗口中點擊“Add Other”按鈕,選擇工程目錄下的 MAMapKit.framework 文件添加到工程中。
千萬不要忘記將AMapFoundationKit也一起加入工程。
3D地圖正確配置應如下圖所示:
需要引入的資源文件包括:AMap.bundle,其中:AMap.bundle 在 MAMapKit.framework 包中,AMap.bundle資源文件中存儲了定位、默認大頭針標注視圖等圖片,可利用這些資源圖片進行開發。
左側目錄中選中工程名,在右鍵菜單中選擇Add Files to “工程名”…,從MAMapKit.framework中選擇AMap.bundle文件,并勾選“Copy items if needed”復選框,單擊“Add”按鈕,將資源文件添加到工程中。
成功跑起來 。。 。
flutter中提供了Future.wait()函數,可以在執行多個異步請求之后有一個統一的回調結果,但是劣勢在于,每一個異步函數的函數體中都需要執行return去返回結果,如果在異步請求中,有多層success或者fail這種函數的嵌套,那么可能會在某個地方忽略掉retrun,導致沒有辦法拿到正確的結果。所以這里封裝了一個類似于js中Promise中的類去執行多個異步請求。
調用方式如下:
mrliuys.flutter.io/channel 這個是自由定義,且是全局唯一的,
當flutter需要用到的時候執行 invokeMethod ,
invokeMethod 帶兩個參數.
分享標題:flutter調用,Flutter調用android原生頁面
本文網址:http://vcdvsql.cn/article34/dsdjspe.html
成都網站建設公司_創新互聯,為您提供網站排名、自適應網站、搜索引擎優化、Google、定制開發、
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯