flutter原生定位,flutter 原生view

Android原生和Flutter使用過程的差異對比(二)

1、常用布局的對比

我們提供的服務有:成都網站建設、成都網站制作、微信公眾號開發、網站優化、網站認證、鳩江ssl等。為1000多家企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的鳩江網站制作公司

使用下來其他組件大致還算方便,但是相對布局而言使用便利程度上Android原生完勝,ConstraintLayout內部的所有子View可以設置互相之間的位置依賴關系。

而Flutter的Stack組件內部的Children只能通過外層包裹 Align后 固定位置,比如 Alignment.topLeft、Alignment.bottomRight 等。遇到復雜的堆疊布局需要通過外層包裹 Positioned 組件后設置固定的 top 和 left 距離以達到效果,內部子組件之間無法設置位置關聯關系。

2、一些常用屬性設置上的差異:

Margin外邊距

Android:直接在布局文件對View設置android:layout_marginStart、android:layout_marginTop

Flutter:需嵌套 Container 組件并在內部設置具體的 margin 值

Padding內邊距

Android:TextView、ImageView、各種Layout都可以直接在屬性上設置android:paddingStart

Flutter:需嵌套 Padding 組件并在內部設置具體的值

組件的可見性

Android:每個view都可以通過setVisibility來設置可見、隱藏或者隱藏但占位

Flutter:沒有單獨設置組件是否顯示的api,只能通過 bool 值控制是否添加該組件

事件監聽

Android:常規的setOnClickListener和setOnLongClickListener設置單擊和長按事件

Flutter:在需要添加事件監聽的組件外層嵌套 InkWell 或 GestureDetector 并設置 onTap 等

3、生命周期

Android:

Activity和Fragment各自有完整的生命周期鏈路onCreate、onStart、onResume、onPause、onDestroy等

Flutter:

萬物皆組件,組件繼承 WidgetsBindingObserver 并重寫 didChangeAppLifecycleState 函數進行監聽

退回桌面依次執行inactive 》= paused,此時界面不可見用戶不可操作,從桌面重新進入app執行resumed,狀態較少如需在某些條件下觸發特定操作可能要找別的方案,比如發通知之類的

Flutter與原生通信概述

flutter與原生通信主要有三種方式:MethodChannel、EventChannel、BasicMessageChannel,這三種方式均各有適用的場景:MethodChannel用于native與flutter的方法調用,EventChannel用于native單向的向flutter發送廣播消息,BasicMessageChannel用于native與flutter之間的消息互發。

MethodChannel用于雙方之間的方法互調,使用步驟是:

1.創建一個MethodChannel對象,傳入MethodChannel名稱。

2.使用setMethodHandle對對方調用自己的方法進行監聽,通過回調中的MethodCall對象方法名判斷、獲取方法參數,并且返回調用結果。

3.使用invokeMethod來調用對方的方法,可傳入方法名,方法參數,以及監聽對方的回調結果。

以下是示例:

需要注意的是,MethodChannel的名稱需要雙方保持一致,否則就不是同一個MethodChannel了。另外這里的方法調用并不是像Java里面反射那樣去先找到class示例對象再解析到相應的方法,而是將雙方互發的消息包裝成了MethodCall對象,拿到這個對象后通過MethodCall里面的方法名去判斷要做什么操作,并不是直接就調用了自身(native或flutter)相對應的方法。具體要做什么操作、調用什么方法還是得自己去調用和實現。

EventChannel適用于native向flutter發送廣播消息,只是單向的消息發送,native發,flutter收,返過來flutter并不能向native發送消息。例如native可將定位數據不斷的報給flutter,或者錄像數據等等,所有基于原生能力產生的數據都可以通過EventChannel進行發送。

步驟:

1.創建一個EventChannel對象,傳入EventChannel名稱。

2.flutter端調用receiveBroadcastStream進行廣播消息注冊,傳入arguments參數即為廣播名稱,此參數是告訴native端你要接受的廣播類型,判別是什么廣播發送的數據。

2.native調用setStreamHandler方法進行廣播消息監聽,onListen回調里會有一個arguments參數,這里及為flutter注冊的廣播類型,若flutter端沒有注冊,則native端不會收到這個回調,也就無法進行消息發送。收到flutter端的廣播注冊后,根據arguments可判斷廣播類型,然后根據EventChannel.EventSink來進行消息發送,EventSink.success()即可將消息發送給flutter端。

3.flutter進行廣播注冊會返回一個streamSubscription類型的對象,該對象可以進行消息的停止,native可在onCancel回調里面收到。

示例如下:

BasicMessageChannel就是比較常用的消息互發,使用步驟如下:

1.創建BasicMessageChannel對象,傳入BasicMessageChannel名稱。還需傳入編解碼方式(可以自己實現),系統提供了一些列的編解碼方式,后續會介紹到。

