詳解Flutter 調(diào)用 Android Native 的方法
Flutter 調(diào)用 Android Native 的方法,是通過(guò)MethodChannel的方式來(lái)實(shí)現(xiàn)的:
在Android端:
- 創(chuàng)建一個(gè)Class,實(shí)現(xiàn)FlutterPlugin和MethodCallHandler接口
- 重寫(xiě)onAttachedToEngine(),onDetachedFromEngine(),onMethodCall()
- onAttachedToEngine()中,根據(jù)自定義的CHANNEL_NAME創(chuàng)建MethodChannel, onDetachedFromEngine中,釋放MethodChannel
- onMethodCall中,通過(guò)自定義的METHOD_NAME,來(lái)響應(yīng)Flutter中,invokeMethod對(duì)Native的通信,代碼如下
class MethodChannelPlugin : FlutterPlugin, MethodChannel.MethodCallHandler { private var methodChannel: MethodChannel? = null private var mNoteForFlutterListener: NoteForFlutterListener? = null companion object { private const val CHANNEL_NAME = "method_channel" private const val METHOD_NAME = "saveNote" val instance: MethodChannelPlugin by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { MethodChannelPlugin() } } override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { methodChannel = MethodChannel(binding.binaryMessenger, CHANNEL_NAME) methodChannel?.setMethodCallHandler(this) } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { methodChannel?.setMethodCallHandler(null) methodChannel = null } override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { if (call.method == METHOD_NAME) { val content = call.argument<String>("content") mNoteForFlutterListener?.sendData(content!!) result.success("success") } else { result.notImplemented() } } fun setListener(noteForFlutterListener: NoteForFlutterListener) { mNoteForFlutterListener = noteForFlutterListener }
在Flutter端:
- 根據(jù)Native中定義的METHOD_NAME來(lái)創(chuàng)建MethodChannel
- 通過(guò)MethodChannel.invokeMethod(METHOD_NAME,params),參數(shù)METHOD_NAME為Native中定義的METHOD_NAME,params為傳遞的參數(shù),就可以和Native進(jìn)行通信了,在Native的onMethodCall方法中,通過(guò)call.method == METHOD_NAME來(lái)確定,F(xiàn)lutter是否調(diào)用的是Native中定義的METHOD_NAME的方法,代碼如下
class NoteMainFulState extends State<NoteMainFul> { //flutter 和 native 通信 static const _methodMessageChannel = MethodChannel("method_channel"); TextField textField; TextEditingController textEditingController; @override Widget build(BuildContext context) { return Scaffold( body: Container( margin: EdgeInsets.fromLTRB(20.0, 60.0, 20.0, 20.0), child: Column( children: [ Container( child: Column( children: [ textField = TextField( //去掉下劃線 decoration: InputDecoration(border: InputBorder.none), enabled: true, controller: textEditingController = NoteTextEditingController(), keyboardType: TextInputType.multiline, textInputAction: TextInputAction.newline, maxLines: null, ), RichText( text: TextSpan(), ), ], ), ), Container( color: Colors.deepPurple, height: 50, child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ GestureDetector( child: Icon( Icons.forward, ), onTap: clickOut, ) ], ), ) ], ), ), ); } void clickOut() async { //調(diào)用native方法,返回首頁(yè) var content = textEditingController.text; Map<String, dynamic> map = {"content": content}; var result = await _methodMessageChannel.invokeMethod("saveNote", map); print("result $result"); }
以上就是Flutter 調(diào)用 Android Native 的方法的過(guò)程,有時(shí)間再分析下他們的實(shí)現(xiàn)原理
待續(xù)....
附,我當(dāng)前的Flutter版本是 :
Flutter 1.22.3 • channel stable • https://github.com/flutter/flutter
Framework • revision 8874f21e79 (3 months ago) • 2020-10-29 14:14:35 -0700
Engine • revision a1440ca392
Tools • Dart 2.10.3
到此這篇關(guān)于詳解Flutter 調(diào)用 Android Native 的方法的文章就介紹到這了,更多相關(guān)Flutter 調(diào)用Android Native內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于android studio通過(guò)命令行運(yùn)行g(shù)radle編譯命令的問(wèn)題
這篇文章主要介紹了關(guān)于android studio通過(guò)命令行運(yùn)行g(shù)radle編譯命令的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-116步輕松實(shí)現(xiàn)兩個(gè)listView聯(lián)動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了教大家通過(guò)6步輕松實(shí)現(xiàn)兩個(gè)listView聯(lián)動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Rxjava實(shí)現(xiàn)發(fā)送驗(yàn)證碼倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了Rxjava實(shí)現(xiàn)發(fā)送驗(yàn)證碼倒計(jì)時(shí)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Java Base64位編碼與String字符串的相互轉(zhuǎn)換,Base64與Bitmap的相互轉(zhuǎn)換實(shí)例代碼
這篇文章主要介紹了Java Base64位編碼與String字符串的相互轉(zhuǎn)換,Base64與Bitmap的相互轉(zhuǎn)換實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03Android 輕松實(shí)現(xiàn)語(yǔ)音識(shí)別詳解及實(shí)例代碼
這篇文章主要介紹了Android 輕松實(shí)現(xiàn)語(yǔ)音識(shí)別的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下2016-09-09Android自定義滾動(dòng)選擇器實(shí)例代碼
本篇文章主要介紹了Android自定義滾動(dòng)選擇器實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01Android Studio如何快速導(dǎo)入jar和.so文件
這篇文章主要介紹了Android Studio如何快速導(dǎo)入jar和.so文件的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-12-12Android中正確使用字體圖標(biāo)(iconfont)的方法
IconFont字體不僅僅流行于Web開(kāi)發(fā),在移動(dòng)開(kāi)發(fā)中也漸漸的使用的范圍更廣泛。這篇文章主要介紹了在Android開(kāi)發(fā)中使用icon font的代碼和方法。對(duì)大家學(xué)習(xí)使用iconfont有一定的參考借鑒價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2016-10-10Android 多種dialog的實(shí)現(xiàn)方法(推薦)
下面小編就為大家分享一篇Android 多種dialog的實(shí)現(xiàn)方法(推薦),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01