← Назад к вопросам

Расскажи про опыт работы с нативом

1.6 Junior🔥 101 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Опыт работы с нативом (Native Code) из Flutter

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

Интеграция с нативным кодом

1. Platform Channels - основной механизм коммуникации

Flutter ↔ Platform Channels ↔ Native Code

// Flutter side
const platform = MethodChannel('com.example.app/native');

Future<void> callNativeMethod() async {
  try {
    final result = await platform.invokeMethod('getNativeData');
    print('Native response: $result');
  } catch (e) {
    print('Error: $e');
  }
}

2. Android (Kotlin)

import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.deferredcomponents.DeferredComponentManager
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.sharedpreferences.SharedPreferencesUtils

class MainActivity: FlutterActivity() {
  override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)
    
    MethodChannel(
      flutterEngine.dartExecutor.binaryMessenger,
      "com.example.app/native"
    ).setMethodCallHandler { call, result ->
      when (call.method) {
        "getNativeData" -> {
          val data = "Data from Native"
          result.success(data)
        }
        else -> result.notImplemented()
      }
    }
  }
}

3. iOS (Swift)

import UIKit
import Flutter

@UIApplicationMain
@objc class GeneratedPluginRegistrant: NSObject, FlutterPlugin {
  let controller = window?.rootViewController as! FlutterViewController
  let methodChannel = FlutterMethodChannel(
    name: "com.example.app/native",
    binaryMessenger: controller.binaryMessenger
  )
  
  methodChannel.setMethodCallHandler { (call: FlutterMethodCall, result: @escaping FlutterResult) in
    switch call.method {
    case "getNativeData":
      result("Data from iOS")
    default:
      result(FlutterMethodNotImplemented)
    }
  }
}

Случаи использования нативного кода

1. Работа с камерой (image_picker, camera пакеты)

final picker = ImagePicker();
final image = await picker.pickImage(source: ImageSource.camera);

2. Доступ к файловой системе

final documentsDirectory = await getApplicationDocumentsDirectory();
final path = documentsDirectory.path;

3. Push-уведомления

import 'package:firebase_messaging/firebase_messaging.dart';

FirebaseMessaging messaging = FirebaseMessaging.instance;
await messaging.requestPermission();

4. Биометрия (отпечаток, Face ID)

import 'package:local_auth/local_auth.dart';

final auth = LocalAuthentication();
bool isAuthenticated = await auth.authenticate(
  localizedReason: 'Authenticate to access app',
);

5. Фоновые задачи

import 'package:workmanager/workmanager.dart';

Workmanager().registerPeriodicTask(
  "my_task",
  "simpleTask",
  frequency: Duration(minutes: 15),
);

Популярные пакеты для интеграции

  • image_picker - доступ к галерее и камере
  • firebase_messaging - push-уведомления
  • local_auth - биометрия
  • geolocator - GPS и геолокация
  • sensors_plus - акселерометр, гироскоп
  • flutter_local_notifications - локальные уведомления
  • share_plus - поделиться контентом
  • url_launcher - открыть ссылки
  • permission_handler - запрос разрешений

Best Practice

Структура кода:

  • Изолируй нативный код в отдельные классы/пакеты
  • Используй готовые пакеты вместо собственного нативного кода
  • Обрабатывай ошибки корректно
  • Документируй требования платформы

Примеры готовых решений:

// Вместо собственного нативного кода
import 'package:geolocator/geolocator.dart';

Position position = await Geolocator.getCurrentPosition();
print('Lat: ${position.latitude}, Lon: ${position.longitude}');

Управление версиями:

  • Указывай minSdkVersion для Android
  • Указывай iOS Deployment Target
  • Тестируй на разных версиях платформ

Модерный подход - использовать готовые pub.dev пакеты вместо писания нативного кода с нуля. Это экономит время и гарантирует совместимость.