本节摘要:跨平台框架的 UI 与业务逻辑可复用,但相机、定位、推送、支付这类能力必须借力原生。RN 用原生模块机制,Flutter 用平台通道与插件。本节讲清两套桥接机制的原理(RN 桥、Flutter 的 Method/Event/Basic 三种通道)、何时需要原生能力,以及"先查库、再评估、后选型"的第三方库决策流程与权限处理。
阅读完本节,你应当能够:
跨平台框架能做的很多,但不是全部。想做高精度定位、接支付 SDK、调深度摄像头功能,框架内置 API 可能不够用。这时必须"桥接"到原生世界——把 iOS 的 Swift、Android 的 Kotlin 能力接进你的 JavaScript 或 Dart 代码。
一个反直觉的事实先讲清楚:大多数原生能力,你已经通过第三方库在用了,只是没意识到。当你装一个"定位插件"或"支付库"时,它内部就是一套封装好的桥接代码——库的作者替你把原生代码写好了。所以对多数应用,你需要掌握的不是"怎么自己写桥",而是"怎么找到并评估一个好库"。自己写原生桥是少数场景才需要的技能。
这里还要补一个认知:桥接不是越多越好。每次跨过桥都有通信开销与稳定性风险,桥越多,性能与调试的复杂度越高。成熟的跨平台项目会刻意"减少过桥次数"——把高频交互留在框架层,只在真正需要平台能力时才过桥。带着"桥是必要成本"的意识去设计功能,比"什么都要过桥"的写法稳健得多。这个原则在 RN 与 Flutter 里完全一致,也是原生能力调用章节最想传递的工程观。
| 场景 | 例子 | 为什么需要原生 |
|---|---|---|
| 硬件交互 | 蓝牙、NFC、传感器 | 框架 API 未暴露 |
| 高精度能力 | 高精度定位 | 原生 SDK 更准 |
| 商业 SDK | 支付、地图、推送 | SDK 原生长这样 |
| 性能敏感 | 图像处理、编解码 | 原生更快 |
| 复用代码 | 已有原生库 | 避免重写 |
判断标准:框架内置能力能覆盖就先用内置,覆盖不了再找库,库不行才自己写桥。从易到难,逐级下探。
RN 的原生模块基于"桥":JavaScript 线程与原生线程独立,JS 通过桥向原生发消息,原生执行后把结果或事件返回 JS。
原生模块用 iOS 的 Objective-C/Swift 或 Android 的 Java/Kotlin 编写,通过宏或注解导出方法与事件,JS 侧用 NativeModules 调用。这套机制也是第 2 章"双层架构"的落地点——JS 层写业务,原生层补能力。
Flutter 用平台通道(Platform Channels)连接原生。Dart 侧定义 MethodChannel,原生侧注册处理函数,调用时把方法名与参数发给原生,结果回传。
// Dart 侧 final channel = MethodChannel('com.example/battery'); final battery = await channel.invokeMethod('getBatteryLevel');
// Android 原生侧 MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example/battery") .setMethodCallHandler { call, result -> if (call.method == "getBatteryLevel") { result.success(batteryLevel) } else { result.notImplemented() } }
平台通道的通信有开销,所以设计上"高频交互留在 Dart 侧,需要原生能力才过桥"——这与 RN 的"少过桥"原则一致。
Flutter 的平台通道其实有三种,初学者通常只接触第一种,但认识全貌能帮你选对方案:
MethodChannel(方法通道)。一次调用一次返回,适合"发起请求等结果"的场景——读取电量、获取定位。最常见。
EventChannel(事件通道)。持续推送事件流,适合"原生侧主动发数据"的场景——传感器数据、电量变化监听。它不需要 Dart 侧反复请求,原生侧按需推送。
BasicMessageChannel(消息通道)。传递原始消息,适合双向通信与平台协商场景,用得最少。
理解三种通道的分工,相当于掌握了 Flutter 原生通信的完整工具箱:要结果用 Method,要流用 Event,要消息用 Basic。多数应用只需要 MethodChannel 就够了,但知道另外两种存在,遇到"持续数据流"需求时就不会不知所措。

