Android端代码
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.frameLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import io.flutter.embedding.android.FlutterView;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.embedding.engine.dart.DartExecutor;
import io.flutter.plugin.common.BasicMessageChannel;
public class FlutterAppActivity extends AppCompatActivity implements MessageIO {
public final static String INIT_PARAMS = "initParams";
private BasicMessageChannelPlugin basicMessageChannelPlugin;
private EventChannelPlugin eventChannelPlugin;
private FlutterEngine flutterEngine;
private EditText ed;
private FlutterView flutterView;
public static void start(Context context, String initParams) {
Intent intent = new Intent(context, FlutterAppActivity.class);
intent.putExtra(INIT_PARAMS, initParams);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.flutter_app_activity);
initView();
initRegiest();
initListener();
}
private void initRegiest() {
eventChannelPlugin = EventChannelPlugin.registerWith(flutterEngine, this);
MethodChannelPlugin.registerWith(flutterView, flutterEngine, this);
basicMessageChannelPlugin = BasicMessageChannelPlugin.registerWith(flutterView, flutterEngine, this);
}
private void initView() {
String initParams = getIntent().getStringExtra(INIT_PARAMS);
flutterView = new FlutterView(this);//Flutter.createView(this, getLifecycle(), initParams);
frameLayout.LayoutParams layout =
new frameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
frameLayout rootLayout = findViewById(R.id.f_root);
rootLayout.addView(flutterView, layout);
// 关键代码,将Flutter页面显示到FlutterView中
flutterEngine = new FlutterEngine(this);
flutterEngine.getDartExecutor().executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
);
flutterView.attachToFlutterEngine(flutterEngine);
ed = findViewById(R.id.ed);
}
private void initListener() {
findViewById(R.id.eventChanne).setonClickListener(new View.onClickListener() {
@Override
public void onClick(View v) {
eventChannelPlugin.send(ed.getText().toString());
}
});
findViewById(R.id.basicMessageChannel).setonClickListener(new View.onClickListener() {
@Override
public void onClick(View v) {
basicMessageChannelPlugin.send(ed.getText().toString(), new BasicMessageChannel.Reply() {
@Override
public void reply(@Nullable String reply) {
Log.e("","");
}
});
}
});
}
@Override
public void onShowMessage(String message) {
Toast.makeText(this, "Android收到消息 "+message, Toast.LENGTH_LONG).show();
}
@Override
protected void onResume() {
super.onResume();
flutterEngine.getLifecycleChannel().appIsResumed();
}
@Override
protected void onPause() {
super.onPause();
flutterEngine.getLifecycleChannel().appIsInactive();
}
@Override
protected void onStop() {
super.onStop();
flutterEngine.getLifecycleChannel().appIsPaused();
}
}
import android.app.Activity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.embedding.android.FlutterView;
public class MethodChannelPlugin implements MethodCallHandler {
private Activity activity;
private MessageIO messageIO;
public static void registerWith(FlutterView flutterActivity, FlutterEngine flutterEngine, MessageIO messageIO) {
MethodChannel channel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "MethodChannelPlugin");
MethodChannelPlugin instance = new MethodChannelPlugin((Activity) flutterActivity.getContext(), messageIO);
channel.setMethodCallHandler(instance);
}
private MethodChannelPlugin(Activity activity, MessageIO messageIO) {
this.activity = activity;
this.messageIO = messageIO;
}
@Override
public void onMethodCall(MethodCall call, Result result) {
switch (call.method) {//处理来自Dart的方法调用
case "send":
result.success("收到来自Dart的数据:" + call.arguments);//返回结果给Dart
messageIO.onShowMessage(call.arguments());
break;
default:
result.notImplemented();
}
}
}
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.EventChannel;
public class EventChannelPlugin implements EventChannel.StreamHandler {
private EventChannel.EventSink eventSink;
private MessageIO messageIO;
static EventChannelPlugin registerWith(FlutterEngine flutterEngine, MessageIO messageIO) {
EventChannelPlugin plugin = new EventChannelPlugin(messageIO);
new EventChannel(flutterEngine.getDartExecutor().getBinaryMessenger(),"EventChannelPlugin").setStreamHandler(plugin);
return plugin;
}
private EventChannelPlugin( MessageIO messageIO) {
this.messageIO = messageIO;
}
void send(Object params) {
if (eventSink != null) {
eventSink.success(params);
}
}
@Override
public void onListen(Object args, EventChannel.EventSink eventSink) {
this.eventSink = eventSink;
}
@Override
public void onCancel(Object o) {
eventSink = null;
}
}
import android.app.Activity;
import android.util.Log;
import io.flutter.embedding.android.FlutterView;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.BasicMessageChannel;
import io.flutter.plugin.common.StringCodec;
public class BasicMessageChannelPlugin implements
BasicMessageChannel.MessageHandler, BasicMessageChannel.Reply {
private final Activity activity;
private final BasicMessageChannel messageChannel;
private MessageIO messageIO;
static BasicMessageChannelPlugin registerWith(FlutterView flutterView, FlutterEngine flutterEngine, MessageIO messageIO) {
return new BasicMessageChannelPlugin(flutterView, flutterEngine, messageIO);
}
private BasicMessageChannelPlugin(FlutterView flutterView, FlutterEngine flutterEngine, MessageIO messageIO) {
this.activity = (Activity) flutterView.getContext();
this.messageChannel = new BasicMessageChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "BasicMessageChannelPlugin", StringCodec.INSTANCE);
//设置消息处理器,处理来自Dart的消息
messageChannel.setMessageHandler(this);
this.messageIO = messageIO;
}
@Override
public void onMessage(String s, BasicMessageChannel.Reply reply) {//处理Dart发来的消息
// reply.reply("BasicMessageChannel收到:" + s);//可以通过reply进行回复
messageIO.onShowMessage(s);
// Log.e("","BasicMessageChannel收到:" + s);
}
void send(String message, BasicMessageChannel.Reply callback) {
messageChannel.send(message, callback);
}
@Override
public void reply(String s) {
Log.e("","");
}
}
Flutter端代码
import 'dart:async';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp(initParams: window.defaultRouteName));
class MyApp extends StatelessWidget {
final String? initParams;
const MyApp({Key? key, this.initParams}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter 混合开发',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter 混合开发', initParams: this.initParams),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title, required this.initParams})
: super(key: key);
final String title;
final String? initParams;
@override
State createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
String showMessage = "";
String _basicMessageChannelMessage = "";
String _eventChannelMessage = "";
static const EventChannel _eventChannelPlugin =
EventChannel('EventChannelPlugin');
StreamSubscription? streamSubscription;
static const MethodChannel _methodChannelPlugin =
const MethodChannel('MethodChannelPlugin');
static const BasicMessageChannel _basicMessageChannel =
const BasicMessageChannel('BasicMessageChannelPlugin', StringCodec());
_sendMethodChannelMessage() async {
String response =
await _methodChannelPlugin.invokeMethod('send', 'MethodMessage 嘿嘿嘿');
}
_sendBasicMessageChannel() async {
var response = await _basicMessageChannel.send('BasicMessageChannel 哈哈哈');
this._basicMessageChannelMessage = response.toString();
}
_sendEventChannelMessage() async {
var response = await _basicMessageChannel.send('EventMessageChannel 6666');
this._eventChannelMessage = response.toString();
}
@override
void initState() {
streamSubscription = _eventChannelPlugin
.receiveBroadcastStream('嘿嘿嘿')
.listen(_onToDart, onError: _onToDartError);
//使用BasicMessageChannel接受来自Native的消息,并向Native回复
_basicMessageChannel.setMessageHandler((message) async {
// var response = await _basicMessageChannel.send('送Dart发送消息给 Native');
setState(() {
this._basicMessageChannelMessage = message!;
});
return "收到Native的消息222:" + message!;
});
super.initState();
}
void _onToDart(message) {
setState(() {
this._eventChannelMessage = message;
});
}
void _onToDartError(error) {
print(error);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Container(
child: Column(
// Codrizontal).
children: [
Row(
children: [
InkWell(
onTap: () {
this._sendMethodChannelMessage();
},
child: Text("MethodChannel 发送消息"),
)
],
),
Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
InkWell(
onTap: () {
this._sendBasicMessageChannel();
},
child: Text("BasicChannel 发送消息"),
),
Text('Basic收到消息 = ' + _basicMessageChannelMessage)
],
),
Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
InkWell(
onTap: () {
this._sendEventChannelMessage();
},
child: Text("event 发送消息"),
),
Text('event收到消息 = ' + _eventChannelMessage)
],
)
],
),
),
);
}
}



