Skip to content

Commit

Permalink
Promote @Composable retain to stable
Browse files Browse the repository at this point in the history
  • Loading branch information
marcellogalhardo committed Dec 30, 2022
1 parent 1dcc993 commit def9e85
Show file tree
Hide file tree
Showing 10 changed files with 20 additions and 22 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ fun SampleView() {

// Using an Activity delegates (stable)
val activity: ComponentActivity // find Activity
val viewModel by activity.retain { ViewModel() }
val viewModel by retain(activity) { ViewModel() }

// Using a Fragment delegates (stable)
val fragment: Fragment // find Fragment
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public inline fun <reified T : Any> retainInActivity(
noinline instantiate: (RetainedEntry) -> T,
): Retained<T> = retain(
key = key,
findViewModelStoreOwner = findActivity,
findOwner = findActivity,
instantiate = instantiate,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,25 +27,23 @@ import dev.marcellogalhardo.retained.core.retain
* @see retain
*/
@OptIn(InternalRetainedApi::class)
@ExperimentalRetainedApi
@Composable
public inline fun <reified T : Any> retain(
viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
owner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
},
key: String = T::class.java.name,
noinline instantiate: (RetainedEntry) -> T,
): T = remember(key1 = key) {
retain(
key = key,
findViewModelStoreOwner = { viewModelStoreOwner },
findOwner = { owner },
instantiate = instantiate,
).value
}

/**
* Returns a [Lazy] delegate to access a retained object by **default** scoped to this
* [ComponentActivity]:
* Returns an existing retained instance of [T] scoped to this [ComponentActivity]:
*
* ```
* @Composable
Expand All @@ -60,13 +58,13 @@ public inline fun <reified T : Any> retain(
@ExperimentalRetainedApi
@Composable
public inline fun <reified T : Any> retainInActivity(
viewModelStoreOwner: ViewModelStoreOwner?,
owner: ViewModelStoreOwner?,
key: String = T::class.java.name,
noinline instantiate: (RetainedEntry) -> T,
): T = retain(
key = key,
viewModelStoreOwner = if (viewModelStoreOwner != null) {
viewModelStoreOwner
owner = if (owner != null) {
owner
} else {
val context = LocalContext.current
remember { context.findActivity() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ public interface Retained<out T : Any> : ReadOnlyProperty<Any?, T> {
@InternalRetainedApi
public inline fun <reified T : Any> retain(
key: String = T::class.java.name,
noinline findViewModelStoreOwner: () -> ViewModelStoreOwner,
noinline findOwner: () -> ViewModelStoreOwner,
noinline instantiate: (RetainedEntry) -> T,
): Retained<T> = LazyRetained(
key = key,
retainedClass = T::class,
findViewModelStoreOwner = findViewModelStoreOwner,
findOwner = findOwner,
instantiate = instantiate
)
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ import kotlin.reflect.KProperty
internal class EagerRetained<out T : Any>(
key: String,
retainedClass: KClass<T>,
viewModelStoreOwner: ViewModelStoreOwner,
owner: ViewModelStoreOwner,
instantiate: (RetainedEntry) -> T,
) : Retained<T> {

private val factory = RetainedViewModelFactory(retainedClass, instantiate)

private val provider = ViewModelProvider(viewModelStoreOwner, factory)
private val provider = ViewModelProvider(owner, factory)

@Suppress("UNCHECKED_CAST")
override val value: T = provider[key, RetainedViewModel::class.java].retainedInstance as T
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import kotlin.reflect.KProperty
internal class LazyRetained<out T : Any>(
key: String,
retainedClass: KClass<T>,
findViewModelStoreOwner: () -> ViewModelStoreOwner,
findOwner: () -> ViewModelStoreOwner,
instantiate: (RetainedEntry) -> T,
) : Retained<T> {

override val value: T by lazy(LazyThreadSafetyMode.NONE) {
val retained = EagerRetained(
key = key,
retainedClass = retainedClass,
viewModelStoreOwner = findViewModelStoreOwner(),
owner = findOwner(),
instantiate = instantiate
)
return@lazy retained.value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public inline fun <reified T : Any> retainInFragment(
noinline instantiate: (RetainedEntry) -> T,
): Retained<T> = retain(
key = key,
findViewModelStoreOwner = findFragment,
findOwner = findFragment,
instantiate = instantiate,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public inline fun <reified T : Any> retainInNavGraph(
noinline instantiate: (RetainedEntry) -> T,
): Retained<T> = retain(
key = key,
findViewModelStoreOwner = { findNavGraph() },
findOwner = { findNavGraph() },
instantiate = instantiate,
)

Expand All @@ -44,6 +44,6 @@ public inline fun <reified T : Any> NavBackStackEntry.retain(
noinline instantiate: (RetainedEntry) -> T,
): Retained<T> = retain(
key = key,
findViewModelStoreOwner = { this },
findOwner = { this },
instantiate = instantiate,
)
2 changes: 1 addition & 1 deletion scripts/publish-module.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apply plugin: 'signing'

ext {
PUBLISH_GROUP_ID = 'dev.marcellogalhardo'
PUBLISH_VERSION = '0.16.0'
PUBLISH_VERSION = '0.17.0'
}

task androidSourcesJar(type: Jar) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public inline fun <reified T : Any> retainInView(
): Retained<T> {
return retain(
key = key,
findViewModelStoreOwner = { findView().findViewModelStoreOwnerOrThrow() },
findOwner = { findView().findViewModelStoreOwnerOrThrow() },
instantiate = instantiate,
)
}
Expand Down Expand Up @@ -95,7 +95,7 @@ public inline fun <reified T : Any> View.retainInActivity(
noinline instantiate: (RetainedEntry) -> T,
): Retained<T> = retain(
key = key,
findViewModelStoreOwner = { context.findActivity() },
findOwner = { context.findActivity() },
instantiate = instantiate,
)

Expand Down

0 comments on commit def9e85

Please sign in to comment.