这张图上下两层:上层的桥接机制是原理,下层的三维度评估是方法。原理让您理解"为什么能调",方法让您学会"怎么选库"。
| 维度 | React Native | Flutter |
|---|---|---|
| 桥接机制 | Native Modules | Platform Channels |
| 原生语言 | Swift / Kotlin | Swift / Kotlin |
| 插件形式 | npm 包 | pub.dev 包 |
| 常见场景 | 定位、推送、支付 | 同左 |
第一步:先查有没有现成库。RN 查 npm,Flutter 查 pub.dev,关键词搜索目标能力。
第二步:三维度评估。维护活跃度(近期有没有更新)、平台覆盖度(双端是否支持)、API 稳定性(文档与版本是否清晰)。
第三步:看使用量与评价。下载量、star 数、issue 反馈,判断是否被广泛使用与验证。
第四步:小范围试跑。在示例项目里集成跑通,验证满足需求后再正式引入。
⚠️ 常见坑:下载量高的库一定好。下载量只说明"被使用得多",不说明"维护得好"。有些老库下载量巨大但多年不更新,与新版本框架不兼容。评估时把"最近更新时间"放在下载量前面看。
💡 关键直觉:选库的本质是"选一个愿意长期维护代码的陌生人"。维护活跃度是选库的第一维度——库可以不火,但不能没人修。
选一个简单原生能力练手:给待办应用加"获取当前位置"或"设置每日提醒通知"。先在库市场找到对应插件,评估三个维度,集成跑通,验证"选库流程 + 桥接原理"两个知识点。如果插件足够成熟,你甚至不用写一行原生代码——这正是桥接机制封装后的体验。
调用大多数原生能力(相机、定位、推送)都需要系统权限,这是新手最容易忽略的环节。权限分两层:配置层——在原生工程里声明权限(iOS 的 Info.plist、Android 的 Manifest),缺少声明则运行时报错;运行时层——iOS 与 Android 的运行时权限弹窗,需要应用主动请求并获得用户同意。
两套框架都有权限库封装了这套逻辑:RN 的权限库、Flutter 的权限处理插件。它们统一处理双端差异,你只需要调用一个 API。这里有个经验:权限请求要在"真正需要的时候"触发,而不是应用启动就一股脑要——用户对"为什么需要这个权限"有疑问时,拒绝率会大增。合理时机与说明文案,是权限交互设计的一部分。
问:不写原生代码,能用原生能力吗? 能,绝大多数场景可以。成熟插件把原生代码封装好了,你只调用 Dart 或 JS API。写原生代码只出现在两种情况:插件市场找不到你要的能力,或现有插件不满足定制需求。所以新手完全可以从"只装插件、不写原生"起步。
问:写原生模块需要学 Swift 和 Kotlin 吗? 需要基础,但不必精通。写原生桥需要能读、能改平台代码,理解基本语法与平台 API。多数开发者的原生水平停留在"能照模板改"的层面。真要写桥时,以官方模板为起点,边改边学即可。
问:评估库时最该看什么指标? 第一看最近更新时间与对应框架版本的兼容性,第二看 issue 是否有人响应修复,第三看下载量与使用反馈。顺序很重要:活跃度排第一,因为框架迭代快,停更的库半年后就可能不兼容。
问:装了插件后项目变慢怎么办? 先排查是插件初始化开销还是运行时开销。多数插件在初始化时有一次性成本,运行时开销通常可控。如果确实变慢,检查是否加载了不必要的模块,或寻找更轻的替代插件。别急着归罪于"原生桥太慢"——多数性能问题出在业务代码,不是桥。
选库时除了看维护活跃度,还要关注库与你所用框架版本的兼容性。框架大版本升级(比如 RN 从旧架构切到新架构、Flutter 的 Dart 版本升级)时,部分库可能还没适配,装上去就报编译错误。判断方式:看库的更新记录里是否声明支持你用的框架版本,或直接装上试跑。这个问题的现实意义是:别一上来就装最新版库,先确认它与你当前的框架版本兼容。选库不仅是"选哪个",也是"选哪个版本"——两件事都要看。
理解桥接机制后,一个自然的进阶是"自己写一个最小插件"。不必复杂——写一个返回设备型号或电池电量的最小模块,从官方模板起步,RN 写一个原生模块、Flutter 写一个平台通道实现。这个过程会让你真正理解"桥"的每个环节(注册、调用、回传),以后再遇到库的问题,排查范围会清晰很多。这不是要求每个人都成为原生专家,而是建议"至少亲手走一遍最小的桥",让原理从抽象变成经验。
学完本节,用两个实践检验:第一,从库里市场为待办应用选一个"本地通知"插件,完成评估三维度并集成跑通——验证选库流程;第二,试着回答"RN 原生模块与 Flutter 平台通道的通信方向"——验证原理理解。前者是"会用",后者是"懂原理"。两条都完成,本节就算扎实了。如果只想完成一项,优先第一个——能选对库、集成成功,已经解决了大多数实际需求,写原生桥是遇到特殊情况才需要的能力。
最后补充一个选库的实用原则:尽量选活跃库,同时做好换库预案。即使选了活跃度高的库,也要意识到"任何库都可能停止维护"。预案包括:把库的调用封装在独立模块里,将来换库只改一处;关注库的替代方案,提前了解备选。这个原则在长期维护的项目里价值很大——它把"依赖第三方"的风险控制在了可管理的范围,而不是把项目命运完全押在一个库上。
原生能力接进来了,最后一节——调试工具与热重载,让"出问题找得到原因",也为整个教程收官。