Jak se Flutter přizpůsobuje operačnímu systému iOS?
sobes.tech AI
Odpověď od AI
Flutter používá engine Skia pro vykreslování uživatelského rozhraní, který přímo komunikuje s GPU. Nativní komponenty iOS (tlačítka, posuvníky atd.) nejsou používány. Jejich vzhled a chování jsou napodobovány widgety Flutteru, stylizovanými podle Human Interface Guidelines.
Například pro vytvoření tlačítka ve stylu iOS se používá CupertinoButton:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class MyCupertinoButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoButton(
child: Text('Stiskni mě'),
onPressed: () {
// Akce při stisknutí
},
);
}
}
Flutter komunikuje s nativními API přes své pluginy, využívající platformní kanály (Platform Channels). To umožňuje volat nativní kód iOS z Dart a naopak.
import 'package:flutter/services.dart';
class NativeApi {
static const platform = MethodChannel('com.example.myapp/battery'); // Název kanálu
Future<String> getBatteryLevel() async {
try {
final String result = await platform.invokeMethod('getBatteryLevel'); // Volání nativní metody
return 'Úroveň nabití baterie: $result%.';
} on PlatformException catch (e) {
return "Nepodařilo se získat úroveň nabití: '${e.message}'.";
}
}
}
Na straně iOS nativní kód zpracovává volání přes MethodChannel.
// Swift kód v iOS projektu
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: "Úroveň nabití baterie není dostupná.",
details: nil))
} else {
result(Int(device.batteryLevel * 100))
}
}
}
Pro úpravu designu se používají widgety z knihovny cupertino, které napodobují styl iOS. Přístup ke specifickým funkcím iOS je také možný přes pluginy. Sestavení aplikace pro iOS probíhá přes Xcode. Flutter generuje iOS projekt, který je následně kompilován do nativního spustitelného souboru (.ipa).