Android 与Flutter 通信

不要和任何人比,这样容易让你迷失自我。只和自己比,和昨天的自己比,和上一刻的自己比,不断的挑战极限,不断的超越自我,才能不断的进步。

                                                                                                                                   ----泰语心说

前言:

实际开发中我们用的最多的是Android Native 和 Flutter 的混合开发,这样可以让他们在自己擅长的领域发挥作用,提升开发效率。但是混合开发有个问题就是数据共享的问题。本文将围绕 Native(Android端)与 Flutter 之间的通信进行介绍。

摘一段官方文档:

在客户端,MethodChannel(API)允许发送与方法调用相对应的消息。在平台方 面,Android(API)上的MethodChannel和iOS(API)上的FlutterMethodChannel启用接收方法调用并发回结果。这些类允许您使用非常少的“样板”代码开发平台插件。

Flutter定义了三种不同类型的Channel,分别是

  1. BasicMessageChannel:用于传递字符串和半结构化的数据;
  2. MethodChannel:用于传递方法调用;
  3. EventChannel:用于数据流的通信;
MethodChannel官方架构图
 

 

 本文将以 MethodChannel 为例介绍 Flutter 和 Android 之间通讯的实现:

1)、Flutter 调用 Android 端代码

Android端代码,如下:

public class MainActivity extends FlutterActivity {
    /*
       1、通道名字,为任意但唯一的字符串,一般以包名开头区分
       2、必须和Dart代码中的通道名字一致
    */
    private static final String CHANNEL = "com.live.common.flutter/main";
    //方法名字,必须和Dart端保持一致
    private static final String METHOD_NAME = "test_1";

    private int num = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        GeneratedPluginRegistrant.registerWith(this);

        new MethodChannel(getFlutterView(), CHANNEL)
                .setMethodCallHandler(new MethodChannel.MethodCallHandler() {
                    @Override
                    public void onMethodCall(MethodCall call, MethodChannel.Result result) {
                        if (call.method.equals(METHOD_NAME)) {
                            if (call.arguments instanceof Integer) {
                                int count = (int) call.arguments;
                                //打印收到的数据
                                Toast.makeText(MainActivity.this, "Android 收到:" + count, Toast.LENGTH_SHORT).show();
                                if (result != null) {
                                    num = num + 4;
                                    //返回数据
                                    result.success(num);
                                }
                            }

                        } else {
                            result.notImplemented();
                        }
                    }
                });
    }
}

Dart端代码,如下:

为了保证用户界面保持相应而不卡顿,消息和响应以异步的形式进行传递。

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  int _num = 0;
  static const methodChannel =
      const MethodChannel('com.live.common.flutter/main');

  Future<Null> _incrementCounter() async {
    _num = _num + 9;
    var result = await methodChannel.invokeMethod("test_1", _num);

    setState(() {
      _counter = result;
    });
  }

注:

    1、result:为Android端的返回值。

    2、num:为Dart 向 Android 传过去的数值。

Flutter与平台端的消息传递支持12种类型,这12种类型分别与安卓和iOS中的类型相对应:

DartAndroidiOS
nullnullnil (NSNull when nested)
booljava.lang.BooleanNSNumber numberWithBool:
intjava.lang.IntegerNSNumber numberWithInt:
int, if 32 bits not enoughjava.lang.LongNSNumber numberWithLong:
doublejava.lang.DoubleNSNumber numberWithDouble:
Stringjava.lang.StringNSString
Uint8Listbyte[]FlutterStandardTypedData typedDataWithBytes:
Int32Listint[]FlutterStandardTypedData typedDataWithInt32:
Int64Listlong[]FlutterStandardTypedData typedDataWithInt64:
Float64Listdouble[]FlutterStandardTypedData typedDataWithFloat64:
Listjava.util.ArrayListNSArray
Mapjava.util.HashMapNSDictionary

2)、Android 调用 Flutter 端代码

待续.....

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值