Was macht flutter-plugins?
Erstellen Sie ein Flutter-Plugin, das native Interoperabilität für andere Flutter-Apps bereitstellt.
Übersicht
Diese Anleitung beschreibt, wie Sie ein Flutter-Plugin entwickeln, das anderen Flutter-Apps den Zugriff auf plattformspezifische Funktionen (z. B. Kamera, Sensoren, Bluetooth) über eine einheitliche Dart-API ermöglicht.
Erstellung eines Plugins
Verwenden Sie den folgenden Befehl, um ein neues Plugin-Projekt zu erstellen:
flutter create --template=plugin --platforms=android,ios <plugin_name>
Ersetzen Sie <plugin_name> durch den gewünschten Namen Ihres Plugins (z. B. my_flutter_plugin).
Projektstruktur
Ein typisches Flutter-Plugin hat folgende Struktur:
<plugin_name>/
├── lib/
│ └── <plugin_name>.dart # Öffentliche Dart-API
├── android/
│ └── src/main/
│ ├── kotlin/com/.../<PluginName>.kt # Android-Implementierung
│ └── AndroidManifest.xml
├── ios/
│ └── Classes/
│ └── <PluginName>.swift # iOS-Implementierung
├── example/ # Beispiel-App
├── pubspec.yaml
└── README.md
Implementierung der nativen Seite
Android (Kotlin/Java)
- Öffnen Sie die Datei
android/src/main/kotlin/.../<PluginName>.kt. - Implementieren Sie die
MethodCallHandler-Schnittstelle. - Registrieren Sie das Plugin im
onAttachedToEngine-Callback.
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
class MyFlutterPlugin: FlutterPlugin, MethodChannel.MethodCallHandler {
private lateinit var channel: MethodChannel
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "com.example.my_flutter_plugin")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
if (call.method == "getPlatformName") {
result.success("Android")
} else {
result.notImplemented()
}
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
}
iOS (Swift/Objective-C)
- Öffnen Sie die Datei
ios/Classes/<PluginName>.swift. - Implementieren Sie die
FlutterPlugin- undFlutterStreamHandler-Protokolle (je nach Bedarf). - Registrieren Sie das Plugin in der
register-Methode.
import Flutter
import UIKit
public class MyFlutterPlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "com.example.my_flutter_plugin", binaryMessenger: registrar.messenger())
let instance = MyFlutterPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
if call.method == "getPlatformName" {
result("iOS")
} else {
result(FlutterMethodNotImplemented)
}
}
}
Implementierung der Dart-API
Erstellen Sie die öffentliche Dart-API in lib/<plugin_name>.dart:
import 'dart:async';
import 'package:flutter/services.dart';
class MyFlutterPlugin {
static const MethodChannel _channel = MethodChannel('com.example.my_flutter_plugin');
static Future<String?> get platformName async {
final String? name = await _channel.invokeMethod('getPlatformName');
return name;
}
}
Abhängigkeiten verwalten
Fügen Sie in der pubspec.yaml die erforderlichen Abhängigkeiten hinzu:
dependencies:
flutter:
sdk: flutter
# Weitere Abhängigkeiten
Berechtigungen
Fügen Sie die erforderlichen Berechtigungen in den nativen Manifesten hinzu:
- Android:
android/app/src/main/AndroidManifest.xml - iOS:
ios/Runner/Info.plist
Tests
Schreiben Sie Unit-Tests, Widget-Tests und Integrationstests für Ihr Plugin:
test('getPlatformName gibt korrekten Plattformnamen zurück', () async {
// Testimplementierung
});
Fazit
Mit dieser Anleitung können Sie ein voll funktionsfähiges Flutter-Plugin erstellen, das plattformspezifische Funktionalität über eine saubere API für andere Flutter-Apps bereitstellt.