Sobes.tech
Back to questions
Junior — Middle
101

Каким образом можно интегрировать и вызывать нативный код в приложениях на Flutter?

Answer from AI

sobes.tech AI

В Flutter для вызова нативного кода (на Java/Kotlin для Android и Objective-C/Swift для iOS) используется механизм Platform Channels. Он позволяет обмениваться сообщениями между Dart и нативным кодом.

Основные шаги:

  1. В Dart создаётся канал (MethodChannel) с уникальным именем.
  2. В нативном коде регистрируется обработчик этого канала, который слушает вызовы из Flutter.
  3. Flutter отправляет сообщение с вызовом метода и параметрами.
  4. Нативный код выполняет нужную логику и возвращает результат.

Пример вызова нативного метода из 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 и нативным кодом.