Flutter Packages & Plugins
Information drawn from
The plugin API supports federated plugins that enable separation of different platform implementations. You can also now indicate which platforms a plugin supports, for example web and macOS.
Eventually, the old plugin APIs will be deprecated. In the short term, you will see a warning when the framework detects that you are using an old-style plugin. For information on how to upgrade your plugin, see Supporting the new Android plugins APIs.
Packages enable the creation of modular code that can be shared easily. A minimal package consists of the following:
pubspec.yaml A metadata file that declares the package name, version, author, and so on.
The lib directory contains the public code in the package, minimally a single
Note: For a list of dos and don’ts when writing an effective plugin, see the Medium article by Mehmet Fidanboylu, Writing a good plugin.
Packages can contain more than one kind of content:
General packages written in Dart, for example the path package. Some of these might contain Flutter specific functionality and thus have a dependency on the Flutter framework, restricting their use to Flutter only, for example the fluro package.
A specialized Dart package that contains an API written in Dart code combined with one or more platform-specific implementations. Plugin packages can be written for Android (using Kotlin or Java), iOS (using Swift or Objective-C), web, macOS, Windows, or Linux, or any combination thereof. A concrete example is the url_launcher plugin package. To see how to use the url_launcher package, and how it was extended to implement support for web, see the Medium article by Harry Terkelsen, How to Write a Flutter Web Plugin, Part 1.
FFI Plugin packages
A specialized Dart package that contains an API written in Dart code combined with one or more platform-specific implementations that use Dart FFI (Android, iOS, macOS).
Developing Dart packages
The following instructions explain how to write a Flutter package.
Step 1: Create the package
To create a starter Flutter package, use the –template=package flag with flutter create:
flutter create --template=package hello
This creates a package project in the hello folder with the following content:
LICENSE A (mostly) empty license text file. test/hello_test.dart The unit tests for the package. hello.iml A configuration file used by the IntelliJ IDEs. .gitignore A hidden file that tells Git which files or folders to ignore in a project. .metadata A hidden file used by IDEs to track the properties of the Flutter project. pubspec.yaml A yaml file containing metadata that specifies the package’s dependencies. Used by the pub tool. README.md A starter markdown file that briefly describes the package’s purpose. lib/hello.dart A starter app containing Dart code for the package. .idea/modules.xml, .idea/workspace.xml A hidden folder containing configuration files for the IntelliJ IDEs. CHANGELOG.md A (mostly) empty markdown file for tracking version changes to the package.
Step 2: Implement the package
For pure Dart packages, simply add the functionality inside the main lib/
To test the package, add unit tests in a test directory.
For additional details on how to organize the package contents, see the Dart library package documentation.
Last update on 15 Aug 2022