Skip to content

Commit

Permalink
Merge pull request #79 from marcellogalhardo/promote-compose-api-to-s…
Browse files Browse the repository at this point in the history
…table

Promote `@Composable retain` to stable
  • Loading branch information
marcellogalhardo authored Dec 30, 2022
2 parents 1dcc993 + d9ffca1 commit f2122ef
Show file tree
Hide file tree
Showing 10 changed files with 23 additions and 29 deletions.
12 changes: 4 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,25 +68,21 @@ class CounterFragment : Fragment() {
}
```

### Compose Support (stable delegates & experimental API)
### Compose Support

```kotlin
@Composable
fun SampleView() {
// Experimental API
val viewModel = retain { ViewModel() }

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

// Using a Fragment delegates (stable)
val fragment: Fragment // find Fragment
val viewModel by fragment.retain { ViewModel() }
val viewModel by retain(owner = fragment) { ViewModel() }

// Using NavBackStackEntry delegates (stable)
val navBackStackEntry: NavBackStackEntry // find NavBackStackEntry
val viewModel by navBackStackEntry.retain { ViewModel() }
val viewModel by retain(owner = navBackStackEntry) { ViewModel() }
}
```

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 f2122ef

Please sign in to comment.