Hoe past Flutter zich aan het iOS-besturingssysteem aan?
sobes.tech AI
Antwoord van AI
Flutter gebruikt de Skia-engine voor het renderen van de gebruikersinterface, die direct met de GPU communiceert. Native iOS-componenten (knoppen, scrollbars, enz.) worden niet gebruikt. Hun uiterlijk en gedrag worden geïmiteerd door Flutter-widgets die zijn gestileerd volgens de Human Interface Guidelines.
Bijvoorbeeld, om een iOS-stijl knop te maken, wordt CupertinoButton gebruikt:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class MyCupertinoButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoButton(
child: Text('Нажми меня'),
onPressed: () {
// Actie bij drukken
},
);
}
}
Flutter communiceert met native API's via zijn plugins, gebruikmakend van platformkanalen (Platform Channels). Dit stelt je in staat om native iOS-code aan te roepen vanuit Dart en vice versa.
import 'package:flutter/services.dart';
class NativeApi {
static const platform = MethodChannel('com.example.myapp/battery'); // Kanaalnaam
Future<String> getBatteryLevel() async {
try {
final String result = await platform.invokeMethod('getBatteryLevel'); // Aanroep van native methode
return 'Batterijniveau: $result%.';
} on PlatformException catch (e) {
return "Kan het batterijniveau niet ophalen: '${e.message}'.";
}
}
}
Aan de kant van iOS behandelt native code de oproepen via MethodChannel.
// Swift-code in iOS-project
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: "Batareya darajasi mavjud emas.",
details: nil))
} else {
result(Int(device.batteryLevel * 100))
}
}
}
Dizaynni moslashtirish uchun cupertino kutubxonasidan vidjetlar ishlatiladi, ular iOS uslubini taklif qiladi. Shuningdek, iOS ga xos funksiyalarga kirish pluginlar orqali amalga oshiriladi. iOS uchun ilovani yig'ish Xcode orqali amalga oshiriladi. Flutter iOS loyihasini yaratadi, u keyin nativ bajariladigan faylga (.ipa) kompilyatsiya qilinadi.