Que fait flutter-interopération-avec-apis-natives ?
Interopère avec les API natives des plateformes Android, iOS et Web. À utiliser pour accéder à des fonctionnalités spécifiques aux appareils non disponibles en Dart ou pour appeler du code natif existant.
Aperçu
Cette compétence couvre les techniques permettant d'interagir avec du code et des API spécifiques à la plateforme dans les applications Flutter. Elle est utile lorsque la bibliothèque standard Flutter ou les packages ne fournissent pas l'accès natif requis.
Plateformes prises en charge
- Android : utiliser
MethodChannelavec Kotlin ou Java. - iOS : utiliser
MethodChannelavec Swift ou Objective-C. - Web : utiliser
dart:jsoudart:js_utilavec JavaScript/Dart interop.
Utilisation
1. Configurer le canal
Choisissez un nom de canal unique pour identifier votre canal de communication. Par exemple :
import 'package:flutter/services.dart';
static const platform = MethodChannel('com.example.myapp/channel');
2. Appeler une méthode native
Utilisez invokeMethod pour appeler une fonction spécifique dans le code natif.
Future<void> getBatteryLevel() async {
try {
final result = await platform.invokeMethod<int>('getBatteryLevel');
print('Niveau de batterie : $result%');
} on PlatformException catch (e) {
print('Impossible d\'obtenir le niveau de batterie : ${e.message}');
}
}
3. Implémenter la partie native
Android (Kotlin)
// MainActivity.kt
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.example.myapp/channel"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
.setMethodCallHandler { call, result ->
if (call.method == "getBatteryLevel") {
// Logique native ici
result.success(batteryLevel)
} else {
result.notImplemented()
}
}
}
}
iOS (Swift)
// AppDelegate.swift
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller = window?.rootViewController as! FlutterViewController
let channel = FlutterMethodChannel(
name: "com.example.myapp/channel",
binaryMessenger: controller.binaryMessenger)
channel.setMethodCallHandler { (call, result) in
if call.method == "getBatteryLevel" {
// Logique native ici
result(batteryLevel)
} else {
result(FlutterMethodNotImplemented)
}
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
Web (JavaScript)
// web/index.html ou fichier js séparé
if (typeof window.flutter_channel !== 'undefined') {
window.flutter_channel.postMessage('getBatteryLevel');
}
Bonnes pratiques
- Utilisez des noms de canaux uniques et cohérents.
- Gérez toujours les exceptions avec
PlatformException. - Évitez les transferts de données volumineux via les canaux ; pour les gros fichiers, utilisez des chemins de fichiers ou
EventChannel. - Testez le comportement natif sur des appareils réels ou des émulateurs.