定义Channel
package com.example.flutter_android
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
class MethodChannelDemo(messenger: BinaryMessenger): MethodChannel.MethodCallHandler {
private var channel: MethodChannel
init {
channel = MethodChannel(messenger, "com.flutter.guide.MethodChannel")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
if (call.method == "sendData") {
val name = call.argument("name") as String?
val age = call.argument("age") as Int?
val map = mapOf("name" to "hello,$name",
"age" to "$age"
)
result.success(map)
}
}
}
- call.method 字符串就是 invokeMethod 方法传入的 method。
- call.argument 是 invokeMethod 传入的参数,由于 Flutter 端传入的是 Map,所以上面的解析按照 Map 解析。
- result.success() 是返回给 Flutter 的结果。
在 MainActivity 启动
package com.example.flutter_android
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannelDemo(flutterEngine.dartExecutor.binaryMessenger)
}
}
Flutter端
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(const MethodChannelDemo());
}
class MethodChannelDemo extends StatefulWidget {
const MethodChannelDemo({Key? key}) : super(key: key);
@override
MethodChannelDemoState createState() => MethodChannelDemoState();
}
class MethodChannelDemoState extends State<MethodChannelDemo> {
var channel = const MethodChannel('com.flutter.guide.MethodChannel');
var data = 'No data';
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: Column(
children: [
const SizedBox(
height: 50,
),
TextButton(
child: const Text('发送数据到原生'),
onPressed: () async {
var result = await channel.invokeMethod(
'sendData', {'name': 'test', 'age': 18});
var name = result['name'];
var age = result['age'];
setState(() {
data = '$name,$age';
});
},
),
Text('原生返回数据:$data')
],
),
),
);
}
}