当前位置:   article > 正文

android+ios+短信,Flutter与原生(Android/IOS)的消息通信

ios call.arguments

开发集成环境

[✓] Flutter (Channel stable, v1.12.13+hotfix.9, on Mac OS X 10.14.6 18G103, locale zh-Hans-CN)

前面也谈到除了一些新项目以外,目前大多数都是在原有项目中逐步插入跨平台技术,虽说Flutter提供的插件越来越丰富,但在新项目中的需求也会或多或少涉及到原生的帮助,自然而然又稍微掺杂点混编了。

其实跨平台框架在与原生项目进行混编时,是避免不了两者之间的相互通信,当然也会涉及到对应的页面跳转,仔细想想其实当解决了两者之间的相互通信后,好像页面跳转也不是什么大问题了,只是方式的友好与否而已。

下面分别就Flutter与Android消息通信、Flutter与IOS消息通信两个方面作下简单描述,其中Flutter与Android消息通信涉及Java与Kotlin两种语言、Flutter与IOS消息通信涉及Object-C和Swift两种语言。

一、Flutter与Android的消息通信

1、Android端实现接收消息和发送消息

Java版

public class MainActivity extends FlutterActivity {

@Override

public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {

GeneratedPluginRegistrant.registerWith(flutterEngine);

MethodChannel mc = new MethodChannel(flutterEngine.getDartExecutor(), "com.cc.flutter.native"); //此处名称应与Flutter端保持一致

//接收Flutter消息

mc.setMethodCallHandler(new MethodChannel.MethodCallHandler() {

@Override

public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {

System.out.println("MethodChannel call.method:"+call.method+ " call arguments:"+call.arguments);

switch (call.method){

case "envType":

result.success("2");

break;

case "toast":

String msg = call.argument("msg");

Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();

result.success("成功啦");

break;

default:

result.error("404", "未匹配到对应的方法"+call.method, null);

}

}

});

// mc.invokeMethod("aaa", "c") //发送消息

}

}

Kotlin版

class MainActivity : FlutterActivity(){

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {

var methodChannel = MethodChannel(flutterEngine.dartExecutor, "com.cc.flutter.native")

methodChannel.setMethodCallHandler { call: MethodCall, result: MethodChannel.Result? ->

println("MethodChannel call.method:" + call.method + " call arguments:" + call.arguments)

when (call.method) {

"envType" -> result!!.success("2")

"toast" -> {

val msg = call.argument("msg")

showToast(msg!!)

result!!.success("成功啦")

}

else -> result!!.error("404", "未匹配到对应的方法" + call.method, null)

}

}

}

}

2、Flutter测试实现发送消息和接收消息

class NativeUtils{

static const String NATIVE_CHANNEL_NAME = "com.cc.flutter.native"; //给native发消息,此处应和客户端名称保持一致

//channel_name每一个通信通道的唯一标识,在整个项目内唯一!!!

static const _channel = const MethodChannel(NATIVE_CHANNEL_NAME);

///

/// @Params:

/// @Desc: 获取native的数据

///

static getNativeData(key,[ dynamic arguments ]) async{

try {

String resultValue = await _channel.invokeMethod(key, arguments);

return resultValue;

}on PlatformException catch (e){

print(e.toString());

return "";

}

}

static registerMethod(){

//接收处理原生消息

_channel.setMethodCallHandler((handler) {

switch (handler.method) {

case "aaa":

// 发送原生消息

_channel.invokeMethod("toast", {"msg": "您调用了dart里的方法"});

break;

}

});

}

}

在Flutter页面初始化时调用NativeUtils.registerMethod()后,这样客户端调用methodChannel.invokeMethod("aaa", "c") 此时Flutter才能收到对应的消息。

在Flutter页面中调用NativeUtils. getNativeData("envType") 此时才能调用原生客户端对应的方法获取数据。

以上是Flutter与Android端相互通信的部分,下面部分是Flutter与IOS相互通信的部分。

二、Flutter与IOS的消息通信

1. Android端实现接收消息和发送消息

Object-C版

#import "AppDelegate.h"

#include "GeneratedPluginRegistrant.h"

#import "FlutterNativePlugin.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

[GeneratedPluginRegistrant registerWithRegistry:self];

FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;

FlutterMethodChannel* channel = [FlutterMethodChannel methodChannelWithName:@"com.cc.flutter.native" binaryMessenger:controller.binaryMessenger];

[channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {

if ([call.method isEqualToString:@"cityId"]) {

result([NSNumber numberWithInt:1]);

} if([call.method isEqualToString:@"envType"]){

result(@"1");

} else {

result(FlutterMethodNotImplemented);

}

}];

return [super application:application didFinishLaunchingWithOptions:launchOptions];

}

@end

Swift版

import UIKit

import Flutter

@UIApplicationMain

@objc class AppDelegate: FlutterAppDelegate {

override func application(

_ application: UIApplication,

didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?

) -> Bool {

GeneratedPluginRegistrant.register(with: self)

let controller:FlutterViewController = window.rootViewController as! FlutterViewController

let channel = FlutterMethodChannel(name: "com.cc.flutter.native", binaryMessenger: controller.binaryMessenger)

channel.setMethodCallHandler { (call, result) in

if "cityId" == call.method{

result(1);

}

else if "envType" == call.method{

result("1");

}

else{

result(FlutterMethodNotImplemented)

}

}

return super.application(application, didFinishLaunchingWithOptions: launchOptions)

}

}

2. Flutter端测试实现发送消息和接收消息代码和Android共用即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/452178
推荐阅读
相关标签
  

闽ICP备14008679号