Sobes.tech
Middle

როგორ ადაპტირდება Flutter iOS ოპერაციული სისტემისათვის?

sobes.tech AI

პასუხი AI-სგან

Flutter Skia მექანიზმს იყენებს UI-ის გამოსახულებისთვის, რომელიც პირდაპირ ურთიერთქმედებს GPU-სთან. ნატიური iOS კომპონენტები (ღილაკები, სლაიდერები და ა.შ.) არ გამოიყენება. მათი გარეგნობა და ქცევა იმიტირებულია Flutter-ის ვიჯეტებით, რომლებიც სტილიზებულია 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) გამოყენებით. ეს საშუალებას აძლევს დართიდან იოსის ნატიური კოდის გამოძახებას და პირიქით.

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}'.";
    }
  }
}

იოსის მხარეს ნატიური კოდი მართავს გამოძახილებს 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 ბიბლიოთეკის ვიჯეტები, რომლებიც იმიტირებენ iOS-ის სტილს. ასევე, სპეციფიკური iOS ფუნქციების მისაწვდომადობა ხდება პლაგინების მეშვეობით. iOS აპლიკაციის აგება ხდება Xcode-ის საშუალებით. Flutter ქმნის iOS პროექტს, რომელიც შემდეგ კომპილირდება ნატიური ფაილში (.ipa).