diff --git a/example/package.json b/example/package.json
index 5139471f..feb073a4 100644
--- a/example/package.json
+++ b/example/package.json
@@ -18,6 +18,7 @@
"@react-native-picker/picker": "^2.11.4",
"@react-navigation/native": "^7.1.9",
"@react-navigation/stack": "^7.3.2",
+ "@tanstack/react-query": "^5.100.10",
"react": "19.0.0",
"react-native": "0.79.2",
"react-native-gesture-handler": "2.29.1",
diff --git a/example/src/App.tsx b/example/src/App.tsx
index 0d193a0a..91e0b9eb 100644
--- a/example/src/App.tsx
+++ b/example/src/App.tsx
@@ -11,6 +11,7 @@ import {
import { NavigationContainer, useNavigation } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import AsyncStorage from '@react-native-async-storage/async-storage';
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { PagesList, type PageItem } from './PagesList';
import { HomeMenu } from './shared/HomeMenu';
@@ -95,38 +96,42 @@ function HomeScreen({ navigation }: { navigation: any }) {
);
}
+const queryClient = new QueryClient();
+
export default function App() {
return (
-
-
-
+
+
- {PagesList.map(({ id, component, name }) => (
+ >
- ))}
-
-
+ {PagesList.map(({ id, component, name }) => (
+
+ ))}
+
+
+
);
}
diff --git a/example/src/exercisers/RiveToReactNativeExample.tsx b/example/src/exercisers/RiveToReactNativeExample.tsx
index 54b9ece6..d583c90a 100644
--- a/example/src/exercisers/RiveToReactNativeExample.tsx
+++ b/example/src/exercisers/RiveToReactNativeExample.tsx
@@ -7,6 +7,7 @@ import {
Switch,
} from 'react-native';
import { useEffect, useMemo, useState } from 'react';
+import { useQuery } from '@tanstack/react-query';
import Animated, {
runOnUI,
useSharedValue,
@@ -89,27 +90,31 @@ export default function RiveToReactNativeExample() {
}
function WithViewModelSetup({ file }: { file: RiveFile }) {
- // eslint-disable-next-line @typescript-eslint/no-deprecated -- replaced with async API in next PR
- const viewModel = useMemo(() => file.defaultArtboardViewModel(), [file]);
- const instance = useMemo(
- // eslint-disable-next-line @typescript-eslint/no-deprecated
- () => viewModel?.createDefaultInstance(),
- [viewModel]
- );
const [useUIThread, setUseUIThread] = useState(true);
- if (!instance || !viewModel) {
+ const { data: instance, error } = useQuery({
+ queryKey: ['bouncing-ball-instance', file],
+ queryFn: async () => {
+ const vm = await file.defaultArtboardViewModelAsync();
+ if (!vm) throw new Error('No view model found.');
+ const inst = await vm.createDefaultInstanceAsync();
+ if (!inst) throw new Error('Failed to create view model instance');
+ return inst;
+ },
+ });
+
+ if (error) {
return (
-
- {!viewModel
- ? 'No view model found.'
- : 'Failed to create view model instance'}
-
+ {error.message}
);
}
+ if (!instance) {
+ return ;
+ }
+
return (