♻️ (core): Evita doble clonado de InRegion en Child

Los prototipos registrados con `InRegion` se clonaban dos veces por
petición: una al ensamblar la región (`ComponentGlobal::as_child`) y
otra al renderizar (`Child::render`). Ahora sólo se clonan al
renderizar.
This commit is contained in:
Manuel Cillero 2026-07-26 12:39:01 +02:00
parent ce6b4d2581
commit 845d91d8c1
2 changed files with 33 additions and 40 deletions

View file

@ -32,6 +32,13 @@ impl Child {
Child(Some(Arc::new(component)))
}
// Envuelve un `Arc` ya construido, sin clonar el componente. La usa `core::theme::regions` para
// registrar los prototipos de `InRegion` sin clonar su estado hasta que `render()` obtenga la
// copia propia que necesita mutar.
pub(crate) fn from_arc(component: Arc<dyn Component>) -> Self {
Child(Some(component))
}
// **< Child BUILDER >**************************************************************************
/// Establece un componente nuevo, o lo vacía.
@ -73,7 +80,7 @@ impl Child {
}
}
impl<C: Component + 'static> From<Embed<C>> for Child {
impl<C: Component> From<Embed<C>> for Child {
/// Convierte un [`Embed<C>`] en un [`Child`], consumiendo el componente tipado.
///
/// Útil cuando se tiene un [`Embed`] para añadir a una lista [`Children`]:
@ -93,7 +100,7 @@ impl<C: Component + 'static> From<Embed<C>> for Child {
}
}
impl<T: Component + 'static> From<T> for Child {
impl<T: Component> From<T> for Child {
/// Convierte cualquier componente en un [`Child`], equivalente a [`Child::with()`].
#[inline]
fn from(component: T) -> Self {
@ -101,7 +108,7 @@ impl<T: Component + 'static> From<T> for Child {
}
}
impl<T: Component + 'static> From<T> for ChildOp {
impl<T: Component> From<T> for ChildOp {
/// Convierte un componente en [`ChildOp::Add`], permitiendo pasar componentes directamente a
/// métodos como [`Children::with_child`] sin envolverlos explícitamente.
#[inline]