软硬交互代码示例_flutter与android原生交互

本人flutter和react-native都有开发经验,其实不管哪种混合式开发,都必须要学会与原生的交互,这里仅仅列举下flutter与android的原生交互示例。

eb4a782cbd39c1a1f659c17c617e3db1.png
  • 第一步:android包下MainActivity类同级目录下新建 FlutterPlugins 类(自定义哦),需要实现 MethodChannel.MethodCallHandler

示例代码:

package com.example.meishi;

import io.flutter.app.FlutterActivity;

import io.flutter.plugin.common.MethodCall;

import io.flutter.plugin.common.MethodChannel;

public class FlutterPlugins implements MethodChannel.MethodCallHandler {

private FlutterActivity flutterActivity;

private FlutterPlugins(FlutterActivity flutterActivity) {

this.flutterActivity = flutterActivity;

}

@Override

public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {

FlutterPluginsCall.onMethodCall(flutterActivity,methodCall,result);

}

public static void registerWith(FlutterActivity activity) {

FlutterPlugins instance = new FlutterPlugins(activity);

//flutter调用原生

MethodChannel channel = new MethodChannel(activity.registrarFor(FlutterPluginsCall.channels_flutter_to_native)

.messenger(), FlutterPluginsCall.channels_flutter_to_native);

//setMethodCallHandler在此通道上接收方法调用的回调

channel.setMethodCallHandler(instance);

}

}

  • 第二步:上面类同级目录下新建 FlutterPluginsCall 类 定义 通道名称、方法名称、调用原生方法的回调

示例代码:

package com.example.meishi;

import java.util.HashMap;

import io.flutter.app.FlutterActivity;

import io.flutter.plugin.common.MethodCall;

import io.flutter.plugin.common.MethodChannel;

public class FlutterPluginsCall {

/**

* 通道名称,必须与flutter注册的一致

*/

static final String channels_flutter_to_native = "com.ypp.flutter.plugins/flutter_to_native";

/**

* 方法名称,必须与flutter注册的一致

*/

private static final HashMap methodNames = new HashMap(){

{

put("getCallRecord", "getCallRecord");

}

};

/** flutter调用原生方法的回调

* @param activity activity

* @param methodCall methodCall

* @param result result

*/

static void onMethodCall(FlutterActivity activity, MethodCall methodCall, final MethodChannel.Result result){

if(methodNames.get("getCallRecord").equals(methodCall.method)){

//处理业务

System.out.println("接收到flutter传递的参数 aaa="+methodCall.argument("aaa").toString());

result.success("看到这个说明成功接收到原生返回的结果了");//处理后回调给Flutter

}

}

}

  • 第三步:MainActivity 中 添加注册

示例代码:

package com.example.meishi

import android.os.Bundle

import io.flutter.app.FlutterActivity

import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

GeneratedPluginRegistrant.registerWith(this);

FlutterPlugins.registerWith(this);

}

}

以上代码需在android studio中编写,下面代码可以在webstrom中编写

  • 第四步:flutter 中新建 interact_native.dart

示例代码:

import 'package:flutter/services.dart';

class InteractNative {

/* 通道名称,必须与原生注册的一致*/

static const flutter_to_native = const MethodChannel(

'com.ypp.flutter.plugins/flutter_to_native');

/*

* 方法名称,必须与flutter注册的一致

*/

static final Map methodNames = const {

'getCallRecord': 'getCallRecord',

};

/*

* 调用原生的方法(带参)

*/

static Future goNativeWithValue(String methodName,

[Map map]) async {

if (null == map) {

dynamic future = await flutter_to_native.invokeMethod(methodName);

return future;

} else {

dynamic future = await flutter_to_native.invokeMethod(methodName, map);

return future;

}

}

}

注意:通道名称、方法名称须与上述一致

  • 第五步:flutter中调用原生方法

示例代码:

import 'package:flutter/material.dart';

import 'interact_native.dart';

class CallRecordPage extends StatefulWidget {

String title;

CallRecordPage({Key key,this.title}):super(key:key);

_CallRecordPageState createState() => new _CallRecordPageState();

}

class _CallRecordPageState extends State {

Future main() {

Map map = {"aaa": '123', "bbb": '123'};

InteractNative.goNativeWithValue(InteractNative.methodNames['getCallRecord'], map)

.then((success) {

if (success == true) {

print('成功');

Navigator.pop(context);

} else if (success is String) {

//原生返回

print(success);

} else {

print('失败');

}

});

}

@override

void initState() {

main();

super.initState();

}

@override

Widget build(BuildContext context) {

// TODO: implement build

return Scaffold(

appBar: AppBar(

centerTitle: true,

title: Text(widget.title),

),

body: Container(

),

);

}

}

243f7073ab72285b6ca395f8b18c36f0.png

说明:第一行打印是 原生接收的flutter的传递参数(上述第二步)。第二行打印是 flutter接收到的原生的返回结果(上述第五步)

这个做混合式开发的小伙伴必须掌握,我后面的《flutter从放弃到入门》视频课程里面也会讲到,大家喜欢的话可以关注下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值