2.使用setMessageHandler方法進行消息監聽,也可進行回復。

3.使用send方法進行消息發送。

無論哪種方式的消息傳遞,最終都是將自定義數據轉化為二進制數據進行傳遞,flutter提供的編解碼方式分為MethodCodec和MessageCodec兩種,EventChannel和MethodChannel使用的就是MethodCodec,BasicMessageChannel使用的是MessageCodec。MethodCodec其實就是在MessageCodec的基礎上將數據包裝了一下,使其轉化為MethodCall對象方便使用。

MethodCodec源碼:

MethodCodec提供了兩種方式:JSONMethodCodec和StandardMethodCodec,前一種就是JSON和MethodCall對象之間的互轉,后一種則是根據傳入的數據基本類型(String,Integer等)來進行互轉。

MessageCodec則提供了四種方式,如下圖,具體就不詳細講述了,看看名字就知道是怎么回事,可以直接去看源碼。最常用和默認的就是StandardMessageCodec方式。

從上面的使用方式可以看出,每一種Channel在創建的時候都需要傳遞一個BinaryMessenger,這個接口可以在FlutterEngine里面拿到,因此需要在FlutterActivity里面實現configFlutterEngine方法里面重寫這個方法。FlutterActivity在attach FlutterEngine之后就會調用這個configFlutterEngine方法,通過flutterEngine.getPlugins().add(FlutterPlugin)方法可以FlutterPlugin的回調方法里進行數據的初始化和銷毀工作。如下圖

這個回調方法里的FlutterPluginBinding提供了一些我們可能會用到的對象,如下:

Flutter筆記-調用原生IOS高德地圖sdk

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跳轉原生頁面后的穿透問題

現象:

flutter頁面通過present跳轉原生頁面后,原生頁面上的點擊會首先響應下面的flutter頁面中的內容(比如按鈕什么的)。

這是flutter框架一直存在的一個bug。在github上有相關的issue。

原因推測:

推測是flutter對控制器(或者view)加了分類,重寫了控制器的點擊事件,用來計算是否在對應的點擊位置有flutter響應事件。沒有的話再扔出去點擊事件。

解決方案1:

在原生控制器中,加入點擊事件的幾個方法的空實現,用以覆蓋flutter框架中的實現:

-(void)touchesBegan:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

-(void)touchesMoved:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

-(void)touchesCancelled:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

-(void)touchesEnded:(NSSetUITouch * *)touches withEvent:(UIEvent *)event{

}

讓事件不被flutter截獲即可。

解決方案2:

直接切換window的根控制器到原生控制器即可。別忘暫時保存flutter控制器。

在返回時再切換回flutter中。

解決方案3:

在flutter跳轉到原生頁面之前,在flutter中加上一個蒙層,用來隔絕手勢往flutter下面的view傳遞。原生頁面返回flutter時再移除這個蒙層。

本文題目:flutter原生定位,flutter 原生view
本文URL:http://m.kartarina.com/article42/dseshhc.html

成都網站建設公司_創新互聯,為您提供電子商務用戶體驗靜態網站手機網站建設ChatGPT定制開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 久久天堂av综合色无码专区| 亚洲精品无码不卡在线播HE| 精品无码成人片一区二区| 亚洲精品av无码喷奶水糖心| 人妻系列无码专区久久五月天| 亚洲A∨无码一区二区三区| 精品国精品无码自拍自在线| 内射无码午夜多人| 亚洲中文久久精品无码1| 伊人久久无码精品中文字幕| 久久精品亚洲中文字幕无码网站| 无码h黄肉3d动漫在线观看| 亚洲国产精品无码AAA片| 国模无码视频一区| 亚洲av极品无码专区在线观看| h无码动漫在线观看| 亚洲AV无码一区二区三区网址| 日韩AV高清无码| 亚洲av无码天堂一区二区三区| 亚洲天然素人无码专区| 麻豆aⅴ精品无码一区二区 | 人妻少妇伦在线无码| 无码日韩精品一区二区免费暖暖| 人妻无码一区二区三区| 用舌头去添高潮无码视频 | 亚洲精品无码久久久久久久| 国产aⅴ无码专区亚洲av麻豆| 黄色成人网站免费无码av| 亚洲一区二区三区无码国产| 麻豆亚洲AV永久无码精品久久| 国产在线无码不卡影视影院| 国产无码一区二区在线| 国产一区二区三区无码免费 | 人妻无码一区二区三区| 国产精品无码免费视频二三区| 精品人妻系列无码人妻漫画| 免费无码A片一区二三区 | 天天看高清无码一区二区三区| 国产精品免费看久久久无码| 无码人妻少妇久久中文字幕| 黑人无码精品又粗又大又长|