¿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).