Marked Command Execution
Install
npx -y skills add flutter/agent-plugins --skill flutter-building-plugins --agent claude-codeRun in a terminal. Claude loads the skill when a task calls for it. Check the repo's README before you run it.
Files
Developing Flutter Plugins
Contents
- Architecture & Design Patterns
- Workflow: Creating a New Plugin
- Workflow: Implementing Android Platform Code
- Workflow: Implementing Windows Platform Code
- Workflow: Adding Platforms to an Existing Plugin
- Examples
Architecture & Design Patterns
Federated Plugins
Implement federated plugins to split a plugin's API across multiple packages, allowing independent teams to build platform-specific implementations. Structure federated plugins into three distinct components:
- App-facing interface: The primary package users depend on. It exports the public API.
- Platform interface: The package defining the common interface that all platform implementations must implement.
- Platform implementations: Independent packages containing platform-specific code (e.g.,
my_plugin_android,my_plugin_windows).
FFI vs. Standard Plugins
Choose the correct plugin template based on your native interoperability requirements:
- Standard Plugins (
--template=plugin): Use for accessing platform-specific APIs (e.g., Android SDK, iOS frameworks) via Method Channels. - FFI Plugins (
--template=plugin_ffi): Use for accessing C/C++ native libraries, configuring Google Play services on Android, or using static linking on iOS/macOS.- Constraint: FFI plugin packages support bundling native code and method channel registration code, but not method channels themselves. If you require both method channels and FFI, use the standard non-FFI plugin template.
Workflow: Creating a New Plugin
Follow this workflow to initialize a new plugin package.
Task Progress:
- Determine if the plugin requires FFI or standard Method Channels.
- Execute the appropriate
flutter createcommand. - Verify the generated directory structure.
Conditional Initialization:
- If creating a STANDARD plugin:
Run the following command, specifying your supported platforms, organization, and preferred languages (defaults are Swift and Kotlin):
flutter create --template=plugin \ --platforms=android,ios,web,linux,macos,windows \ --org com.example.organization \ -i objc -a java \ my_plugin - If creating an FFI plugin:
Run the following command to generate a project with Dart code in
lib(usingdart:ffi) and native source code insrc(with aCMakeLists.txt):flutter create --template=plugin_ffi my_ffi_plugin
Workflow: Implementing Android Platform Code
Always edit Android platform code using Android Studio to ensure proper code completion and Gradle synchronization.
Task Progress:
- Run initial build to generate necessary Gradle files.
- Open the Android module in Android Studio.
- Implement
FlutterPluginand lifecycle-aware interfaces. - Refactor legacy
registerWithlogic. - Run validator -> review errors -> fix.
- Generate Build Files:
Build the code at least once before editing to resolve dependencies.
cd example flutter build apk --config-only - Open in IDE:
Launch Android Studio and open the
example/android/build.gradleorexample/android/build.gradle.ktsfile. - Locate Source:
Navigate to your plugin's source code at
java/<organization-path>/<PluginName>. - Implement V2 Embedding:
- Implement the
FlutterPlugininterface. - Ensure your plugin class has a public constructor.
- Extract shared initialization logic from the legacy
registerWith()method and the newonAttachedToEngine()method into a single private method. Both entry points must call this private method to maintain backward compatibility without duplicating logic.
- Implement the
- Implement Lifecycle Interfaces:
- If your plugin requires an
Activityreference: Implement theActivityAwareinterface and handle theonAttachedToActivity,onDetachedFromActivityForConfigChanges,onReattachedToActivityForConfigChanges, andonDetachedFromActivitycallbacks. - If your plugin runs in a background
Service: Implement theServiceAwareinterface.
- If your plugin requires an
- Update Example App:
Ensure the example app's
MainActivity.javaextends the v2 embeddingio.flutter.embedding.android.FlutterActivity. - Document API: Document all non-overridden public members in your Android implementation.
Workflow: Implementing Windows Platform Code
Always edit Windows platform code using Visual Studio.
Task Progress:
- Run initial build to generate the Visual Studio solution.
- Open the solution in Visual Studio.
- Implement C++ logic.
- Rebuild the solution.
- Generate Build Files:
cd example flutter build windows - Open in IDE:
Launch Visual Studio and open the
example/build/windows/hello_example.slnfile. - Locate Source:
Navigate to
hello_plugin/Source Filesandhello_plugin/Header Filesin the Solution Explorer. - Rebuild: After making changes to the C++ plugin code, you must rebuild the solution in Visual Studio before running the app, or the outdated plugin binary will be used.
Workflow: Adding Platforms to an Existing Plugin
Use this workflow to retrofit an existing plugin with support for additional platforms.
Task Progress:
- Run the platform addition command.
- Update iOS/macOS podspecs (if applicable).
- Implement the platform-specific code.
- Run Create Command:
Navigate to the root directory of your existing plugin and run:
flutter create --template=plugin --platforms=web,macos . - Update Podspecs:
If adding iOS or macOS support, open the generated
.podspecfile and configure the required dependencies and deployment targets.
Examples
Android V2 Embedding Implementation
High-fidelity example of an Android plugin implementing FlutterPlugin and ActivityAware while maintaining legacy compatibility.
package com.example.myplugin;
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;
/** MyPlugin */
public class MyPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
private MethodChannel channel;
// Public constructor required for v2 embedding
public MyPlugin() {}
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
setupChannel(flutterPluginBinding.getBinaryMessenger());
}
// Legacy v1 embedding support
public static void registerWith(Registrar registrar) {
MyPlugin plugin = new MyPlugin();
plugin.setupChannel(registrar.messenger());
}
// Shared initialization logic
private void setupChannel(BinaryMessenger messenger) {
channel = new MethodChannel(messenger, "my_plugin");
channel.setMethodCallHandler(this);
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
} else {
result.notImplemented();
}
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
@Override
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
// Handle Activity attachment
}
@Override
public void onDetachedFromActivityForConfigChanges() {
// Handle config changes
}
@Override
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
// Handle reattachment
}
@Override
public void onDetachedFromActivity() {
// Clean up Activity references
}
}
Facts
- Kind
- Skill
- Repo
- flutter/agent-plugins
- Group
- Uncategorized
- Installs
- 8.2k
- Stars
- 3.1K
- 1find-skillsvercel-labs/skillsHelps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.3.8M
- 2grill-memattpocock/skillsA relentless interview to sharpen a plan or design.1.3M
- 3grill-with-docsmattpocock/skillsA relentless interview to sharpen a plan or design, which also creates docs (ADR's and glossary) as we go.1.1M
- 4agent-browservercel-labs/agent-browserBrowser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.1.1M
- 5improve-codebase-architecturemattpocock/skillsScan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.1.1M
- 6tddmattpocock/skillsTest-driven development. Use when the user wants to build features or fix bugs test-first, mentions "red-green-refactor", or wants integration tests.1.1M