> Как во Flutter взаимодействовать с нативным кодом платформы для обмена данными (Flutter, Android)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: PashaPay

Стек: Flutter, Android

> Пример ответа

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

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

  1. Создание канала на стороне Dart:
import 'package:flutter/services.dart';

const platform = MethodChannel('com.example.app/channel');
  1. Вызов нативного метода из Dart:
Future<String> getBatteryLevel() async {
  try {
    final result = await platform.invokeMethod('getBatteryLevel');
    return result;
  } on PlatformException catch (e) {
    return "Failed: ${e.message}";
  }
}
  1. Реализация на стороне Android (в MainActivity.kt или отдельном классе):
class MainActivity: FlutterActivity() {
    private val CHANNEL = "com.example.app/channel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(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(Context.BATTERY_SERVICE) as BatteryManager
        return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
    }
}

Для передачи сложных данных (списки, карты) используйте стандартные типы, поддерживаемые каналом: String, int, double, bool, List, Map. Для потоковой передачи данных (например, сенсоры) применяйте EventChannel.

Важно: все вызовы через MethodChannel выполняются асинхронно и не блокируют UI. Для работы с нативными API, требующими контекст (например, Activity), используйте FlutterActivity или плагины.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью