@@ -7,13 +7,13 @@ import {
77 Switch ,
88} from 'react-native' ;
99import { useEffect , useMemo , useState } from 'react' ;
10+ import { useQuery } from '@tanstack/react-query' ;
1011import Animated , {
11- runOnUI ,
1212 useSharedValue ,
1313 useAnimatedStyle ,
1414 type SharedValue ,
1515} from 'react-native-reanimated' ;
16- import { NitroModules } from 'react-native-nitro-modules ' ;
16+ import { scheduleOnUI } from 'react-native-worklets ' ;
1717import {
1818 Fit ,
1919 RiveView ,
@@ -29,7 +29,7 @@ declare global {
2929 var __callMicrotasks : ( ) => void ;
3030}
3131
32- installWorkletDispatcher ( runOnUI ) ;
32+ installWorkletDispatcher ( scheduleOnUI ) ;
3333
3434function useRiveNumberListener (
3535 property : ViewModelNumberProperty | undefined ,
@@ -40,18 +40,16 @@ function useRiveNumberListener(
4040 if ( ! property ) return ;
4141
4242 if ( useUIThread ) {
43- const boxedProperty = NitroModules . box ( property ) ;
4443 const sv = sharedValue ;
4544
46- runOnUI ( ( ) => {
45+ scheduleOnUI ( ( ) => {
4746 'worklet' ;
48- const prop = boxedProperty . unbox ( ) ;
49- prop . addListener ( ( value : number ) => {
47+ property . addListener ( ( value : number ) => {
5048 'worklet' ;
5149 sv . value = value ;
5250 global . __callMicrotasks ( ) ;
5351 } ) ;
54- } ) ( ) ;
52+ } ) ;
5553
5654 return ( ) => {
5755 property . removeListeners ( ) ;
@@ -78,32 +76,40 @@ export default function RiveToReactNativeExample() {
7876 ) : riveFile ? (
7977 < WithViewModelSetup file = { riveFile } />
8078 ) : (
81- < Text style = { styles . errorText } > { error ?. message || 'Unexpected error' } </ Text >
79+ < Text style = { styles . errorText } >
80+ { error ?. message || 'Unexpected error' }
81+ </ Text >
8282 ) }
8383 </ View >
8484 ) ;
8585}
8686
8787function WithViewModelSetup ( { file } : { file : RiveFile } ) {
88- const viewModel = useMemo ( ( ) => file . defaultArtboardViewModel ( ) , [ file ] ) ;
89- const instance = useMemo (
90- ( ) => viewModel ?. createDefaultInstance ( ) ,
91- [ viewModel ]
92- ) ;
9388 const [ useUIThread , setUseUIThread ] = useState ( true ) ;
9489
95- if ( ! instance || ! viewModel ) {
90+ const { data : instance , error } = useQuery ( {
91+ queryKey : [ 'bouncing-ball-instance' , file ] ,
92+ queryFn : async ( ) => {
93+ const vm = await file . defaultArtboardViewModelAsync ( ) ;
94+ if ( ! vm ) throw new Error ( 'No view model found.' ) ;
95+ const inst = await vm . createDefaultInstanceAsync ( ) ;
96+ if ( ! inst ) throw new Error ( 'Failed to create view model instance' ) ;
97+ return inst ;
98+ } ,
99+ } ) ;
100+
101+ if ( error ) {
96102 return (
97103 < View style = { styles . errorContainer } >
98- < Text style = { styles . errorText } >
99- { ! viewModel
100- ? 'No view model found.'
101- : 'Failed to create view model instance' }
102- </ Text >
104+ < Text style = { styles . errorText } > { error . message } </ Text >
103105 </ View >
104106 ) ;
105107 }
106108
109+ if ( ! instance ) {
110+ return < ActivityIndicator size = "large" color = "#0000ff" /> ;
111+ }
112+
107113 return (
108114 < BouncingBallTracker
109115 instance = { instance }
0 commit comments