Ответ
Да, у меня был опыт интеграции Kotlin Multiplatform (KMP) модуля в Flutter-приложение. Мы использовали KMP для написания общей бизнес-логики (например, валидации, моделей данных, некоторых репозиториев) на Kotlin, которую затем могли использовать и в нативной Android-части, и во Flutter.
Архитектура: В гибридном проекте UI был реализован на Flutter (единый для Android и iOS), а сложная доменная логика, общая с нативным Android-модулем, вынесена в KMP-модуль.
Интеграция KMP с Flutter:
- KMP-модуль компилируется в Android-библиотеку (
.aar) и iOS-фреймворк (.framework). - Для Android: KMP-модуль добавляется как зависимость в
android/build.gradleпроекта Flutter. - Для iOS: Сгенерированный фреймворк подключается к iOS-части Flutter-проекта через CocoaPods или вручную.
- Во Flutter-коде общая логика вызывается через platform channels.
Пример вызова KMP-кода из Flutter (через MethodChannel):
// Flutter-сторона (Dart)
import 'package:flutter/services.dart';
class KmpService {
static const platform = MethodChannel('com.example.kmp/channel');
Future<String> performBusinessLogic(String input) async {
try {
final result = await platform.invokeMethod('processData', input);
return result;
} on PlatformException catch (e) {
return "Error: '${e.message}'.";
}
}
}
// KMP / Android-сторона (Kotlin)
// В MainActivity.kt Flutter-проекта
class MainActivity : FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example.kmp/channel")
.setMethodCallHandler { call, result ->
if (call.method == "processData") {
val input = call.arguments as String
// Вызов функции из общего KMP-кода!
val output = SharedBusinessLogic.process(input)
result.success(output)
} else {
result.notImplemented()
}
}
}
}
Плюсы подхода:
- Переиспользование кода: Сложная и критичная логика пишется один раз на Kotlin и работает на всех платформах.
- Безопасность и производительность: Kotlin — статически типизированный и производительный язык.
Сложности:
- Усложнение сборки: Необходимо настраивать сборку KMP-модуля и его интеграцию в Flutter.
- Оверхеад коммуникации: Вызовы через platform channel асинхронны и имеют некоторую задержку, что не подходит для высокочастотных операций.
Этот опыт показал, что KMP — мощный инструмент для sharing-кода, но его интеграция с Flutter требует тщательной архитектурной проработки.