Platform channel là kênh gửi message bất đồng bộ giữa Dart và code native (Kotlin/Java trên Android, Swift/Obj-C trên iOS). Dữ liệu được mã hoá qua codec (mặc định StandardMessageCodec), nên chỉ truyền được kiểu cơ bản: số, chuỗi, list, map, byte.
Ba loại channel:
- MethodChannel: gọi hàm kiểu request/response — dùng nhiều nhất.
- EventChannel: native đẩy một stream sự kiện về Dart (cảm biến, trạng thái pin).
- BasicMessageChannel: gửi message tự do hai chiều.
const channel = MethodChannel('app/battery');
Future<int?> getBattery() async {
try {
return await channel.invokeMethod<int>('getBatteryLevel');
} on PlatformException catch (e) {
debugPrint('Lỗi native: ${e.message}');
return null;
}
}MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "app/battery")
.setMethodCallHandler { call, result ->
if (call.method == "getBatteryLevel") result.success(readBattery())
else result.notImplemented()
}Khi nào dùng: cần API native chưa có plugin — SDK thanh toán, eKYC của đối tác, phần cứng riêng. Thứ tự ưu tiên thực tế: plugin có sẵn trên pub.dev → tự viết channel → đóng gói thành plugin nếu dùng lại nhiều nơi.
Công cụ nên biết: Pigeon sinh code type-safe cho cả hai phía thay vì so chuỗi tên method bằng tay; dart:ffi gọi thẳng thư viện C/C++ một cách đồng bộ, không qua channel.
Lưu ý: handler phía native chạy trên main thread của platform — việc nặng (đọc file lớn, xử lý ảnh) phải chuyển sang background thread rồi mới trả result, nếu không UI sẽ giật. Tên channel và tên method phải khớp chính xác ở hai phía; thiếu handler sẽ gặp MissingPluginException.