Πώς προσαρμόζεται το Flutter στο λειτουργικό σύστημα iOS;
sobes.tech AI
Απάντηση από AI
Το Flutter χρησιμοποιεί τον κινητήρα Skia για την απόδοση του UI, ο οποίος αλληλεπιδρά άμεσα με την GPU. Δεν χρησιμοποιούνται εγγενή στοιχεία iOS (κουμπιά, κύλιση κ.λπ.). Η εμφάνιση και η συμπεριφορά τους μιμούνταιται από widget του Flutter, διαμορφωμένα σύμφωνα με τις Οδηγίες Ανθρώπινης Διεπαφής.
Για παράδειγμα, για τη δημιουργία κουμπιού σε στυλ iOS χρησιμοποιείται το 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: () {
// Ενέργεια κατά το πάτημα
},
);
}
}
Το Flutter αλληλεπιδρά με τις εγγενείς API μέσω των plugins του, χρησιμοποιώντας κανάλια πλατφόρμας (Platform Channels). Αυτό επιτρέπει την κλήση εγγενών κωδικών iOS από Dart και το αντίστροφο.
import 'package:flutter/services.dart';
class NativeApi {
static const platform = MethodChannel('com.example.myapp/battery'); // Όνομα καναλιού
Future<String> getBatteryLevel() async {
try {
final String result = await platform.invokeMethod('getBatteryLevel'); // Κλήση εγγενούς μεθόδου
return 'Επίπεδο μπαταρίας: $result%.';
} on PlatformException catch (e) {
return "Αδυναμία λήψης επιπέδου μπαταρίας: '${e.message}'.";
}
}
}
Από την πλευρά iOS, ο εγγενής κώδικας χειρίζεται τις κλήσεις μέσω του MethodChannel.
// Κώδικας Swift στο έργο 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: "Το επίπεδο μπαταρίας δεν είναι διαθέσιμο.",
details: nil))
} else {
result(Int(device.batteryLevel * 100))
}
}
}
Για την προσαρμογή του σχεδιασμού, χρησιμοποιούνται widget από τη βιβλιοθήκη cupertino, που μιμούνται το στυλ iOS. Επίσης, η πρόσβαση σε συγκεκριμένες λειτουργίες του iOS πραγματοποιείται μέσω plugins. Η κατασκευή της εφαρμογής για iOS γίνεται μέσω του Xcode. Το Flutter δημιουργεί ένα έργο iOS, το οποίο στη συνέχεια μεταγλωττίζεται σε εγγενή εκτελέσιμο αρχείο (.ipa).