O que flutter-interoperating-with-native-apis faz?
Interopera com APIs de plataforma nativa no Android, iOS e na web. Use ao acessar recursos específicos do dispositivo não disponíveis em Dart ou ao chamar código nativo existente.
Visão Geral
Esta habilidade fornece mecanismos para que aplicativos Flutter se comuniquem com código nativo das plataformas alvo, permitindo acesso a funcionalidades como câmera, sensores, armazenamento local, e muito mais.
Plataformas Suportadas
- Android: Kotlin/Java via Android Method Channels
- iOS: Swift/Objective-C via Flutter Method Channels
- Web: JavaScript via pacote
js
Como Funciona
Method Channels
Os Method Channels permitem que o Dart envie mensagens para o lado nativo e receba respostas de forma assíncrona.
Exemplo no Dart:
import 'package:flutter/services.dart';
static const platform = MethodChannel('com.example/native');
Future<String> getBatteryLevel() async {
try {
final result = await platform.invokeMethod('getBatteryLevel');
return 'Battery level: $result%';
} on PlatformException catch (e) {
return 'Failed to get battery level: ${e.message}';
}
}
Exemplo no Android (Kotlin):
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.example/native"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
call, result ->
if (call.method == "getBatteryLevel") {
val batteryLevel = getBatteryLevel()
if (batteryLevel != -1) {
result.success(batteryLevel)
} else {
result.error("UNAVAILABLE", "Battery level not available.", null)
}
} else {
result.notImplemented()
}
}
}
private fun getBatteryLevel(): Int {
val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
}
}
Exemplo no iOS (Swift):
import Flutter
import UIKit
public class SwiftFlutterPlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "com.example/native", binaryMessenger: registrar.messenger())
let instance = SwiftFlutterPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
if call.method == "getBatteryLevel" {
let batteryLevel = UIDevice.current.batteryLevel * 100
if batteryLevel >= 0 {
result(Int(batteryLevel))
} else {
result(FlutterError(code: "UNAVAILABLE", message: "Battery level not available.", details: nil))
}
} else {
result(FlutterMethodNotImplemented)
}
}
}
Exemplo na Web (JavaScript):
// arquivo: web/index.html
<script>
window.flutter_inappwebview = {
callHandler: function(handlerName, ...args) {
return window.flutter_inappwebview.callHandler(handlerName, ...args);
}
};
function getBatteryLevel() {
// Lógica nativa da web
return 75;
}
</script>
Melhores Práticas
- Tratamento de Erros: Sempre implemente tratamento adequado de erros nos Method Channels para evitar que exceções não tratadas quebrem o aplicativo.
- Tipos de Dados: Use tipos de dados suportados (
String,int,double,bool,List,Map) para serialização através dos canais. - Desempenho: Mantenha as operações nativas leves para não bloquear a thread principal do Dart.
- Testes: Utilize testes unitários e de widget para simular as chamadas de canal.
Links Relacionados
Contribuições
Sinta-se à vontade para contribuir com melhorias e exemplos adicionais através de pull requests.