¿Qué hace flutter-plugins?
Construye un plugin de Flutter que proporciona interoperabilidad nativa para que otras aplicaciones Flutter lo utilicen.
Descripción General
Este skill te guía en la creación de un plugin Flutter que permite a las apps Flutter acceder a funcionalidades nativas de Android e iOS. El plugin expone una API Dart unificada mientras implementa el código específico de la plataforma mediante MethodChannel (Flutter) y FlutterMethodChannel (Android/iOS).
¿Qué es un Plugin de Flutter?
Un plugin de Flutter es un paquete que agrega funcionalidades nativas a una aplicación Flutter. Los plugins se utilizan para:
- Acceder a APIs de plataforma (cámara, GPS, Bluetooth, etc.)
- Integrar servicios nativos (pago, autenticación, etc.)
- Proporcionar widgets nativos personalizados
Estructura del Proyecto
mi_plugin/
├── lib/
│ └── mi_plugin.dart
├── android/
│ ├── src/main/kotlin/com/ejemplo/mi_plugin/
│ │ └── MiPlugin.kt
├── ios/
│ ├── Classes/
│ │ └── MiPlugin.swift
├── test/
│ └── mi_plugin_test.dart
├── example/
│ └── (aplicación de ejemplo que usa el plugin)
├── pubspec.yaml
└── README.md
Cómo Empezar
- Crear el plugin: Ejecuta
flutter create --template=plugin mi_plugin - Definir la API Dart en
lib/mi_plugin.dart - Implementar la parte nativa:
- Android: Edita
MiPlugin.kt(o.java) - iOS: Edita
MiPlugin.swift(o.m)
- Android: Edita
- Usar el plugin: Agrega
mi_plugincomo dependencia en tu app Flutter
Ejemplo de Código
Dart (API)
import 'package:flutter/services.dart';
class MiPlugin {
static const _channel = MethodChannel('com.ejemplo/mi_plugin');
static Future<String?> getPlataforma() async {
return await _channel.invokeMethod('getPlataforma');
}
}
Android (Kotlin)
class MiPlugin: FlutterPlugin, MethodCallHandler {
override fun onMethodCall(call: MethodCall, result: Result) {
if (call.method == "getPlataforma") {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
} else {
result.notImplemented()
}
}
}
iOS (Swift)
public class MiPlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "com.ejemplo/mi_plugin", binaryMessenger: registrar.messenger())
let instance = MiPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
if call.method == "getPlataforma" {
result("iOS " + UIDevice.current.systemVersion)
} else {
result(FlutterMethodNotImplemented)
}
}
}
Recursos
Consejos
- Siempre maneja errores de forma adecuada en ambas plataformas
- Prueba el plugin tanto en simuladores como en dispositivos reales
- Escribe pruebas unitarias para la lógica Dart y nativa
- Publica tu plugin en pub.dev para que otros puedan usarlo