fl_channel
Native channel communication for Flutter. Create event channels, control their lifecycle from Dart, and push events from native code back to Flutter.
Supported platforms
| Platform | Support | Native implementation |
|---|---|---|
| Android | Yes | Kotlin, minSdk 24 |
| iOS | Yes | Swift, iOS 15.0+, Swift Package Manager and CocoaPods |
| macOS | Yes | Swift, macOS 12.0+, Swift Package Manager and CocoaPods |
| Windows | Yes | C++, MethodChannel and EventChannel |
| Linux | Yes | C++ and GTK, MethodChannel and EventChannel |
| Web | Yes | Dart event stream and JavaScript bridge |
| HarmonyOS (OHOS) | Yes | ArkTS |
Requirements
- Flutter
>=3.24.0 - Dart
>=3.5.0
Android builds use AGP 9.1 and Gradle 9.3, so they require Flutter 3.47.0 or later. HarmonyOS builds use the OpenHarmony Flutter SDK, which may be based on an earlier Flutter release.
Installation
dependencies:
fl_channel: ^2.0.0
Usage
Create an event channel
final FlEventChannel? channel = await FlChannel.instance.create('event_test');
create returns the existing channel when it has already been created.
Listen to events
final bool listening = channel?.listen(
(dynamic data) {
debugPrint('received: $data');
},
onError: (dynamic error) {
debugPrint('error: $error');
},
) ?? false;
Pause, resume and dispose
channel?.pause();
channel?.resume();
final bool paused = channel?.isPaused ?? false;
await channel?.dispose();
Send an event from Dart for demonstration
await FlChannel.instance.sendEventFromNative('event_test', 'Hello from Dart');
This method goes through the native plugin and emits the payload on the event channel. On Web it dispatches the payload to the local Dart event stream. It is useful for smoke tests; real applications usually send events from native code as shown below.
Default channel
final FlEventChannel? channel = await FlChannel.instance.defaultEventChannel();
await FlChannel.instance.defaultDispose();
The default channel name is fl_channel/event.
Pure Dart data stream
FlDataStream<T> is a small in-process event bus that does not involve native code.
final FlDataStream<String> stream = FlDataStream<String>();
final void Function() cancel = stream.listen((String data) {
debugPrint(data);
});
stream.send('hello');
cancel();
Sending events from native code
Create the channel from Dart first, then send events from native code.
Android (Kotlin):
FlChannelPlugin.getEventChannel("event_test")?.send(mapOf("value" to 42))
iOS and macOS (Swift):
FlChannelPlugin.getEventChannel("event_test")?.send(["value": 42])
HarmonyOS (ArkTS):
FlChannelPlugin.getEventChannel("event_test")?.send({ value: 42 });
Windows and Linux events are delivered by the plugin's C++ EventChannel implementation, so applications use the same Dart API on every desktop platform.
Web JavaScript bridge
Web platforms have no native process. Channels are simulated with a local Dart stream, and JavaScript can send events to an existing channel:
flChannelSendEvent('event_test', 'hello from JavaScript');
The channel must be created and listened to from Dart before JavaScript sends an event.
If www.gstatic.com is unreachable, self-host CanvasKit by running flutter build web --no-web-resources-cdn,
or point canvasKitBaseUrl at a local canvaskit/ directory. The example app already does this in
web/flutter_bootstrap.js.
Swift Package Manager
iOS and macOS sources are shared in darwin/ and expose a Package.swift, so the plugin works with both
Swift Package Manager and CocoaPods.
Example
The example app demonstrates creating a channel, listening to events, pausing, resuming, disposing and
sending events. It supports Android, iOS, macOS, Windows, Linux, Web and HarmonyOS.
Run it with:
cd example
flutter run
For Web:
cd example
flutter run -d chrome
To build the Web example without the gstatic CDN, use the bundled CanvasKit files:
cd example
flutter build web --no-web-resources-cdn
License
MIT