Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor to ComposeLifecycleOwner for Better Lifecycle Synchronization #1234

Merged
merged 3 commits into from
Nov 21, 2024

Conversation

ekeitho
Copy link
Contributor

@ekeitho ekeitho commented Nov 19, 2024

Refactor our creation of LifecycleOwner in compose to use ComposeLifecycleOwner for better lifecycle management & readability.

Extracted anonymous LifecycleOwner & introduced RememberObserver implementation into a reusable ComposeLifecycleOwner class. This now synchronizes its lifecycle with the parent Lifecycle & immediately synchornizes on creation of ComposeLifecycleOwner instead of where before we were synchronized to the parent AFTER COMPOSITION.

@ekeitho ekeitho force-pushed the kabdulla/compose-lifecycle-owner branch from 0798a0e to 7a8ac55 Compare November 19, 2024 21:22
@ekeitho ekeitho marked this pull request as ready for review November 19, 2024 21:22
@ekeitho ekeitho requested review from a team as code owners November 19, 2024 21:22
// If we're leaving the composition, ensure the lifecycle is cleaned up
if (registry.currentState != Lifecycle.State.INITIALIZED) {
registry.currentState = Lifecycle.State.DESTROYED
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One behavior change this introduces that we might not want is that it will destroy the child lifecycle before sending a new one, if the parent lifecycle instance changes. I don't think the parent instance should ever change though, unless movableContentOf is used or something, so it's probably not gonna be an issue immediately.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting, i guess that means we can just not key off parent lifecycle on the remember call

Copy link
Contributor Author

@ekeitho ekeitho Nov 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made the update to ensure this behavior didn't change since i'd hope it would work with movableContentOf & wrote a test for it too

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm guessing you didn't push that yet? It doesn't look changed to me. This should push this code to be even more similar to the View one.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah i removed parentLifecycle from the remember key. check out: https://github.com/square/workflow-kotlin/pull/1234/files#diff-be84e80fcb3d58b96b21bf4311c0bcdc15c6f2d0d90b6628ce1f220bd012301eR76

it will retain the same instance of LifecycleOwner regardless of parent lifecycle changing.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, that's also incorrect because if the parent changes then we'll be syncing to the wrong one. You need to add some code so the remember function can update the parentLifecycle on this new class, and make sure we remove/add observers correctly when that happens (without necessarily destroying the child).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think i got what you mean now: 953e2ab

@zach-klippenstein
Copy link
Collaborator

Even if we can't figure out how to test the original bug, we could at least have a test that ensures the a child composable sees the correct lifecycle state immediately.

@zach-klippenstein
Copy link
Collaborator

Also congrats on PR 1234! 😆

@ekeitho ekeitho force-pushed the kabdulla/compose-lifecycle-owner branch 6 times, most recently from 0202cb2 to c9d1399 Compare November 20, 2024 00:39
… management

- Extracted anonymous LifecycleOwner and RememberObserver implementation into a reusable ComposeLifecycleOwner class.
- ComposeLifecycleOwner synchronizes its lifecycle with the parent Lifecycle and integrates with Compose's memory model via RememberObserver.
- Improves code readability, reusability, and aligns lifecycle management with Compose best practices.
@ekeitho ekeitho force-pushed the kabdulla/compose-lifecycle-owner branch from c9d1399 to bf97796 Compare November 20, 2024 00:41
Copy link
Contributor

@rjrjr rjrjr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:shipit:

@ekeitho ekeitho force-pushed the kabdulla/compose-lifecycle-owner branch from 5a0aa6f to 953e2ab Compare November 20, 2024 21:36
@ekeitho ekeitho force-pushed the kabdulla/compose-lifecycle-owner branch from 3ca095b to 0b62bcc Compare November 20, 2024 21:40
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@ekeitho ekeitho enabled auto-merge November 21, 2024 20:07
@ekeitho ekeitho disabled auto-merge November 21, 2024 20:08
@rjrjr rjrjr merged commit 5550805 into main Nov 21, 2024
30 checks passed
@rjrjr rjrjr deleted the kabdulla/compose-lifecycle-owner branch November 21, 2024 20:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants