该方式可以实现双向通道,Flutter调用原生,原生再返回数据给Flutter。
1.先在Flutter端声明MethodChannel的对象
class MethodChannelManage{
static const testPlatform = const MethodChannel("com.demo.test");
}
2.Flutter发送消息给原生
Map<String, String> map = {
"text": _methodChannelStr,
};
MethodChannelManage.testPlatform.invokeMethod("methodChanne", map)
.then((value) {// 原生返回的值
setState(() {
_methodChannelStr = value;
});
});
3.1Android接收和返回值
public class MainActivity extends FlutterActivity {
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
ShimPluginRegistry shimPluginRegistry = new ShimPluginRegistry(flutterEngine);
registerCustomPlugin(shimPluginRegistry);
}
private static void registerCustomPlugin(PluginRegistry registrar) {
FlutterPluginSendToAct.registerWith(registrar.registrarFor(FlutterPluginSendToAct.CHANNEL));
}
}
public class FlutterPluginSendToAct implements MethodChannel.MethodCallHandler {
public static String CHANNEL = "com.demo.test";
static MethodChannel channel;
private Activity activity;
private FlutterPluginSendToAct(Activity activity) {
this.activity = activity;
}
public static void registerWith(PluginRegistry.Registrar registrar) {
channel = new MethodChannel(registrar.messenger(), CHANNEL);
FlutterPluginSendToAct instance = new FlutterPluginSendToAct(registrar.activity());
//setMethodCallHandler在此通道上接收方法调用的回调
channel.setMethodCallHandler(instance);
}
@Override
public void onMethodCall(MethodCall call, MethodChannel.Result result) {
//接收来自flutter的指令
if (call.method.equals("methodChannel")) {
String str = call.argument("text");
//返回给flutter的参数
result.success("收到Flutter的消息" + str +" ,返回消息给Flutter!");
}
}
}
3.2 IOS的接收和返回
#import "AppDelegate.h"
#import "GeneratedPluginRegistrant.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
// Override point for customization after application launch.
FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;
FlutterMethodChannel* batteryChannel = [FlutterMethodChannel
methodChannelWithName:@"com.demo.test"
binaryMessenger:controller];
[batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
if ([@"methodChannel" isEqualToString:call.method]) {
NSDictionary *dic = call.arguments;
NSString *text = dic[@"text"];
result(@"来自IOS的消息");
} else {
result(FlutterMethodNotImplemented);
}
}];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end