Sobes.tech
Middle

Hoe past Flutter zich aan het iOS-besturingssysteem aan?

sobes.tech AI

Antwoord van AI

Flutter gebruikt de Skia-engine voor het renderen van de gebruikersinterface, die direct met de GPU communiceert. Native iOS-componenten (knoppen, scrollbars, enz.) worden niet gebruikt. Hun uiterlijk en gedrag worden geïmiteerd door Flutter-widgets die zijn gestileerd volgens de Human Interface Guidelines.

Bijvoorbeeld, om een iOS-stijl knop te maken, wordt CupertinoButton gebruikt:

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

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

Flutter communiceert met native API's via zijn plugins, gebruikmakend van platformkanalen (Platform Channels). Dit stelt je in staat om native iOS-code aan te roepen vanuit Dart en vice versa.

import 'package:flutter/services.dart';

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

  Future<String> getBatteryLevel() async {
    try {
      final String result = await platform.invokeMethod('getBatteryLevel'); // Aanroep van native methode
      return 'Batterijniveau: $result%.';
    } on PlatformException catch (e) {
      return "Kan het batterijniveau niet ophalen: '${e.message}'.";
    }
  }
}

Aan de kant van iOS behandelt native code de oproepen via MethodChannel.

// Swift-code in iOS-project
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, u keyin nativ bajariladigan faylga (.ipa) kompilyatsiya qilinadi.