Como o Flutter se adapta ao sistema operativo iOS?
sobes.tech IA
Resposta da IA
O Flutter usa o motor Skia para renderizar a interface de utilizador, que interage diretamente com a GPU. Componentes nativos do iOS (botões, barras de deslocamento, etc.) não são utilizados. A sua aparência e comportamento são imitados por widgets Flutter estilizados de acordo com as Human Interface Guidelines.
Por exemplo, para criar um botão ao estilo iOS, usa-se 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: () {
// Ação ao pressionar
},
);
}
}
O Flutter interage com as APIs nativas através dos seus plugins, usando canais de plataforma (Platform Channels). Isto permite chamar código nativo do iOS a partir de Dart e vice-versa.
import 'package:flutter/services.dart';
class NativeApi {
static const platform = MethodChannel('com.example.myapp/battery'); // Nome do canal
Future<String> getBatteryLevel() async {
try {
final String result = await platform.invokeMethod('getBatteryLevel'); // Chamada do método nativo
return 'Nível de bateria: $result%.';
} on PlatformException catch (e) {
return "Não foi possível obter o nível de bateria: '${e.message}'.";
}
}
}
No lado do iOS, o código nativo trata as chamadas através de MethodChannel.
// Código Swift no projeto 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: "O nível de bateria não está disponível.",
details: nil))
} else {
result(Int(device.batteryLevel * 100))
}
}
}
Para adaptar o design, utilizam-se widgets da biblioteca cupertino, que imitam o estilo iOS. O acesso a funções específicas do iOS também é feito através de plugins. A compilação da aplicação para iOS é feita através do Xcode. O Flutter gera um projeto iOS que é posteriormente compilado num ficheiro executável nativo (.ipa).