Make sure subscribed-to 'children' reactive values stay alive in ui::component_factory_base

This commit is contained in:
Nikita Lisitsa 2024-08-01 22:24:05 +03:00
parent 9f063218bf
commit 3ac46bc8dc

View file

@ -85,7 +85,7 @@ namespace psemek::ui::impl
impl->release_child_token();
if (typed_value.child)
{
impl->set_child_token(typed_value.child.subscribe([this, impl = impl.get(), &state, &delayed_executor, request_reshape](std::any const & child){
impl->set_child_token(typed_value.child.subscribe([this, impl = impl.get(), &state, &delayed_executor, request_reshape, holder = typed_value.child](std::any const & child){
delayed_executor.post([this, impl, &state, &delayed_executor, request_reshape, child]{
impl->set_child(reconciliate(impl->release_child(), child, state, delayed_executor, request_reshape));
request_reshape();
@ -101,7 +101,7 @@ namespace psemek::ui::impl
{
if (typed_value.children)
{
impl->set_children_token(typed_value.children.subscribe([this, impl = impl.get(), &state, &delayed_executor, request_reshape](std::vector<typename Type::element> const & children_values){
impl->set_children_token(typed_value.children.subscribe([this, impl = impl.get(), &state, &delayed_executor, request_reshape, holder = typed_value.children](std::vector<typename Type::element> const & children_values){
delayed_executor.post([this, impl, &state, &delayed_executor, request_reshape, children_values]{
impl->release_child_tokens();
@ -142,7 +142,7 @@ namespace psemek::ui::impl
{
if (children_values[i].element)
{
child_tokens[i] = children_values[i].element.subscribe([this, impl, &state, &delayed_executor, request_reshape, i](std::any const & value){
child_tokens[i] = children_values[i].element.subscribe([this, impl, &state, &delayed_executor, request_reshape, i, holder = children_values[i].element](std::any const & value){
delayed_executor.post([this, impl, &state, &delayed_executor, request_reshape, i, value]{
auto children = impl->release_children();
children[i] = reconciliate(std::move(children[i]), value, state, delayed_executor, request_reshape);