Комментарии (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 пакеты вместо писания нативного кода с нуля. Это экономит время и гарантирует совместимость.