Appearance
platform-channel-demo
1. 实验目标
用最小 Flutter + Android 实现验证 PlatformChannel 三类通道(对应 docs/05-bridge-hybrid/01):
- MethodChannel:单次异步调用(Flutter 请求电量 → Native 返回)
- EventChannel:Native 单向持续推事件(模拟网络状态变化,每 2 秒推一条)
- BasicMessageChannel:双向消息(本文档说明,最小代码聚焦前两者)
2. 工程要点
- Flutter 侧:
lib/topics/bridge_hybrid/platform_channel_demo/platform_channel_demo_page.dartMethodChannel('com.example.app/battery').invokeMethod('getBatteryLevel')EventChannel('com.example.app/connectivity').receiveBroadcastStream()订阅事件流
- Android 侧:
android/app/src/main/kotlin/.../MainActivity.ktMethodChannel.setMethodCallHandler处理getBatteryLevelEventChannel.setStreamHandler定时推送;onCancel里必须清eventSink并停掉定时器(防泄漏)
- 本 Lab 是 Flutter host 内嵌页面,入口:首页列表 →
PlatformChannel 桥接演示
3. 运行方式
bash
cd labs/flutter/host
flutter pub get
flutter run # 连接设备/模拟器4. 预期现象
- 点击"获取电量 (MethodChannel)":日志区打印
MethodChannel 返回电量: 83% - 点击"订阅事件流 (EventChannel)":每 2 秒打印一条
EventChannel 事件: wifi/5g/offline... - 退出页面:事件流自动停止(
dispose里cancel()触发 NativeonCancel)
5. 常见误区
| 误区 | 实际情况 |
|---|---|
| Channel 可以在任意线程调用 | 消息收发必须走 Native 主线程,子线程调用需 Handler.post |
| EventChannel 不订阅也推送 | onListen 才建立推送,onCancel 必须清 eventSink 否则泄漏 |
| 高频大字节走 Channel 没问题 | 序列化 + 主线程拷贝会掉帧,大字节改用 dart:ffi / Texture |
6. 对应知识库文档
- 理论主文档:PlatformChannel 深度解析:MethodChannel / EventChannel / BasicMessageChannel
- FFI 零拷贝对照:Native 原生线程与 Dart Isolate 桥接 (FFI 零拷贝与 NativePort)