Sobes.tech
Middle

¿Cómo se adapta Flutter al sistema operativo iOS?

sobes.tech AI

Respuesta de la IA

Flutter utiliza el motor Skia para renderizar la interfaz de usuario, que interactúa directamente con la GPU. No se utilizan componentes nativos de iOS (botones, desplazamientos, etc.). Su apariencia y comportamiento se imitan con widgets de Flutter estilizados según las Directrices de Interfaz Humana.

Por ejemplo, para crear un botón al estilo de iOS se usa 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: () {
        // Acción al presionar
      },
    );
  }
}

Flutter interactúa con las API nativas a través de sus plugins, usando canales de plataforma (Platform Channels). Esto permite llamar código nativo de iOS desde Dart y viceversa.

import 'package:flutter/services.dart';

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

  Future<String> getBatteryLevel() async {
    try {
      final String result = await platform.invokeMethod('getBatteryLevel'); // Llamada al método nativo
      return 'Nivel de batería: $result%.';
    } on PlatformException catch (e) {
      return "No se pudo obtener el nivel de batería: '${e.message}'.";
    }
  }
}

En el lado de iOS, el código nativo maneja las llamadas a través de MethodChannel.

// Código Swift en el proyecto 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: "El nivel de batería no está disponible.",
                          details: nil))
    } else {
      result(Int(device.batteryLevel * 100))
    }
  }
}

Para adaptar el diseño se usan widgets de la biblioteca cupertino, que imitan el estilo de iOS. También se accede a funciones específicas de iOS mediante plugins. La compilación de la app para iOS se realiza a través de Xcode. Flutter genera un proyecto iOS que luego se compila en un archivo ejecutable nativo (.ipa).