Sobes.tech
Middle

Flutter qanday qilib iOS operatsion tizimiga moslashadi?

sobes.tech AI

AIdan javob

Flutter UI-ni render qilish uchun Skia dvigatelidan foydalanadi, u GPU bilan to'g'ridan-to'g'ri o'zaro aloqada bo'ladi. iOS ning mahalliy komponentlari (tugmalar, skrolllar va boshqalar) ishlatilmaydi. Ularning ko'rinishi va xulq-atvori Flutter vidjetlari bilan imitatsiya qilinadi, ular Human Interface Guidelines ga moslashtirilgan.

Masalan, iOS uslubidagi tugma yaratish uchun CupertinoButton ishlatiladi:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class MyCupertinoButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoButton(
      child: Text('Нажми меня'),
      onPressed: () {
        // Bosish bilan amalga oshiriladigan harakat
      },
    );
  }
}

Flutter mahalliy API lar bilan pluginlar orqali muloqot qiladi, platforma kanallari (Platform Channels) yordamida. Bu Dart dan iOS ning mahalliy kodini chaqirishga va aksincha qilishga imkon beradi.

import 'package:flutter/services.dart';

class NativeApi {
  static const platform = MethodChannel('com.example.myapp/battery'); // Kanal nomi

  Future<String> getBatteryLevel() async {
    try {
      final String result = await platform.invokeMethod('getBatteryLevel'); // Mahalliy metodni chaqirish
      return 'Batareya darajasi: $result%.';
    } on PlatformException catch (e) {
      return "Batareya darajasini olish imkoni bo'lmadi: '${e.message}'.";
    }
  }
}

iOS tomonida, mahalliy kod MethodChannel orqali chaqirilarni boshqaradi.

// iOS loyihasida Swift kodi
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, keyin esa u nativ bajariladigan faylga (.ipa) kompilyatsiya qilinadi.