Flutter与原生Activity之间的通信
一、消息传递
1、在activity中注册消息通道
class OneActivity : Activity() {
var messageChannel: BasicMessageChannel<String>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//确保初始化完成 参数二:可传数据args数组
FlutterMain.ensureInitializationComplete(applicationContext, null)
setContentView(R.layout.activity_one)
var flutterRunArguments = FlutterRunArguments()
//绑定路径
flutterRunArguments.bundlePath = FlutterMain.findAppBundlePath(applicationContext)
//获取入口 main方法
flutterRunArguments.entrypoint = "main"
//指定启动one_page页,需要在dart文件中注册Route路径为"one_page"
flutter_view_1.setInitialRoute("one_page")
//flutterview 运行设置绑定
flutter_view_1.runFromBundle(flutterRunArguments)
//设置消息频道
messageChannel = BasicMessageChannel(flutter_view_1, "channel_name", StringCodec.INSTANCE)
messageChannel?.setMessageHandler(object : BasicMessageChannel.MessageHandler<String> {
override fun onMessage(p0: String?, p1: BasicMessageChannel.Reply<String>?) {
Log.e("setMessageHandler",p0)
p1?.reply("")
}
})
//延时发送,确保页面初始化完成后发送数据
Handler().postDelayed({kotlin.run {
messageChannel?.send("from one message")
}},2000)
}
override fun onPause() {
super.onPause()
flutter_view_1.onPause()
}
override fun onPostResume() {
super.onPostResume()
flutter_view_1.onPostResume()
}
}
①:注册消息通道
/**
* 初始化通信通道
* 参数一:FlutterView实例对象
* 参数二:消息通道名字(key)
* 参数三:消息解码器(用于处理通信消息类型)
*/
val messageChannel = BasicMessageChannel(flutter_view_1, "channel_name", StringCodec.INSTANCE)
②:处理来自Flutter中的消息
//处理来自Flutter中发送的消息
messageChannel?.setMessageHandler(object : BasicMessageChannel.MessageHandler<String> {
override fun onMessage(p0: String?, p1: BasicMessageChannel.Reply<String>?) {
......//具体处理接收到的从Flutter中发送的消息 p0
p1?.reply("")
}
})
③:发送消息给Flutter
messageChannel?.send("from one message")
2、在dart文件中注册消息通道
import 'package:flutter/material.dart';//新建dart文件页面需要导入的包
import 'package:flutter/services.dart';//消息通道需要导入的包
//可刷新数据的页面需要继承StatefulWidget
class OnePage extends StatefulWidget {
@override
_OnePageState createState() => _OnePageState();
}
class _OnePageState extends State<OnePage> {
//注册信息通道
static const BasicMessageChannel<String> platform =
BasicMessageChannel<String>("channel_name", StringCodec());//注意参数要和activity中一致
String message = "德玛西亚";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Sample App"),
),
body: Center(child: Text(message))
);
}
Future<String> _handleMessage(String message) async {
setState(() {
this.message = message;
});
return "";
}
//接收到Android activity发送到消息 处理消息
@override
void initState() {
super.initState();
platform.setMessageHandler(_handleMessage);
}
}
或
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
//不刷新页面数据
class OnePage extends StatelessWidget {
static const BasicMessageChannel<String> messageChannel=
BasicMessageChannel<String>("channel_name", StringCodec());
@override
Widget build(BuildContext context) {
messageChannel.setMessageHandler(_handleMessage);
return Scaffold(
appBar: AppBar(
title: Text("Sample App"),
),
body: Center(child: Text("德玛"))
);
}
Future<String> _handleMessage(String message) async {
print("===== 接收到了:$message");
return "";
}
}
①:注册消息通道
//注册信息通道
static const BasicMessageChannel<String> messageChannel=
BasicMessageChannel<String>("channel_name", StringCodec());//注意参数要和activity中一致
②:处理接收到的消息
//接收到Android activity发送到消息 处理消息
messageChannel.setMessageHandler(_handleMessage);
Future<String> _handleMessage(String message) async {
setState(() {
this.message = message;
});
return "";
}
③:发送消息到Activity
messageChannel.send("from flutter message");
二、Flutter启动新页面
1、启动Flutter页面
import 'package:flutter/material.dart';
import 'package:flutter_app/one.dart';
import 'package:flutter_app/test.dart';
void main() {
runApp(FlutterView());
}
class FlutterView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'FlutterView',
theme: ThemeData(primarySwatch: Colors.blue),
home: MyHomePage(),
routes: <String, WidgetBuilder> {
'first_page': (BuildContext context) => FirstPage(),
'one_page' : (BuildContext context) => OnePage(),
}
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
Expanded(
child: Center(
child: Text(
'德玛西亚',
style: const TextStyle(fontSize: 17.0),
),
),
),
RaisedButton(
child: const Text('one_page'),
onPressed: () {
Navigator.of(context).pushNamed("one_page");
},
),
RaisedButton(
child: const Text('first_page'),
onPressed: () {
Navigator.of(context).pushNamed("first_page");
},
),
],
),
);
}
}
①:启动Flutter页面
Navigator.of(context).pushNamed(route);//传入在routes中声明的页面路径
2、启动Activity页面
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(FlutterView());
}
class FlutterView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'FlutterView',
theme: ThemeData(primarySwatch: Colors.blue),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
static const demoPlugin = const MethodChannel('start_acticity');
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
Expanded(
child: Center(
child: Text(
'德玛西亚',
style: const TextStyle(fontSize: 17.0),
),
),
),
RaisedButton(
child: const Text('启动原生页面'),
onPressed: () {
// Perform some action
demoPlugin.invokeMethod('startActivity');
},
),
],
),
);
}
}
①:在activity中声明方法通道
// 自定义方法通道,实现原生页面跳转
MethodChannel(flutterView, “start_acticity”).setMethodCallHandler(object : MethodCallHandler {
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
if (call.method == "startActivity") {
val intent = Intent(this@MainActivity, OneActivity::class.java)
this@MainActivity.startActivity(intent)
result.success("success")
} else {
result.notImplemented()
}
}
})
②:在dart文件中注册方法通道
static const startActivity= const MethodChannel('start_acticity');
③:在dart文件中跳转原生页面
startActivity.invokeMethod('startActivity');
参考
flutter与原生activity 交互 数据传递(一):https://blog.csdn.net/DeckeDeng/article/details/84991937