Sobes.tech
Middle

Kaip prisitaiko Flutter prie iOS operacinės sistemos?

sobes.tech AI

Atsakymas iš AI

Flutter naudoja Skia variklį UI atvaizdavimui, kuris tiesiogiai sąveikauja su GPU. Natyvios iOS komponentės (mygtukai, slankikliai ir kt.) nėra naudojamos. Jų išvaizda ir elgsena imituojama Flutter widget'ais, stilizuotais pagal Human Interface Guidelines.

Pavyzdžiui, kuriant iOS stiliaus mygtuką naudojamas CupertinoButton:

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

class MyCupertinoButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoButton(
      child: Text('Paspausk mane'),
      onPressed: () {
        // Veiksmas paspaudus
      },
    );
  }
}

Flutter sąveikauja su natyviais API per savo plėtinius, naudojant platformos kanalus (Platform Channels). Tai leidžia iš Dart kodo iškviesti iOS natūralų kodą ir atvirkščiai.

import 'package:flutter/services.dart';

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

  Future<String> getBatteryLevel() async {
    try {
      final String result = await platform.invokeMethod('getBatteryLevel'); // Natūralios funkcijos iškvietimas
      return 'Baterijos lygis: $result%.';
    } on PlatformException catch (e) {
      return "Nepavyko gauti baterijos lygio: '${e.message}'.";
    }
  }
}

iOS pusėje natūralus kodas apdoroja iškvietimus per MethodChannel:

// Swift kodas iOS projekte
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: "Baterijos lygis nepasiekiamas.",
                          details: nil))
    } else {
      result(Int(device.batteryLevel * 100))
    }
  }
}

Dizaino pritaikymui naudojami cupertino bibliotekos widget'ai, imituojantys iOS stilių. Taip pat, prieiga prie specifinių iOS funkcijų vykdoma per plėtinius. iOS programos kūrimas vyksta per Xcode. Flutter generuoja iOS projektą, kuris vėliau kompiliuojamas į nativų vykdomąjį failą (.ipa).