Ինչպե՞ս է Flutter-ը հարմարվում iOS օպերացիոն համակարգին։
sobes.tech AI
Պատասխան AI-ից
Flutter-ը օգտագործում է Skia շարժիչը UI-ի ռենդերինգի համար, որը ուղղակիորեն փոխազդում է GPU-ի հետ: Նատիվ iOS կոմպոնենտներ (կոճակներ, սլայդերներ և այլն) չեն օգտագործվում: Դրանց տեսքը և վարքը իմիտացիա են ստանում Flutter-ի widget-ների միջոցով, որոնք ձևավորվում են Human Interface Guidelines-ի համաձայն:
Օրինակ, 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-ների հետ իր պլագինների միջոցով, օգտագործելով platform channels (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))
}
}
}
Դիզայնի հարմարեցման համար օգտագործվում են cupertino գրադարանի widget-ները, որոնք իմիտացիա են iOS-ի ոճի։ Նաեւ, հատուկ iOS ֆունկցիաներին հասանելիությունը իրականացվում է պլագինների միջոցով։ iOS հավելվածի հավաքումը կատարվում է Xcode-ի միջոցով։ Flutter-ը գեներացնում է iOS նախագիծ, որը հետո կոմպիլացվում է նատիվ executable ֆայլի (.ipa)։