Flutter学習ノート——day 2(FlutterとオリジナルActivity間の通信)

8804 ワード

FlutterとオリジナルActivity間の通信

  • 一、メッセージング
  • 1、activityにメッセージチャネル
  • を登録する
  • 2、dartファイルにメッセージチャネル
  • を登録する
  • 二、Flutterが新ページ
  • を起動
  • 1、Flutterページ
  • を起動する
  • 2、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