fix: defer owner drop in OwnedView (closes #4769) (#4771)

This commit is contained in:
Greg Johnston
2026-06-10 21:51:58 -04:00
committed by GitHub
parent f558dfa93c
commit 2d88555f50

View File

@@ -6,6 +6,7 @@ use crate::{
view::{add_attr::AddAnyAttr, Position, PositionState, Render, RenderHtml},
};
use reactive_graph::{computed::ScopedFuture, owner::Owner};
use std::mem;
/// A view wrapper that sets the reactive [`Owner`] to a particular owner whenever it is rendered.
#[derive(Debug, Clone)]
@@ -65,7 +66,13 @@ where
fn rebuild(self, state: &mut Self::State) {
let OwnedView { owner, view, .. } = self;
owner.with(|| view.rebuild(&mut state.state));
state.owner = owner;
// Defer dropping the previous owner until after effects have run:
// render effects that do things like reading from context it provides
// may have already been triggered and queued to run. `spawn_local` will
// defer the drop to the end of the queue, while still deterministically
// cleaning up the memory to prevent leaks.
let old_owner = mem::replace(&mut state.owner, owner);
reactive_graph::spawn_local(async move { drop(old_owner) });
}
}