Back to questions
Junior — Middle
101
Каким образом можно интегрировать и вызывать нативный код в приложениях на Flutter?
Answer from AI
sobes.tech AI
В Flutter для вызова нативного кода (на Java/Kotlin для Android и Objective-C/Swift для iOS) используется механизм Platform Channels. Он позволяет обмениваться сообщениями между Dart и нативным кодом.
Основные шаги:
- В Dart создаётся канал (MethodChannel) с уникальным именем.
- В нативном коде регистрируется обработчик этого канала, который слушает вызовы из Flutter.
- Flutter отправляет сообщение с вызовом метода и параметрами.
- Нативный код выполняет нужную логику и возвращает результат.
Пример вызова нативного метода из Flutter:
static const platform = MethodChannel('samples.flutter.dev/battery');
Future<void> getBatteryLevel() async {
try {
final int result = await platform.invokeMethod('getBatteryLevel');
print('Battery level: $result%');
} on PlatformException catch (e) {
print('Failed to get battery level: ${e.message}');
}
}
В Android (Kotlin):
class MainActivity: FlutterActivity() {
private val CHANNEL = "samples.flutter.dev/battery"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
call, result ->
if (call.method == "getBatteryLevel") {
val batteryLevel = getBatteryLevel()
if (batteryLevel != -1) {
result.success(batteryLevel)
} else {
result.error("UNAVAILABLE", "Battery level not available.", null)
}
} else {
result.notImplemented()
}
}
}
private fun getBatteryLevel(): Int {
val batteryManager = getSystemService(BATTERY_SERVICE) as BatteryManager
return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
}
}
Таким образом, Platform Channels обеспечивают двунаправленную связь между Flutter и нативным кодом.