Sobes.tech
Middle

Как се адаптира Flutter към операционната система iOS?

sobes.tech AI

Отговор от AI

Flutter използва двигателя Skia за рендериране на потребителския интерфейс, който директно взаимодейства с GPU. Не се използват нативни компоненти на iOS (бутоните, скроловете и т.н.). Техният външен вид и поведение се имитират чрез widget-и на 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). Това позволява извикване на нативен код на 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 се осъществява чрез плъгини. Сглобяването на приложението за iOS става чрез Xcode. Flutter генерира iOS проект, който след това се компилира в нативен изпълним файл (.ipa).