尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

深入react-native-app-tour源码:findNodeHandle与NativeModules如何打通JS与原生App Tour视图

深入react-native-app-tour源码:findNodeHandle与NativeModules如何打通JS与原生App Tour视图 深入react-native-app-tour源码findNodeHandle与NativeModules如何打通JS与原生App Tour视图【免费下载链接】react-native-app-tourReact Native: Native App Tour Library项目地址: https://gitcode.com/gh_mirrors/re/react-native-app-tourreact-native-app-tour 是一款 React Native 原生 App Tour应用引导库它把 Android 的 TapTargetView 和 iOS 的 MaterialShowcase 封装成一套 JS API让聚光灯 气泡文案式的功能引导只需几行代码。本文从 RNAppTour.js 入手拆解findNodeHandle与NativeModules这两个 React Native 桥接核心 API讲清楚 JS 侧的组件引用是如何一路变成原生视图坐标的。 30秒看懂这个库在桥接什么先建立一个整体印象。整个库只有 3 个核心类类职责所在文件AppTourView把 React 组件转成原生视图 ID 属性包RNAppTour.jsAppTourSequence管理多个引导目标增/删/查RNAppTour.jsAppTour最终调起原生 Tour 动画RNAppTour.js它们的分工可以概括为一句话JS 负责指哪原生负责怎么秀。桥接就发生在指哪被翻译成原生视图 ID 的那一刻。 上半场findNodeHandle 把 React 组件变成原生视图 ID注册入口AppTourView.for 的三重保险引导开始前你先用AppTourView.for(view, props)注册目标。这段源码RNAppTour.js做了三件关键事空引用校验view为null/undefined直接抛错避免后续在原生侧查无此视图区分组件类型检查view._reactInternalFiber是否存在——存在说明是 React 组件实例不存在如原生组件则走_nativeTag分支RNAppTour.js强制 key 校验React 组件必须带keyprop否则抛错提示Each tour view should have a key prop。为什么key是必填项因为key会作为属性包props的索引键在多目标序列中原生侧靠它把每个视图 ID 与对应文案对上号。findNodeHandleJS 世界的名牌最后一步只有一行view: findNodeHandle(view)RNAppTour.jsfindNodeHandle是 React Native 提供的 API它返回组件在原生视图树中的数字 ID即_nativeTag。有了这个数字JS 组件引用就变成了一把能在原生世界直接点名的钥匙——后面 Android 和 iOS 都靠它找回真正的View/UIView。 下半场NativeModules 把调用交棒给原生桥的起点一行解构RNAppTour.js 顶部就声明了这条桥const { RNAppTour } NativeModulesNativeModules是 JS 侧访问原生模块的总入口。Android 侧模块名RNAppTour由 RNAppTourModule.java 的getName()返回并通过 RNAppTourPackage.java 注册进 React 实例。于是RNAppTour.ShowSequence(...)/RNAppTour.ShowFor(...)就会跨越桥直达原生方法。Android按 tag 找回视图再量出坐标Android 原生模块的ShowSequenceRNAppTourModule.java流程是activity.runOnUiThread保证操作 UI 在线程上安全用uiManager.addUIBlock拿到NativeViewHierarchyManager循环调用nativeViewHierarchyManager.resolveView(viewId)——这里把findNodeHandle传来的 ID 解析成真正的 AndroidView调用generateTapTargetRNAppTourModule.java用view.getLocationOnScreen()取屏幕坐标、getWidth()/getHeight()取尺寸构造Rect边界再套上TapTarget.forBounds(...)剩余工作交给TapTargetSequence完成动画与顺序控制。注意源码里的try { resolveView } catch { continue }——查不到视图就跳过而不是崩溃这是个对新手友好的容错设计。iOSviewForReactTag 一步到位iOS 侧更直接核心就一行RNAppTour.mUIView *target [self.bridge.uiManager viewForReactTag: view];RCTBridge的uiManager负责用 React tag 反查UIView随后generateMaterialShowcaseRNAppTour.m解析颜色、字号、动画时长等 props交给MaterialShowcase展示。序列则由自定义的MutableOrderedDictionaryRNAppTour.h按插入顺序维护每完成一步在showCaseDidDismiss里弹出队首、递归展示下一个RNAppTour.m。iOS 工程在 Xcode 中的配置界面示例工程 Identity / Signing 页如下 闭环原生事件如何流回 JS桥是双向的。原生 Tour 每前进一步、结束或取消时都会通过DeviceEventManagerModuleAndroid或eventDispatcheriOS发回事件JS 侧用DeviceEventEmitter.addListener监听onShowSequenceStepEvent进入下一步onFinishSequenceEvent序列完成onCancelStepEvent被用户取消示例工程的完整监听写法见 App.js。这样 JS 就能在用户看完引导时更新状态、写入埋点。✅ 快速上手清单安装npm install react-native-app-tour --save需 React Native 61如需离线阅读源码可git clone https://gitcode.com/gh_mirrors/re/react-native-app-tour配置原生依赖Android 在build.gradle添加 jitpack 仓库iOS 在Podfile中引入RNAppTour与MaterialShowcase给组件加key并在ref中调用AppTourView.for(ref, {...})完整写法见 Top.js每个目标必须带orderJS 侧按order排序后再发给原生RNAppTour.js顺序即播放顺序调起单目标用AppTour.ShowFor(target)多目标序列用AppTour.ShowSequence(sequence)参考 App.js 总结回顾这条链路ref→AppTourView.for校验并取key→findNodeHandle得到原生视图 ID →NativeModules.RNAppTour跨桥 → 原生resolveView/viewForReactTag找回真实视图 → 坐标计算 动画库展示 → 事件流回 JS。理解了findNodeHandle把 JS 引用翻译成 ID和NativeModules把调用送进原生这两个枢纽你不仅用好了 react-native-app-tour也掌握了 React Native 中几乎所有JS 操作原生视图类库的通用套路——这在自研桥接模块时同样派得上用场。【免费下载链接】react-native-app-tourReact Native: Native App Tour Library项目地址: https://gitcode.com/gh_mirrors/re/react-native-app-tour创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表