Flutter   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了【Flutter 混合开发】与原生通信-BasicMessageChannel大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

【Flutter 混合开发】与原生通信-BasicMessageChannel

平台通信的3中方式

Flutter 与 Native 端通信有如下3个方法

  • @H_575_13@methodChAnnel:Flutter 与 Native 端相互调用调用后可以返回结果,可以 Native 端主动调用,也可以Flutter主动调用,属于双向通信。此方式为最常用的方式, Native 端调用需要在主线程中执行。
  • BasicmessageChAnnel:用于使用指定的编解码器对消息进行编码和解码,属于双向通信,可以 Native 端主动调用,也可以Flutter主动调用
  • EventChAnnel:用于数据流(event streams)的通信, Native 端主动发送数据给 Flutter,通常用于状态的监听,比如网络变化、传感器数据等。

Flutter 端

Flutter 端创建 @H_575_13@methodChAnnel 通道,用于与原生端通信:

var chAnnel = BasicmessageChAnnel('com.Flutter.guide.basicmessageChAnnel',StandardmessageCodec());

com.Flutter.guide.basicmessageChAnnel 是 BasicmessageChAnnel 的名称,原生端要与之对应。

发送消息:

var result = await chAnnel.send({'name': 'laomeng','age': 18});
  • 参数类型任意,多个参数通常使用@H_575_13@map。
  • 返回 Future,原生端返回的数据。

完整代码

class BasicmessageChAnnelDemo extends StatefulWidget {
  @override
  _BasicmessageChAnnelDemoState createState() => _BasicmessageChAnnelDemoState();
}

class _BasicmessageChAnnelDemoState extends State<BasicmessageChAnnelDemo> {
  var chAnnel = BasicmessageChAnnel('com.Flutter.guide.basicmessageChAnnel',StandardmessageCodec());

  var _data;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),body: column(
        children: [
          SizedBox(
            height: 50,),RaisedButton(
            child: Text('发送数据到原生'),onPressed: () async {
              var result = await chAnnel.send({'name': 'laomeng','age': 18});
              var name = result['name'];
              var age = result['age'];
              setState(() {
                _data = '$name,$age';
              });
            },Text('原生返回数据:$_data'),],);
  }
}

Android 端

android 下创建 BasicmessageChAnnelDemo

class BasicmessageChAnnelDemo(messenger: Binarymessenger) : BasicmessageChAnnel.messageHandler<Any> {

    private var chAnnel: BasicmessageChAnnel<Any>

    init {
        chAnnel = BasicmessageChAnnel(messenger,"com.Flutter.guide.basicmessageChAnnel",StandardmessageCodec())
        chAnnel.setmessageHandler(this)
    }

    override fun onmessage(message: Any?,reply: BasicmessageChAnnel.Reply<Any>) {
        val name = (message as Map<String,Any>)["name"]
        val age = (message as Map<String,Any>)["age"]

        var map = mapOf("name" to "Hello,$name","age" to "$age"
        )

        reply.reply(map)
    }
}

【Flutter 混合开发】与原生通信-BasicMessageChannel

onmessage 方法Flutter 端调用 send 方法调用,解析方法如下:

override fun onmessage(message: Any?,"age" to "$age"
        )

        reply.reply(map)
    }
  • message 是传入的参数,由于 Flutter 端传入的是 Map,所以上面的解析按照 Map 解析。
  • reply.reply() 是返回给 Flutter 的结果。

Flutter 端解析:

var result = await chAnnel.send({'name': 'laomeng','age': 18});
var name = result['name'];
var age = result['age'];

在 @H_575_13@mainActivity 启动:

class MainActivity : FlutterActivity() {

    override fun configureFlutterENGIne(FlutterENGIne: FlutterENGInE) {
        super.configureFlutterENGIne(FlutterENGInE)
        BasicmessageChAnnelDemo(FlutterENGIne.dartExecutor.binarymessenger)
        FlutterENGIne.plugins.add(MyPlugin())
    }
}

【Flutter 混合开发】与原生通信-BasicMessageChannel

iOS 端

ios 下创建 @H_575_13@methodChAnnelDemo,按如下方式:

import Flutter
import UIKit

