Flutter与原生交互使用Platform Channel。Flutter定义了三种不同类型的Channel,它们分别是: :::info BasicMessageChannel:用于传递字符串和半机构化的信息(双向有返回值) ::: :::warning MethodChannel:用于传递方法调用(双向有返回值) :::
EventChannel:用于数据流(event streams)的通信(仅支持数据单向传递,无返回值)
三种Channel之间相互独立、各有用途,但是在设计上非常相近。每种Channel均有三个变量:
:::warning
name:String类型,代表Channel的名字,也是其唯一标识符
messager:BinaryMessager类型,代表消息信使,是消息的发送与接收的工具
codec:MessageCodec类型或MethodCodec类型,代表消息的编解码器
:::
MethodChannel
1、Flutter跳转到原生且携带参数
实现插件
public class FlutterPluginJumpToAct implements MethodChannel.MethodCallHandler {public static String CHANNEL = "com.jzhu.jump/plugin";static MethodChannel channel;private Activity activity;private FlutterPluginJumpToAct(Activity activity) {this.activity = activity;}public static void registerWith(PluginRegistry.Registrar registrar) {channel = new MethodChannel(registrar.messenger(), CHANNEL);FlutterPluginJumpToAct instance = new FlutterPluginJumpToAct(registrar.activity());//setMethodCallHandler在此通道上接收方法调用的回调channel.setMethodCallHandler(instance);}@Overridepublic void onMethodCall(MethodCall call, MethodChannel.Result result) {//通过MethodCall可以获取参数和方法名,然后再寻找对应的平台业务,本案例做了2个跳转的业务//接收来自flutter的指令oneActif (call.method.equals("oneAct")) {//跳转到指定ActivityIntent intent = new Intent(activity, OneActivity.class);activity.startActivity(intent);//返回给flutter的参数result.success("success");}//接收来自flutter的指令twoActelse if (call.method.equals("twoAct")) {//解析参数String text = call.argument("flutter");//带参数跳转到指定ActivityIntent intent = new Intent(activity, TwoActivity.class);intent.putExtra(TwoActivity.VALUE, text);activity.startActivity(intent);//返回给flutter的参数result.success("success");}else {result.notImplemented();}}}
插件注册
需要在继承了FlutterActivity中的Activity中注册
public class MainActivity extends FlutterActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);GeneratedPluginRegistrant.registerWith(this);registerCustomPlugin(this);}private static void registerCustomPlugin(PluginRegistry registrar) {FlutterPluginJumpToAct.registerWith(registrar.registrarFor(FlutterPluginJumpToAct.CHANNEL));FlutterPluginCounter.registerWith(registrar.registrarFor(FlutterPluginCounter.CHANNEL));}}
带参数跳转
//获取到插件与原生的交互通道static const jumpPlugin = const MethodChannel('com.jzhu.jump/plugin');Future<Null> _jumpToNative() async {String result = await jumpPlugin.invokeMethod('oneAct');print(result);}Future<Null> _jumpToNativeWithValue() async {Map<String, String> map = { "flutter": "这是一条来自flutter的参数" };String result = await jumpPlugin.invokeMethod('twoAct', map);print(result);}
2、原生发送参数给Flutter
实现插件
public class FlutterPluginCounter implements EventChannel.StreamHandler {public static String CHANNEL = "com.jzhu.counter/plugin";static EventChannel channel;private Activity activity;private FlutterPluginCounter(Activity activity) {this.activity = activity;}public static void registerWith(PluginRegistry.Registrar registrar) {channel = new EventChannel(registrar.messenger(), CHANNEL);FlutterPluginCounter instance = new FlutterPluginCounter(registrar.activity());channel.setStreamHandler(instance);}@Overridepublic void onListen(Object o, final EventChannel.EventSink eventSink) {Observable.interval(1000, TimeUnit.MILLISECONDS).subscribe(new Observer<Long>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Long aLong) {eventSink.success(aLong.intValue());}@Overridepublic void onError(Throwable e) {eventSink.error("计时器异常", "异常", e.getMessage());}@Overridepublic void onComplete() {}});}@Overridepublic void onCancel(Object o) {Log.i("FlutterPluginCounter", "FlutterPluginCounter:onCancel");}}
Flutter接收原生发送的参数
static const counterPlugin = const EventChannel('com.jzhu.counter/plugin');StreamSubscription _subscription = null;var _count;@overridevoid initState() {super.initState();//开启监听if(_subscription == null){_subscription = counterPlugin.receiveBroadcastStream().listen(_onEvent,onError: _onError);}}@overridevoid dispose() {super.dispose();//取消监听if(_subscription != null){_subscription.cancel();}}void _onEvent(Object event) {setState(() {_count = event;print("ChannelPage: $event");});}void _onError(Object error) {setState(() {_count = "计时器异常";print(error);});}
其他
Debug模式原生跳转到Flutter界面会出现白屏,Release包就不会出现这种情况
