Flutter 是一款跨平台开发框架,可以同时开发出 iOS 和 Android 应用,Flutter 集成了 Dart 语言、框架和工具,并提供了很多高级功能。
Flutter的UI框架采用了一种全新的方式来构建UI——基于组件的构建模式,即Flutter UI组件是一个直接继承自StatefulWidget或StatelessWidget,并且可以直接嵌套在其它组件里面的完全封装的UI组件。而这些组件在运行时可以直接通过硬件加速来执行,这使得Flutter的UI性能比传统的Android和iOS原生开发效果更好。
Flutter通过Dart和C++来与原生交互,即如果我们想使用Android或iOS SDK提供的API或实现一些底层功能,比如说推送、地图等,就需要通过Flutter和原生之间的交互来实现。
Flutter 与原生交互的方案主要有以下几种:
1. MethodChannel
MethodChannel 是Flutter与原生通信的最基础的渠道之一。它可以实现Flutter和原生方法的互相调用。原理是通过二进制消息来实现同步和异步调用的。
在 Flutter 代码中,需要使用 MethodChannel ,并指定 channel name,用于指定 MethodChannel 的名称。
在原生代码中,也需要使用 MethodChannel,需要指定与 Flutter 对应的 channel name。
MethodChannel 的同步调用方法:
```dart
Future
```
MethodChannel 的异步调用方法:
```dart
Future
```
MethodChannel 的 handler 回调:
```dart
handler.setMessageHandler((message) => Future
if (message.content = "yourMethod") {
// do something
}
return "some return message";
}));
```
2. BasicMessageChannel
BasicMessageChannel 可以发送和接收任何 Dart 类型的数据。它也是使用二进制消息进行传输的。
在 Flutter 代码中,需要使用 BasicMessageChannel,并指定消息类型,用于指定 BasicMessageChannel 消息的类型。
在原生端,也需要使用 BasicMessageChannel,并且需要指定 BasicMessageChannel 的名称和消息类型。
BasicMessageChannel 的发送方法:
```dart
Future
```
BasicMessageChannel 的接收方法:
```dart
handler.setMessageHandler((dynamic message) async {
if (message.content = "yourMessage") {
// do something
return "some return message";
}
});
```
3. EventChannel
EventChannel 是用于传输序列化 Java 或 ObjC 对象的平台通道。它可以在 Dart 和平台的另一侧进行双向传输。
在 Flutter 代码中,需要使用 EventChannel,并指定 channel name,用于指定 EventChannel 的名称。
在原生代码中,也需要使用 EventChannel,需要指定与 Flutter 对应的 channel name。
EventChannel 的监听方法:
```dart
Stream
```
EventChannel 的发送方法:
```dart
- (FlutterError* _Nullable) send:(nullable id)message
eventSink:(nonnull FlutterEventSink)events;
```
最后,需要在原生代码中注册通道,FlutterEngine 会自动注册 MethodChannels 和 BasicMessageChannels。在目标原生界面中,我们可以使用 MethodChannel 和 BasicMessageChannel 来与 Flutter 进行通信。
总的来说,Flutter 与原生交互的方案非常丰富,可以根据实际需求进行选择。这些方案对于提高开发效率、减少工作量以及实现复杂的业务逻辑都非常有帮助。