詳解Flutter 調用 Android Native 的方法
Flutter 調用 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,來響應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是否調用的是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 {
//調用native方法,返回首頁
var content = textEditingController.text;
Map<String, dynamic> map = {"content": content};
var result = await _methodMessageChannel.invokeMethod("saveNote", map);
print("result $result");
}
以上就是Flutter 調用 Android Native 的方法的過程,有時間再分析下他們的實現(xiàn)原理
待續(xù)....
附,我當前的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
到此這篇關于詳解Flutter 調用 Android Native 的方法的文章就介紹到這了,更多相關Flutter 調用Android Native內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于android studio通過命令行運行gradle編譯命令的問題
這篇文章主要介紹了關于android studio通過命令行運行gradle編譯命令的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11
6步輕松實現(xiàn)兩個listView聯(lián)動效果
這篇文章主要為大家詳細介紹了教大家通過6步輕松實現(xiàn)兩個listView聯(lián)動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
Java Base64位編碼與String字符串的相互轉換,Base64與Bitmap的相互轉換實例代碼
這篇文章主要介紹了Java Base64位編碼與String字符串的相互轉換,Base64與Bitmap的相互轉換實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03
Android 多種dialog的實現(xiàn)方法(推薦)
下面小編就為大家分享一篇Android 多種dialog的實現(xiàn)方法(推薦),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01

