@@ -27,8 +27,8 @@ import type { FontMgr } from "../skia/FontMgr/FontMgr";
2727import { debug as hostDebug , skHostConfig } from "./HostConfig" ;
2828// import { debugTree } from "./nodes";
2929import { vec } from "./processors" ;
30- import { createDependencyManager } from "./DependencyManager" ;
3130import { Container } from "./Host" ;
31+ import { DependencyManager } from "./DependencyManager" ;
3232
3333// useContextBridge() is taken from https://github.com/pmndrs/drei#usecontextbridge
3434// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -72,14 +72,11 @@ skiaReconciler.injectIntoDevTools({
7272 rendererPackageName : "react-native-skia" ,
7373} ) ;
7474
75- const render = (
76- element : ReactNode ,
77- container : OpaqueRoot ,
78- update : ( ) => void
79- ) => {
80- skiaReconciler . updateContainer ( element , container , null , ( ) => {
75+ const render = ( element : ReactNode , root : OpaqueRoot , container : Container ) => {
76+ skiaReconciler . updateContainer ( element , root , null , ( ) => {
8177 hostDebug ( "updateContainer" ) ;
82- update ( ) ;
78+
79+ container . depMgr . subscribe ( ) ;
8380 } ) ;
8481} ;
8582
@@ -99,34 +96,35 @@ export const Canvas = forwardRef<SkiaView, CanvasProps>(
9996 const [ tick , setTick ] = useState ( 0 ) ;
10097 const redraw = useCallback ( ( ) => setTick ( ( t ) => t + 1 ) , [ ] ) ;
10198
102- const tree = useMemo ( ( ) => new Container ( redraw ) , [ redraw ] ) ;
99+ const container = useMemo (
100+ ( ) => new Container ( new DependencyManager ( ref ) , redraw ) ,
101+ [ redraw , ref ]
102+ ) ;
103103
104104 const canvasCtx = useRef ( { width : 0 , height : 0 } ) ;
105- const container = useMemo (
106- ( ) => skiaReconciler . createContainer ( tree , 0 , false , null ) ,
107- [ tree ]
105+ const root = useMemo (
106+ ( ) => skiaReconciler . createContainer ( container , 0 , false , null ) ,
107+ [ container ]
108108 ) ;
109109 // Render effect
110110 useEffect ( ( ) => {
111111 render (
112112 < CanvasContext . Provider value = { canvasCtx . current } >
113113 { children }
114114 </ CanvasContext . Provider > ,
115- container ,
116- redraw
115+ root ,
116+ container
117117 ) ;
118- } , [ children , container , redraw ] ) ;
119-
120- const depsManager = useMemo ( ( ) => createDependencyManager ( ref ) , [ ref ] ) ;
118+ } , [ children , root , redraw , container ] ) ;
121119
122120 // Draw callback
123121 const onDraw = useDrawCallback (
124122 ( canvas , info ) => {
125123 // TODO: if tree is empty (count === 1) maybe we should not render?
126124 const { width, height, timestamp } = info ;
127- canvasCtx . current . width = width ;
128- canvasCtx . current . height = height ;
129- onTouch && onTouch ( info . touches ) ;
125+ if ( onTouch ) {
126+ onTouch ( info . touches ) ;
127+ }
130128 const paint = Skia . Paint ( ) ;
131129 paint . setAntiAlias ( true ) ;
132130 const ctx = {
@@ -140,21 +138,17 @@ export const Canvas = forwardRef<SkiaView, CanvasProps>(
140138 center : vec ( width / 2 , height / 2 ) ,
141139 fontMgr : fontMgr ?? Skia . FontMgr . RefDefault ( ) ,
142140 } ;
143- tree . draw ( ctx ) ;
141+ canvasCtx . current = ctx ;
142+ container . draw ( ctx ) ;
144143 } ,
145144 [ tick , onTouch ]
146145 ) ;
147146
148- // Handle value dependency registration of values to the underlying
149- // SkiaView. Every time the tree changes (children), we will visit all
150- // our children and register their dependencies.
151147 useEffect ( ( ) => {
152- // Register all values in the current tree
153- depsManager . visitChildren ( tree ) ;
154- // Subscribe / return unsubscribe function
155- depsManager . subscribe ( ) ;
156- return depsManager . unsubscribe ;
157- } , [ depsManager , tree , children ] ) ;
148+ return ( ) => {
149+ container . depMgr . unsubscribe ( ) ;
150+ } ;
151+ } , [ container ] ) ;
158152
159153 return (
160154 < SkiaView
0 commit comments