This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
教程:创建原生视图
编辑页面
一份关于使用 Expo Modules API 创建原生视图并渲染 WebView 的教程。
在本教程中,你将构建一个带有原生视图的示例模块,该视图会渲染一个 WebView。对于 Android,你将使用 WebView 组件;对于 iOS,你将使用 WKWebView。Web 支持可以使用 iframe 来实现,这部分留给你作为练习。
2
3
4
将系统 WebView 作为子视图添加
将带有硬编码 URL 的系统 WebView 作为 ExpoWebView 的子视图添加。ExpoWebView 类继承自 ExpoView,而 ExpoView 继承自 React Native 的 RCTView,并最终在 Android 上继承自 View,在 iOS 上继承自 UIView。
确保 WebView 子视图使用与 ExpoWebView 相同的布局,而 ExpoWebView 的布局由 React Native 的布局引擎计算得出。
Android 视图
在 Android 上,使用 LayoutParams 将 WebView 的布局设置为与 ExpoWebView 的布局匹配。你可以在实例化 WebView 时完成这一步。
iOS 视图
在 iOS 上,将 clipsToBounds 设置为 true,并确保在 layoutSubviews 中 WebView 的 frame 与 ExpoWebView 的 bounds 匹配。init 方法在视图创建时调用,而 layoutSubviews 在布局发生变化时调用。
示例应用
这里不需要做任何更改。使用以下命令重新构建并运行应用:
之后,你会看到渲染出的 Expo Modules API 概览页面。如果更改没有生效,请尝试重新安装应用。
5
添加一个用于设置 URL 的 prop
要在视图上设置 prop,请在 ExpoWebViewModule 中定义 prop 名称和 setter。在这个例子中,为了方便,你可以直接访问 webView 属性。不过在实际场景中,应将逻辑保留在 ExpoWebView 类内部,以尽量减少 ExpoWebViewModule 对其内部实现的了解。
使用 Prop 定义组件 来定义该 prop。在 prop setter 块中,你可以同时访问视图和 prop。指定 URL 的类型为 URL — Expo 模块 API 会将字符串转换为原生 URL 类型。
Android 模块
iOS 模块
TypeScript 模块
接下来,将 url prop 添加到 Props 类型中。
示例应用
最后,在示例应用中向你的 WebView 组件传入一个 URL。
重新构建示例应用:
之后,你会在 WebView 中看到 Expo 主页。
6
添加一个事件来通知页面已加载
视图回调 允许开发者监听组件上的事件。它们通常通过组件上的 props 注册,例如:<Image onLoad={...} />。使用 事件定义组件 为你的 WebView 定义一个事件。将它命名为 onLoad。
Android 视图和模块
在 Android 上,重写 onPageFinished 函数。然后调用你在模块中定义的 onLoad 事件处理器。
在 ExpoWebViewModule 中指明 View 具有一个 onLoad 事件。
iOS 视图和模块
在 iOS 上,实现 webView(_:didFinish:),并让 ExpoWebView 继承 WKNavigationDelegate。然后从该代理方法中调用 onLoad。
在 ExpoWebViewModule 中指明 View 具有一个 onLoad 事件。
TypeScript 模块
事件载荷包含在事件的 nativeEvent 属性中。要从 onLoad 事件中访问 url,请读取 event.nativeEvent.url。
示例应用
更新示例应用,在页面加载完成时显示一个提示框。复制以下代码,然后重新构建并运行你的应用,你就会看到提示框!
7
恭喜!你已经创建了第一个带有 Android 和 iOS 原生视图的 Expo 模块。
下一步
使用 Kotlin 和 Swift 创建原生模块。
一个关于使用 Expo Modules API 创建可持久化设置的原生模块的教程。