Come si adatta Flutter al sistema operativo iOS?
sobes.tech AI
Risposta dell'AI
Flutter utilizza il motore Skia per il rendering dell'interfaccia utente, che interagisce direttamente con la GPU. I componenti nativi iOS (pulsanti, scorrevoli, ecc.) non vengono utilizzati. Il loro aspetto e comportamento sono imitati da widget Flutter stilizzati secondo le Human Interface Guidelines.
Ad esempio, per creare un pulsante in stile iOS si utilizza 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: () {
// Azione al clic
},
);
}
}
Flutter interagisce con le API native tramite i suoi plugin, usando i canali di piattaforma (Platform Channels). Questo permette di chiamare codice nativo iOS da Dart e viceversa.
import 'package:flutter/services.dart';
class NativeApi {
static const platform = MethodChannel('com.example.myapp/battery'); // Nome del canale
Future<String> getBatteryLevel() async {
try {
final String result = await platform.invokeMethod('getBatteryLevel'); // Chiamata del metodo nativo
return 'Livello batteria: $result%.';
} on PlatformException catch (e) {
return "Impossibile ottenere il livello della batteria: '${e.message}'.";
}
}
}
Sul lato iOS, il codice nativo gestisce le chiamate tramite MethodChannel.
// Codice Swift nel progetto 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: "Il livello della batteria non è disponibile.",
details: nil))
} else {
result(Int(device.batteryLevel * 100))
}
}
}
Per adattare il design si usano widget della libreria cupertino, che imitano lo stile iOS. L'accesso a funzioni specifiche di iOS avviene anche tramite plugin. La compilazione dell'app per iOS avviene tramite Xcode. Flutter genera un progetto iOS che viene poi compilato in un file eseguibile nativo (.ipa).