public class BasicmessageChAnnelDemo {
    
    var chAnnel:FlutterBasicmessageChAnnel
    
    init(messenger: FlutterBinarymessenger) {
        chAnnel = FlutterBasicmessageChAnnel(name: "com.Flutter.guide.basicmessageChAnnel",binarymessenger: messenger)
        chAnnel.setmessageHandler { (message,reply) in
            if let Dict = message as? Dictionary<String,Any> {
                let name:string = Dict["name"] as? String ?? ""
                let age:Int = Dict["age"] as? Int ?? -1
                reply(["name":"Hello,\(@R_489_8313@","age":age])
            }
        }  
    }  
}

【Flutter 混合开发】与原生通信-BasicMessageChannel

AppDelegate 启动:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    MethodChAnnelDemo(messenger: controller.binarymessenger)
    BasicmessageChAnnelDemo(messenger: controller.binarymessenger)
    GeneratedPluginRegistrant.register(with: self)

    return super.application(application,didFinishLaunchingWithOptions: launchOptions)
  }
}

【Flutter 混合开发】与原生通信-BasicMessageChannel

原生端主动发送消息给Flutter

Flutter 端接收数据
@override
  void initState() {
    super.initState();
    chAnnel.setmessageHandler((messagE) {
      setState(() {
        _nativeData = message['count'];
      });
    });
  }
Android 发送数据

原生端启动定时器,每隔一秒向 Flutter 发送数据,Android 端代码

class BasicmessageChAnnelDemo(var activity: Activity,messenger: Binarymessenger) : BasicmessageChAnnel.messageHandler<Any> {

    private var chAnnel: BasicmessageChAnnel<Any>
    private var count = 0

    init {
        chAnnel = BasicmessageChAnnel(messenger,StandardmessageCodec())
        chAnnel.setmessageHandler(this)
        startTimer()
    }


    fun startTimer() {
        var timer = Timer().schedule(timerTask {
            activity.runOnUiThread {
                var map = mapOf("count" to count++)
                chAnnel.send(map,object :BasicmessageChAnnel.Reply<Any>{
                    override fun reply(reply: Any?) {

                    }
                })
            }
        },1000)

    }

    override fun onmessage(message: Any?,"age" to "$age"
        )

        reply.reply(map)
    }
}

启动修改如下:

class MainActivity : FlutterActivity() {

    override fun configureFlutterENGIne(FlutterENGIne: FlutterENGInE) {
        super.configureFlutterENGIne(FlutterENGInE)
        BasicmessageChAnnelDemo(this,FlutterENGIne.dartExecutor.binarymessenger)
        FlutterENGIne.plugins.add(MyPlugin())
    }
}

【Flutter 混合开发】与原生通信-BasicMessageChannel

iOS 发送数据

iOS 端启动定时器代码如下:


import Flutter
import UIKit

public class BasicmessageChAnnelDemo {
    
    var chAnnel:FlutterBasicmessageChAnnel
    var count =  0
    
    init(messenger: FlutterBinarymessenger) {
        chAnnel = FlutterBasicmessageChAnnel(name: "com.Flutter.guide.basicmessageChAnnel","age":age])
            }
        }
        startTimer()
    }
    
    func startTimer() {
        var timer = Timer.scheduledTimer(timeInterval:1,target: self,SELEctor:#SELEctor(self.tickDown),userInfo:nil,repeats: truE)
    }
    @objc func tickDown(){
        count += 1
        var args = ["count":count]
        chAnnel.sendmessage(args) { (reply) in
            
        }
    }
}

【Flutter 混合开发】与原生通信-BasicMessageChannel

交流

老孟Flutter博客(330个控件用法+实战入门系列文章):http://laomengit.com

欢迎加入Flutter交流群(微信:laomENGIt)、关注公众号【老孟Flutter】:

【Flutter 混合开发】与原生通信-BasicMessageChannel

【Flutter 混合开发】与原生通信-BasicMessageChannel

大佬总结

以上是大佬教程为你收集整理的【Flutter 混合开发】与原生通信-BasicMessageChannel全部内容,希望文章能够帮你解决【Flutter 混合开发】与原生通信-BasicMessageChannel所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: