React Native
React Native
Rive 的 React Native 运行时。
请注意,某些 Rive 功能可能尚未在特定运行时中受支持,或者可能需要使用 Rive 渲染器。有关更多详细信息,请参阅 功能支持 和 选择渲染器 页面。
🚀 新的 Rive React Native 运行时现已推出! 基于 Nitro 构建,性能更佳,React Native 集成更好。现在开始:
迁移时间表:
我们正在积极收集反馈以改进新运行时。请分享你的想法并报告你遇到的任何问题。
概览
本指南记录了如何开始使用 Rive React Native 运行时。新运行时的源代码可在其 GitHub 仓库 中找到。
- 新运行时(推荐)
- 旧版运行时
要求
- React Native: 0.78 或更高版本(推荐 0.79+ 以改善 Android 错误消息)
- Expo SDK: 53 或更高版本(适用于 Expo 用户)
- iOS: 15.1 或更高版本
- Android: SDK 24 (Android 7.0) 或更高版本
- Xcode: 16.4 或更高版本
- JDK: 17 或更高版本
- Nitro Modules: 0.25.2 或更高版本
快速开始
按照这些快速入门步骤熟悉 Rive React Native 运行时。
[## Rive 文件
改编/下载本快速入门指南中使用的 Rive 文件[## 完整示例
查看完整的快速入门示例](https://github.com/rive-app/rive-nitro-react-native/blob/main/example/src/pages/QuickStart.tsx)
安装依赖
bashnpm install @rive-app/react-native react-native-nitro-modules # or for Yarn yarn add @rive-app/react-native react-native-nitro-modulesreact-native-nitro-modules是必需的,因为此库依赖于 Nitro Modules。设置
导入必要的组件并为后续步骤定义样式。
导入
javascriptimport { RiveView, useRive, useRiveFile, useRiveNumber, useRiveTrigger, useViewModelInstance, Fit, } from '@rive-app/react-native';样式
javascriptconst styles = StyleSheet.create({ container: { flex: 1, alignItems: 'center', justifyContent: 'center', }, rive: { width: '100%', height: 400, }, });Rive 文件和组件
RiveView组件显示 Rive 图形。它需要一个 prop:file,即一个RiveFile对象。使用useRiveFileHook 加载 riv 文件并创建RiveFile对象。此对象可以被缓存并在多个组件中复用。加载文件
javascriptexport default function QuickStart() { const { riveFile } = useRiveFile( require('path/to/quick_start.riv') ); return ( <View style={styles.container}> {riveFile && <RiveView file={riveFile} style={styles.rive} />} </View> ); }延伸阅读:
[## Props
RiveView 可用的 view props[## 加载 Rive 文件
如何在你的应用中加载 Rive 文件[## 缓存 Rive 文件
布局
配置图形如何适应其容器。对于此示例,我们将
fit设置为Layout,这会自动调整画板大小以匹配视图大小。这对于使用 布局 (Layouts) 构建的响应式 Rive 图形非常理想。布局
javascript<RiveView file={riveFile} style={styles.rive} fit={Fit.Layout} />延伸阅读:
[## 运行时布局
视图引用 (View Reference)
使用
useRive()Hook 访问 Rive 视图引用以进行编程控制。useRive Hook
javascriptexport default function QuickStart() { const { riveFile } = useRiveFile( require('path/to/quick_start.riv') ); const { riveViewRef, setHybridRef } = useRive(); return ( <View style={styles.container}> {riveFile && ( <RiveView hybridRef={setHybridRef} file={riveFile} fit={Fit.Layout} style={styles.rive} /> )} </View> ); }延伸阅读:
[## 视图方法
查看所有可用的视图引用方法。[## Hybrid Views
阅读更多关于 Nitro Hybrid Views 的信息。](https://nitro.margelo.com/docs/hybrid-views)
数据绑定
使用
useViewModelInstanceHook 手动创建视图模型实例并将其传递给视图。这种方法允许你在视图加载之前的onInit回调中设置初始属性值,并解耦ViewModelInstance与RiveView。手动创建视图模型实例
javascriptexport default function QuickStart() { const { riveFile } = useRiveFile( require('path/to/quick_start.riv') ); const { riveViewRef, setHybridRef } = useRive(); const viewModelInstance = useViewModelInstance(riveFile, { onInit: (vmi) => (vmi.numberProperty('health')!.value = 20), }); return ( <View style={styles.container}> {riveFile && viewModelInstance && ( <RiveView hybridRef={setHybridRef} file={riveFile} fit={Fit.Layout} style={styles.rive} dataBind={viewModelInstance} /> )} </View> ); }使用视图模型属性 Hooks 更新和监听属性更改。
属性 Hooks
javascriptexport default function QuickStart() { const { riveFile } = useRiveFile( require('path/to/quick_start.riv') ); const { riveViewRef, setHybridRef } = useRive(); const viewModelInstance = useViewModelInstance(riveFile, { onInit: (vmi) => (vmi.numberProperty('health')!.value = 20), }); const { value: health, setValue: setHealth } = useRiveNumber( 'health', viewModelInstance ); console.log('health', health); const { trigger: gameOverTrigger } = useRiveTrigger( 'gameOver', viewModelInstance, { onTrigger: () => console.log('Game Over Triggered') } ); const handleTakeDamage = () => { setHealth((h) => (h ?? 0) - 7); riveViewRef!.playIfNeeded(); }; const handleMaxHealth = () => { setHealth(100); riveViewRef!.playIfNeeded(); }; const handleGameOver = () => { setHealth(0); gameOverTrigger(); riveViewRef!.playIfNeeded(); }; return ( <View style={styles.container}> {riveFile && viewModelInstance && ( <RiveView hybridRef={setHybridRef} file={riveFile} fit={Fit.Layout} style={styles.rive} dataBind={viewModelInstance} /> )} <Button onPress={handleTakeDamage} title="Take Damage" /> <Button onPress={handleMaxHealth} title="Max Health" /> <Button onPress={handleGameOver} title="Game Over" /> </View> ); }我们调用
playIfNeeded强制状态机播放。在某些情况下,如果图形中没有活动的时间轴,状态机可能会停止。这是一个临时的解决方法。将来,这将自动发生。延伸阅读:
[## 数据绑定
查看我们的 [示例应用](https://github.com/rive-app/rive-nitro-react-native/tree/main/example) 获取更多使用示例。
关键组件 (Key Components)
RiveView
用于渲染 Rive 内容的组件:
<RiveView
file={riveFile}
/> useRiveFile
用于从 URL 或本地源加载 Rive 文件的 Hook:
const { riveFile } = useRiveFile({
url: 'https://cdn.rive.app/animations/vehicles.riv',
// or
// source: require('./assets/graphic.riv'),
});查看 加载 Rive 文件 和 缓存 Rive 文件 获取更多信息。
useRive
用于访问 Rive 视图引用以进行编程控制的 Hook:
const { riveViewRef, setHybridRef } = useRive();
<RiveView
hybridRef={setHybridRef}
file={riveFile}
/>这是一个 Nitro Hybrid View。查看可用的 视图引用方法。
useViewModelInstance
用于从 RiveFile、ViewModel 或 RiveViewRef 创建视图模型实例的 Hook:
// Get default instance from RiveFile (recommended)
// 从 RiveFile 获取默认实例(推荐)
const instance = useViewModelInstance(riveFile);
// or
// Get named instance from a ViewModel
// 从 ViewModel 获取命名实例
const namedInstance = useViewModelInstance(viewModel, { name: 'My Instance' });
// or
// Create a new blank instance from a ViewModel
// 从 ViewModel 创建新的空白实例
const newInstance = useViewModelInstance(viewModel, { useNew: true });
// or
// With required: true (throws if null, use with Error Boundary)
// 使用 required: true(如果为 null 则抛出错误,与错误边界一起使用)
const instance = useViewModelInstance(riveFile, { required: true });
// or
// With onInit to set initial values synchronously
// 使用 onInit 同步设置初始值
const instance = useViewModelInstance(riveFile, {
onInit: (vmi) => {
vmi.numberProperty('count')?.set(10);
vmi.stringProperty('name')?.set('Initial Name');
}
});在 RiveView 中传递 dataBind prop。
return (
<RiveView
file={riveFile}
dataBind={instance}
/>
);你也可以从 RiveViewRef 获取自动绑定的实例:
import { useRive, useViewModelInstance } from '@rive-app/react-native';
const { riveViewRef, setHybridRef } = useRive();
const instance = useViewModelInstance(riveViewRef);查看 运行时数据绑定文档 获取更多信息。
资源
旧版运行时仍然受支持,但我们建议迁移到新运行时以获得更好的性能和功能。
本指南记录了如何开始使用旧版 React Native 运行时库。源代码可在其 GitHub 仓库 中找到。此库包含一个 API,供 React Native 应用轻松集成 Rive 资产。最低 iOS 目标版本为 14.0。
请参阅 我们的文档 以将 Rive 添加到 Expo 应用中。
快速开始 (旧版)
按照以下步骤快速在你的 React Native 应用中集成 Rive。
安装依赖
bashnpm install rive-react-native # or for Yarn yarn add rive-react-nativeiOS - Pod Install
cd进入ios文件夹并运行pod install(如果部署到 iOS)。如果你在这里遇到问题,你可能需要将
ios部署版本目标至少,提高到14.0。你可以在ios/文件夹的Podfile中找到此版本。Android - 设置 Kotlin 依赖解析
此步骤可能是可选的 - 但是,如果 React Native 项目中的 Android 设置没有设置 Kotlin
v1.8.0+,你在构建项目时可能会遇到重复类问题。为了缓解这些问题,正如 Kotlin 文档 所建议的那样,将以下内容添加到应用程序build.gradle文件的dependencies中以处理版本对齐:gradledependencies { implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.0') ... }添加 Rive 组件
javascriptimport Rive from 'rive-react-native'; function App() { return <Rive url="https://public.rive.app/community/runtime-files/2195-4346-avatar-pack-use-case.riv" artboardName="Avatar 1" stateMachineName="avatar" style={{width: 400, height: 400}} />; }