What are platform channels and why are they needed?
Short Answer
Platform channels are Flutter's message-passing bridge to native platform code (Kotlin/Java on Android, Swift/Objective-C on iOS) — used whenever you need a platform API or native SDK that has no Dart equivalent.
Flutter's Dart code doesn't run inside the native platform's runtime, so it can't call native APIs directly. A `MethodChannel` lets Dart invoke a named method with arguments and asynchronously receive a result, while the native side registers a handler for that channel name and method. Communication is serialized through a standard message codec (supporting primitives, lists, maps), so both sides need to agree on the channel name and method names as a contract.
This is needed for things with no existing Flutter package: a proprietary native SDK, a platform-specific API not yet wrapped by a plugin, or custom native UI embedding (via `PlatformView`). In practice, most apps never write raw platform channel code directly — they consume a plugin package that already wraps this for a specific capability (camera, Bluetooth, etc.) — but understanding the mechanism matters once you need a capability no plugin covers yet, or you're building a plugin yourself.
Code Example
const channel = MethodChannel('com.bidev.app/battery');
Future<int> getBatteryLevel() async {
final level = await channel.invokeMethod<int>('getBatteryLevel');
return level ?? -1;
}Common Mistakes
- ×Assuming platform channel calls are synchronous — they're always asynchronous (a Future on the Dart side).
- ×Mismatching the channel name or method name string between Dart and native code, causing a silent `MissingPluginException`.