Event Channel & Method Channel in Flutter

Shubham Yeole
2 min readMay 20, 2023

--

In Flutter, the MethodChannel and EventChannel classes are used for communication between Dart code and platform-specific code (written in Java, Kotlin, Objective-C, or Swift).

Here’s an overview of the differences between MethodChannel and EventChannel:
1. MethodChannel: MethodChannel is used for invoking platform-specific methods from Dart and receiving the results back. It enables bi-directional communication where Dart code can call methods in platform-specific code and receive the results asynchronously.

  • Dart-to-Platform: In Dart, you use the invokeMethod method on the MethodChannel to call a platform-specific method. On the platform side, you handle the method invocation and return the result asynchronously.
  • Platform-to-Dart: After the platform-specific method completes execution, it can use the Result object to send a result or error back to the Dart side.
// In Dart code
final platformChannel = MethodChannel('channel_name');
final result = await platformChannel.invokeMethod('method_name', arguments);

// In Platform-specific code (Java/Kotlin or Objective-C/Swift)
methodChannel.setMethodCallHandler { call, result ->
if (call.method == "method_name") {
// Handle the method call and send the result back asynchronously
result.success(responseData); // or result.error(errorCode, errorMessage, errorDetails)
}
};

2. EventChannel: EventChannel is used for receiving continuous streams of events or data from platform-specific code. It enables the platform-specific code to send streams of data or events to the Dart side.

  • Platform-to-Dart: On the platform side, you set up a stream of events or data and send them using the EventSink.
  • Dart-to-Platform: In Dart, you listen to the stream provided by the EventChannel to receive the events or data sent from the platform.
// In Dart code
final eventChannel = EventChannel('channel_name');
final eventStream = eventChannel.receiveBroadcastStream();

eventStream.listen((event) {
// Handle events or data received from the platform
});

// In Platform-specific code (Java/Kotlin or Objective-C/Swift)
eventChannel.setStreamHandler(object : StreamHandler {
override fun onListen(arguments: Any?, eventSink: EventSink) {
// Set up the stream and send events or data through the eventSink
}

override fun onCancel(arguments: Any?) {
// Clean up resources when the stream is canceled by Dart
}
})

In summary, MethodChannel is used for invoking platform-specific methods and receiving results asynchronously, while EventChannel is used for receiving continuous streams of events or data from the platform. Both channels facilitate communication between Dart and platform-specific code in Flutter applications.

--

--