Comment Flutter s'adapte-t-il au système d'exploitation iOS?
sobes.tech IA
Réponse de l'IA
Flutter utilise le moteur Skia pour rendre l'interface utilisateur, qui interagit directement avec le GPU. Les composants natifs iOS (boutons, défilements, etc.) ne sont pas utilisés. Leur apparence et leur comportement sont imités par des widgets Flutter stylisés selon les Human Interface Guidelines.
Par exemple, pour créer un bouton dans le style iOS, on utilise CupertinoButton :
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class MyCupertinoButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoButton(
child: Text('Нажми меня'),
onPressed: () {
// Action lors du clic
},
);
}
}
Flutter interagit avec les API natives via ses plugins, en utilisant des canaux de plateforme (Platform Channels). Cela permet d'appeler du code natif iOS depuis Dart et vice versa.
import 'package:flutter/services.dart';
class NativeApi {
static const platform = MethodChannel('com.example.myapp/battery'); // Nom du canal
Future<String> getBatteryLevel() async {
try {
final String result = await platform.invokeMethod('getBatteryLevel'); // Appel de la méthode native
return 'Niveau de batterie : $result%.';
} on PlatformException catch (e) {
return "Impossible d'obtenir le niveau de batterie : '${e.message}'.";
}
}
}
Du côté iOS, le code natif gère les appels via MethodChannel.
// Code Swift dans le projet iOS
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let batteryChannel = FlutterMethodChannel(name: "com.example.myapp/battery",
binaryMessenger: controller.binaryMessenger)
batteryChannel.setMethodCallHandler({
(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
guard call.method == "getBatteryLevel" else {
result(FlutterMethodNotImplemented)
return
}
self.receiveBatteryLevel(result: result)
})
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
private func receiveBatteryLevel(result: FlutterResult) {
let device = UIDevice.current
device.isBatteryMonitoringEnabled = true
if device.batteryState == .unknown {
result(FlutterError(code: "UNAVAILABLE",
message: "Le niveau de batterie n'est pas disponible.",
details: nil))
} else {
result(Int(device.batteryLevel * 100))
}
}
}
Pour adapter le design, on utilise des widgets de la bibliothèque cupertino, qui imitent le style iOS. L'accès à des fonctionnalités spécifiques d'iOS se fait également via des plugins. La compilation de l'application pour iOS se fait via Xcode. Flutter génère un projet iOS qui est ensuite compilé en un fichier exécutable natif (.ipa).