不要和任何人比,这样容易让你迷失自我。只和自己比,和昨天的自己比,和上一刻的自己比,不断的挑战极限,不断的超越自我,才能不断的进步。
----泰语心说
前言:
实际开发中我们用的最多的是Android Native 和 Flutter 的混合开发,这样可以让他们在自己擅长的领域发挥作用,提升开发效率。但是混合开发有个问题就是数据共享的问题。本文将围绕 Native(Android端)与 Flutter 之间的通信进行介绍。
摘一段官方文档:
在客户端,
MethodChannel
(API)允许发送与方法调用相对应的消息。在平台方 面,Android(API)上的MethodChannel
和iOS(API)上的FlutterMethodChannel
启用接收方法调用并发回结果。这些类允许您使用非常少的“样板”代码开发平台插件。
Flutter定义了三种不同类型的Channel,分别是
- BasicMessageChannel:用于传递字符串和半结构化的数据;
- MethodChannel:用于传递方法调用;
- EventChannel:用于数据流的通信;
本文将以 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中的类型相对应:
Dart | Android | iOS |
---|---|---|
null | null | nil (NSNull when nested) |
bool | java.lang.Boolean | NSNumber numberWithBool: |
int | java.lang.Integer | NSNumber numberWithInt: |
int, if 32 bits not enough | java.lang.Long | NSNumber numberWithLong: |
double | java.lang.Double | NSNumber numberWithDouble: |
String | java.lang.String | NSString |
Uint8List | byte[] | FlutterStandardTypedData typedDataWithBytes: |
Int32List | int[] | FlutterStandardTypedData typedDataWithInt32: |
Int64List | long[] | FlutterStandardTypedData typedDataWithInt64: |
Float64List | double[] | FlutterStandardTypedData typedDataWithFloat64: |
List | java.util.ArrayList | NSArray |
Map | java.util.HashMap | NSDictionary |
2)、Android 调用 Flutter 端代码
待续.....