-
Notifications
You must be signed in to change notification settings - Fork 102
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refactor LifecycleOwner to ComposeLifecycleOwner for better lifecycle…
… 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.
- Loading branch information
Showing
2 changed files
with
77 additions
and
33 deletions.
There are no files selected for viewing
75 changes: 75 additions & 0 deletions
75
workflow-ui/compose/src/main/java/com/squareup/workflow1/ui/compose/ComposeLifecycleOwner.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
package com.squareup.workflow1.ui.compose | ||
|
||
import androidx.compose.runtime.RememberObserver | ||
import androidx.lifecycle.Lifecycle | ||
import androidx.lifecycle.LifecycleEventObserver | ||
import androidx.lifecycle.LifecycleOwner | ||
import androidx.lifecycle.LifecycleRegistry | ||
|
||
/** | ||
* A custom [LifecycleOwner] that synchronizes its lifecycle with a parent [Lifecycle] and | ||
* integrates with Jetpack Compose's lifecycle through [RememberObserver]. | ||
* | ||
* **Purpose:** | ||
* | ||
* - Ensures that any lifecycle-aware components within a composable function have a lifecycle that | ||
* accurately reflects both the parent lifecycle and the composable's own lifecycle. | ||
* - Manages lifecycle transitions and observer registration/removal to prevent memory leaks and | ||
* ensure proper cleanup when the composable leaves the composition. | ||
* | ||
* **Key Features:** | ||
* | ||
* - **Lifecycle Synchronization:** Mirrors lifecycle events from the provided `parentLifecycle` to | ||
* its own [LifecycleRegistry], ensuring consistent state transitions. | ||
* - **Compose Integration:** Implements [RememberObserver] to align with the composable's lifecycle | ||
* in the Compose memory model. | ||
* - **Automatic Observer Management:** Adds and removes a [LifecycleEventObserver] to the parent | ||
* lifecycle, preventing leaks and ensuring proper disposal. | ||
* - **State Transition Safety:** Carefully manages lifecycle state changes to avoid illegal | ||
* transitions, especially during destruction. | ||
* | ||
* **Usage Notes:** | ||
* | ||
* - Should be used in conjunction with `remember` and provided the `parentLifecycle` as a key to | ||
* ensure it updates correctly when the parent lifecycle changes. | ||
* - By integrating with Compose's lifecycle, it ensures that resources are properly released when | ||
* the composable leaves the composition. | ||
* | ||
* @param parentLifecycle The parent [Lifecycle] with which this lifecycle owner should synchronize. | ||
*/ | ||
internal class ComposeLifecycleOwner( | ||
private val parentLifecycle: Lifecycle | ||
) : LifecycleOwner, RememberObserver { | ||
|
||
private val registry = LifecycleRegistry(this) | ||
override val lifecycle: Lifecycle | ||
get() = registry | ||
|
||
private val parentObserver = LifecycleEventObserver { _, event -> | ||
// Any time the parent lifecycle changes state, perform the same change on our lifecycle. | ||
registry.handleLifecycleEvent(event) | ||
} | ||
|
||
init { | ||
// We do this right away to ensure that the parent lifecycle is observed as soon as possible | ||
// to prevent any inconsistencies. | ||
parentLifecycle.addObserver(parentObserver) | ||
} | ||
|
||
override fun onRemembered() { | ||
|
||
} | ||
|
||
override fun onAbandoned() { | ||
onForgotten() | ||
} | ||
|
||
override fun onForgotten() { | ||
parentLifecycle.removeObserver(parentObserver) | ||
|
||
// If we're leaving the composition, ensure the lifecycle is cleaned up | ||
if (registry.currentState != Lifecycle.State.INITIALIZED) { | ||
registry.currentState = Lifecycle.State.DESTROYED | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters