dart调用android方法,详解Flutter 调用 Android Native 的方法

ebb0cd79d49cf6d02b168bc4f5dda777.png

Flutter 调用 Android Native 的方法,是通过MethodChannel的方式来实现的:

在Android端:

创建一个Class,实现FlutterPlugin和MethodCallHandler接口

重写onAttachedToEngine(),onDetachedFromEngine(),onMethodCall()

onAttachedToEngine()中,根据自定义的CHANNEL_NAME创建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("content")

mNoteForFlutterListener?.sendData(content!!)

result.success("success")

} else {

result.notImplemented()

}

}

fun setListener(noteForFlutterListener: NoteForFlutterListener) {

mNoteForFlutterListener = noteForFlutterListener

}

在Flutter端:

根据Native中定义的METHOD_NAME来创建MethodChannel

通过MethodChannel.invokeMethod(METHOD_NAME,params),参数METHOD_NAME为Native中定义的METHOD_NAME,params为传递的参数,就可以和Native进行通信了,在Native的onMethodCall方法中,通过call.method == METHOD_NAME来确定,Flutter是否调用的是Native中定义的METHOD_NAME的方法,代码如下

class NoteMainFulState extends State {

//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 map = {"content": content};

var result = await _methodMessageChannel.invokeMethod("saveNote", map);

print("result $result");

}

以上就是Flutter 调用 Android Native 的方法的过程,有时间再分析下他们的实现原理

待续....

附,我当前的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内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值