您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)如何在Flutter中調(diào)用 Android中的Native方法,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Flutter 調(diào)用 Android Native 的方法,是通過MethodChannel的方式來實現(xiàn)的:
在Android端:
創(chuàng)建一個Class,實現(xiàn)FlutterPlugin和MethodCallHandler接口
重寫onAttachedToEngine(),onDetachedFromEngine(),onMethodCall()
onAttachedToEngine()中,根據(jù)自定義的CHANNEL_NAME創(chuàng)建MethodChannel, onDetachedFromEngine中,釋放MethodChannel
onMethodCall中,通過自定義的METHOD_NAME,來響應(yīng)Flutter中,invokeMethod對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來創(chuàng)建MethodChannel
通過MethodChannel.invokeMethod(METHOD_NAME,params),參數(shù)METHOD_NAME為Native中定義的METHOD_NAME,params為傳遞的參數(shù),就可以和Native進行通信了,在Native的onMethodCall方法中,通過call.method == METHOD_NAME來確定,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方法,返回首頁 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方法,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。