电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Flutter中嵌入Android 原生TextView實例教程

瀏覽:33日期:2022-09-22 15:17:06

前言

本篇文章 中寫到的是 flutter 調用了Android 原生的 TextView 案例

添加原生組件的流程基本上可以描述為:

1 android 端實現原生組件PlatformView提供原生view

2 android 端創建PlatformViewFactory用于生成PlatformView

3 android 端創建FlutterPlugin用于注冊原生組件

4 flutter 平臺嵌入 原生view

1 創建原生組件

創建在fLutter工程時會生成幾個文件夾,lib是放flutter工程代碼,android和ios文件夾分別是對應的雙平臺的原生工程。

在這里直接打開Android工程目錄,項目默認生成了GeneratedPluginRegistrant和MainActivity兩個文件,GeneratedPluginRegistrant不要動,GeneratedPluginRegistrant是flutter中配制使用其他插件時,程序在編譯時自動進行插件注冊使用的類。

在MainActivity的包下新建自定義View,Flutter的原生View不能直接繼承自View,需要實現提供的PlatformView接口:

public class TestTextView implements PlatformView r{private final TextView mTestTextView;/** * * @param context * @param messenger * @param id * @param params 初始化時 flutter 傳遞過來的參數 */TestTextView(Context context, BinaryMessenger messenger, int id, Map<String, Object> params) {//創建 TextViewTextView lTextView = new TextView(context);lTextView.setText('Android的原生TextView');this.mTestTextView = lTextView;//flutter 傳遞過來的參數if (params!=null&&params.containsKey('content')) {String myContent = (String) params.get('content');lTextView.setText(myContent);}}@Overridepublic View getView() {return mTestTextView;}@Overridepublic void dispose() {}}

2 創建PlatformViewFactory

import android.content.Context;import java.util.Map;import io.flutter.plugin.common.BinaryMessenger;import io.flutter.plugin.common.StandardMessageCodec;import io.flutter.plugin.platform.PlatformView;import io.flutter.plugin.platform.PlatformViewFactory;public class TestViewFactory extends PlatformViewFactory {private final BinaryMessenger messenger;public TestViewFactory(BinaryMessenger messenger) {super(StandardMessageCodec.INSTANCE);this.messenger = messenger;}/** * * @param context * @param id * @param args args是由Flutter傳過來的自定義參數 * @return */@SuppressWarnings('unchecked')@Overridepublic PlatformView create(Context context, int id, Object args) {//flutter 傳遞過來的參數Map<String, Object> params = (Map<String, Object>) args;//創建 TestTextViewreturn new TestTextView(context, messenger, id, params);}

3 創建Plugin并在ManActivity中注冊插件

/** * flutter 調用 android 原生view * */public class TestFluttertoAndroidTextViewPlugin {public static void registerWith(PluginRegistry registry) {//防止多次注冊final String key = TestFluttertoAndroidTextViewPlugin.class.getCanonicalName();if (registry.hasPlugin(key)) return;//初始化 PluginRegistryPluginRegistry.Registrar registrar = registry.registrarFor(key);//設置標識registrar.platformViewRegistry().registerViewFactory('com.flutter_to_native_test_textview', new TestViewFactory(registrar.messenger()));}}

MainActivity 中注冊

import android.os.Bundleimport io.flutter.app.FlutterActivityimport io.flutter.plugins.FlutterToAndroidPluginsimport io.flutter.plugins.GeneratedPluginRegistrantclass MainActivity: FlutterActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //flutter 項目工程中默認生成的 GeneratedPluginRegistrant.registerWith(this) //這是我們新創建的插件 TestFluttertoAndroidTextViewPlugin.registerWith(this) } override fun onDestroy() { super.onDestroy() }}

4 flutter頁面中嵌入android 原生Textview

4.1 最簡單的調用

Flutter中嵌入Android 原生TextView實例教程

//這里設置的 viewType值與 android 中插件注冊的標識 一至//registrar.platformViewRegistry().registerViewFactory('com.flutter_to_native_test_textview', new TestViewFactory(registrar.messenger()));mTextWidget = Container( height: 200, child: AndroidView( //設置標識 viewType: 'com.flutter_to_native_test_textview', ), );@override Widget build(BuildContext context) { // TODO: implement build return Scaffold( appBar: appBar, //顯示的頁面 body: mTextWidget, ); }

4.2 flutter 調用 原生view并傳參數

Flutter中嵌入Android 原生TextView實例教程

mTextWidget = Container( height: 200, child: AndroidView( //標識 viewType: 'com.flutter_to_native_test_textview', creationParams: { 'content': 'flutter 傳入的文本內容', }, //參數的編碼方式 creationParamsCodec: const StandardMessageCodec(), ), );

android 原生中的接收(只會接收一次)

... ...TestTextView(Context context, BinaryMessenger messenger, int id, Map<String, Object> params) {... ..//flutter 傳遞過來的參數if (params!=null&&!params.isEmpty()&&params.containsKey('content')) {String myContent = (String) params.get('content');lTextView.setText(myContent);}... ...}

4.3 flutter 更新 原生view 中的數據

原生組件初始化的參數并不會隨著setState重復賦值,可以通過MethodCall來實現更新數據。

首先讓原生view組件實現MethodCallHandler接口:

public class TestTextView implements PlatformView , MethodChannel.MethodCallHandler{private final TextView mTestTextView;TestTextView(Context context, BinaryMessenger messenger, int id, Map<String, Object> params) {... ...//com.flutter_to_native_test_view_ 是更新數據的通信標識MethodChannel methodChannel = new MethodChannel(messenger, 'com.flutter_to_native_test_textview_' + id);methodChannel.setMethodCallHandler(this);}... ...@Overridepublic void onMethodCall(MethodCall methodCall, MethodChannel.Result result) { //updateText 是flutter 中調用的方法名稱,可以隨意定義if ('updateText'.equals(methodCall.method)) {String text = (String) methodCall.arguments;this.mTestTextView .setText(text);//對flutter 的回調result.success(null);}}}

flutter 中調用 android 原生view

MethodChannel _channel; int viewId=0;

mTextWidget = Container( height: 200, child: AndroidView( //標識 viewType: 'com.flutter_to_native_test_textview', creationParams: { 'content': 'flutter 傳入的文本內容', }, //參數的編碼方式 creationParamsCodec: const StandardMessageCodec(), //view創建完成時的回調 onPlatformViewCreated: (id) { viewId = id; }, ), );

更新數據

//這里設置的標識 MethodChannel(’com.flutter_to_native_test_textview_$viewId’);// 與android MethodChannel methodChannel = new MethodChannel(messenger, 'com.flutter_to_native_test_textview_' + id); 中注冊的一至void clickUpdtae(){_channel = new MethodChannel(’com.flutter_to_native_test_textview_$viewId’); updateTextView();}//這里的標識 updateText//與android 中接收消息的方法中//if ('updateText'.equals(methodCall.method)) {...} 一至void updateTextView() async { return _channel.invokeMethod(’updateText’, '更新內容'); }

通過onPlatformViewCreated回調,監聽原始組件成功創建,并能夠在回調方法的參數中拿到當前組件的id,這個id是系統隨機分配的,然后通過這個分配的id加上我們的組件名稱最為前綴創建一個和組件通訊的MethodChannel,拿到channel對象之后就可以通過invokeMethod方法向原生組件發送消息了,這里這里調用的是‘updateText’這個方法,參數是一個String

總結

到此這篇關于Flutter中嵌入Android 原生TextView實例教程的文章就介紹到這了,更多相關Flutter嵌入Android 原生TextView內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | 次氯酸钠厂家,涉水级次氯酸钠,三氯化铁生产厂家-淄博吉灿化工 | 电缆隧道在线监测-智慧配电站房-升压站在线监测-江苏久创电气科技有限公司 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 不锈钢螺丝 - 六角螺丝厂家 - 不锈钢紧固件 - 万千紧固件--紧固件一站式采购 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 广东风淋室_广东风淋室厂家_广东风淋室价格_广州开源_传递窗_FFU-广州开源净化科技有限公司 | 咖啡加盟,咖啡店加盟连锁品牌-卡小逗 | 防火卷帘门价格-聊城一维工贸特级防火卷帘门厂家▲ | 信阳网站建设专家-信阳时代网联-【信阳网站建设百度推广优质服务提供商】信阳网站建设|信阳网络公司|信阳网络营销推广 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 手持式浮游菌采样器-全排二级生物安全柜-浙江孚夏医疗科技有限公司 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 西安微信朋友圈广告投放_微信朋友圈推广_西安度娘网络科技有限公司 | 温室大棚建设|水肥一体化|物联网系统 | SOUNDWELL 编码器|电位器|旋转编码器|可调电位器|编码开关厂家-广东升威电子制品有限公司 | 苏州同创电子有限公司 - 四探针测试仪源头厂家 | 百度关键词优化_网站优化_SEO价格 - 云无限好排名 | 原子吸收设备-国产分光光度计-光谱分光光度计-上海光谱仪器有限公司 | 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 华夏医界网_民营医疗产业信息平台_民营医院营销管理培训 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 危废处理系统,水泥厂DCS集散控制系统,石灰窑设备自动化控制系统-淄博正展工控设备 | 吹田功率计-长创耐压测试仪-深圳市新朗普电子科技有限公司 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 学习安徽网| 金库门,金库房,金库门厂家,金库门价格-河北特旺柜业有限公司 |