Flutter學習筆記——day2(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)
          [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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章