Platform Channel - основной способ вызова нативного кода из Android и iOS на Flutter. Существует 2 типа - Method Channel и Event Channel. Основная разница в том, как они взаимодействуют с нашим приложением. Method Channel служит для вызова функций, а Event Channel это Stream, в который добавляются события.
Давайте посмотрим, как их создавать, на примере Method Channel. Для начала дадим нашему каналу имя и запишем его вместе с пакетом нашего приложения:
final channelName = ‘sample.example.com/my_method_channel’;
Далее подготовим метод, который обратится в нативный код:
Future<int> nativeSum(int a, int b) async {
await platfom.invokeMethod<int>(‘nativeSum’,{‘a’: a, ‘b’: b});
}
Если вызвать этот метод сейчас, то мы получим исключение, что такой Method Channel не найден, так как нам нужно добавить нативный код.
Для Android мы сначала добавляем конфигурацию в
MainActivity.kt, создавая константу с названием канала:
private val CHANNEL = “sample.example.com/my_method_channel”
И добавляя сам канал методе
configureFlutterEngine:
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler(this)
Теперь нам надо добавить интерфейс
MethodCallHandler к нашему классу MainActivity. После чего у нас появится метод для обработки обращений из Dart. Давайте напишем обработку для такого метода.
when (call.method) {
“nativeSum” -> {
val a = call.argument<Int>(“a”) ?: 0
val b = call.argument<Int>(“b”) ?: 0
result.success(a + b)
}
else -> result.notImplemented()
}
И давайте теперь сделаем это для iOS на Swift. Тут все изменения будут происходить в файле
AppDelegate.swift. Создаем канал:
let myChannel = FlutterMethodChannel(name: “sample.example.com/my_method_channel”, binaryMessenger: controller.binaryMessenger)
И затем добавим обработку вызовов:
myChannel.setMethodCallHandler({
[weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
switch call.method:
case “nativeSum”:
let args = call.arguments as? [String, Any]
let a = args[“a”] as? Int
let b = args[“b”] as? Int
result(a + b)
default:
result(FlutterMethodNotImplemented)
})
Таким образом, мы можем добавлять нативные библиотеки в свои проекты, выносить часть сложных вычислений, чтобы их распараллелить, или вызывать какие-либо способности устройства.
Делитесь в чате, пробовали ли вы писать свои платформенные каналы?
