@@ -3,61 +3,66 @@ import { useState, useEffect } from 'react';
33import {
44 Fit ,
55 RiveView ,
6- RiveFileFactory ,
76 useRive ,
87 useRiveNumber ,
9- type RiveFile ,
108 type ViewModelInstance ,
119 useRiveString ,
1210 useRiveColor ,
1311 useRiveTrigger ,
12+ useRiveFile ,
1413} from 'react-native-rive' ;
1514
1615export default function DataBindingExample ( ) {
1716 const { riveViewRef, setHybridRef } = useRive ( ) ;
18- const [ riveFile , setRiveFile ] = useState < RiveFile | null > ( null ) ;
1917 const [ viewModelInstance , setViewModelInstance ] =
2018 useState < ViewModelInstance | null > ( null ) ;
21- const [ isLoading , setIsLoading ] = useState ( true ) ;
22- const [ error , setError ] = useState < string | null > ( null ) ;
19+ const [ viewModelError , setViewModelError ] = useState < string | null > ( null ) ;
2320
24- // Load Rive file immediately
21+ const { riveFile, isLoading, error } = useRiveFile (
22+ require ( '../../assets/rive/rewards_source.riv' )
23+ ) ;
24+
25+ // Create view model instance when Rive file is loaded
2526 useEffect ( ( ) => {
26- const initializeRiveFileAndData = async ( ) => {
27+ if ( riveFile ) {
2728 try {
28- const file = await RiveFileFactory . fromSource (
29- require ( '../../assets/rive/rewards_source.riv' )
30- ) ;
31- setRiveFile ( file ) ;
32- const viewModel = file . defaultArtboardViewModel ( ) ;
33- setViewModelInstance ( viewModel ?. createDefaultInstance ( ) ?? null ) ;
34- setIsLoading ( false ) ;
35- setError ( null ) ;
29+ const viewModel = riveFile . defaultArtboardViewModel ( ) ;
30+ if ( ! viewModel ) {
31+ throw new Error ( 'No default artboard view model found' ) ;
32+ }
33+ const instance = viewModel . createDefaultInstance ( ) ;
34+ if ( ! instance ) {
35+ throw new Error ( 'Failed to create view model instance' ) ;
36+ }
37+ setViewModelInstance ( instance ) ;
38+ setViewModelError ( null ) ;
3639 } catch ( err ) {
37- setError (
38- err instanceof Error ? err . message : 'Failed to load Rive file'
40+ setViewModelError (
41+ err instanceof Error
42+ ? err . message
43+ : 'Failed to create view model instance'
3944 ) ;
40- setIsLoading ( false ) ;
45+ setViewModelInstance ( null ) ;
4146 }
42- } ;
43-
44- initializeRiveFileAndData ( ) ;
45- } , [ ] ) ;
47+ }
48+ } , [ riveFile ] ) ;
4649
47- // Release the Rive file when the component unmounts
50+ // Cleanup view model instance when component unmounts or the view model instance changes
4851 useEffect ( ( ) => {
4952 return ( ) => {
50- if ( riveFile ) {
51- riveFile . release ( ) ; // IMPORTANT: This ensures that the native resources are deleted
52- }
53+ viewModelInstance ?. dispose ( ) ;
5354 } ;
54- } , [ riveFile ] ) ;
55+ } , [ viewModelInstance ] ) ;
5556
5657 // Bind the view model instance to the RiveView
5758 useEffect ( ( ) => {
5859 if ( viewModelInstance && riveViewRef ) {
59- console . log ( 'Binding the instance' ) ;
60- riveViewRef ?. bindViewModelInstance ( viewModelInstance ) ;
60+ try {
61+ console . log ( 'Binding the instance' ) ;
62+ riveViewRef . bindViewModelInstance ( viewModelInstance ) ;
63+ } catch ( err ) {
64+ console . error ( 'Failed to bind view model instance:' , err ) ;
65+ }
6166 }
6267 } , [ viewModelInstance , riveViewRef ] ) ;
6368
@@ -67,7 +72,9 @@ export default function DataBindingExample() {
6772 viewModelInstance
6873 ) ;
6974 useEffect ( ( ) => {
70- console . log ( 'coinValue' , coinValue ) ;
75+ if ( coinValue !== undefined ) {
76+ console . log ( 'coinValue' , coinValue ) ;
77+ }
7178 } , [ coinValue ] ) ;
7279
7380 if ( coinValueError ) {
@@ -118,17 +125,20 @@ export default function DataBindingExample() {
118125 // Set the initial values of the properties
119126 useEffect ( ( ) => {
120127 if ( viewModelInstance ) {
121- setButtonText ( "Let's go!" ) ;
122- setBarColor ( '#0000FF' ) ;
123- // setBarColor({ r: 0, g: 255, b: 0, a: 255 });
128+ try {
129+ setButtonText ( "Let's go!" ) ;
130+ setBarColor ( '#0000FF' ) ;
131+ } catch ( err ) {
132+ console . error ( 'Failed to set initial values:' , err ) ;
133+ }
124134 }
125135 } , [ setBarColor , setButtonText , viewModelInstance ] ) ;
126136
127137 return (
128138 < View style = { styles . container } >
129139 < View style = { styles . riveContainer } >
130- { error ? (
131- < Text style = { styles . errorText } > { error } </ Text >
140+ { error || viewModelError ? (
141+ < Text style = { styles . errorText } > { error || viewModelError } </ Text >
132142 ) : isLoading ? (
133143 < ActivityIndicator size = "large" color = "#0000ff" />
134144 ) : (
0 commit comments