Flutter学習ノート——day 2(FlutterとオリジナルActivity間の通信)
8804 ワード
FlutterとオリジナルActivity間の通信
一、メッセージング
1.activityにメッセージチャネルを登録する
class OneActivity : Activity() {
var messageChannel: BasicMessageChannel? = 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 {
override fun onMessage(p0: String?, p1: BasicMessageChannel.Reply?) {
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 {
override fun onMessage(p0: String?, p1: BasicMessageChannel.Reply?) {
......// Flutter p0
p1?.reply("")
}
})
③:フローターにメッセージを送る
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 {
//
static const BasicMessageChannel platform =
BasicMessageChannel("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 _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 messageChannel=
BasicMessageChannel("channel_name", StringCodec());
@override
Widget build(BuildContext context) {
messageChannel.setMessageHandler(_handleMessage);
return Scaffold(
appBar: AppBar(
title: Text("Sample App"),
),
body: Center(child: Text(" "))
);
}
Future _handleMessage(String message) async {
print("===== :$message");
return "";
}
}
①:メッセージチャネルの登録
//
static const BasicMessageChannel messageChannel=
BasicMessageChannel("channel_name", StringCodec());// activity
②:受信したメッセージの処理
// Android activity
messageChannel.setMessageHandler(_handleMessage);
Future _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: {
'first_page': (BuildContext context) => FirstPage(),
'one_page' : (BuildContext context) => OnePage(),
}
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
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 {
static const demoPlugin = const MethodChannel('start_acticity');
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
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)
[email protected](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