Bug 1845905 - Add a utility to create store lazily

fenix/118.0
rahulsainani 10 months ago committed by mergify[bot]
parent b47d6ccb57
commit cdec272975

@ -4,6 +4,8 @@
package org.mozilla.fenix.components
import androidx.annotation.MainThread
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelStoreOwner
@ -33,6 +35,7 @@ class StoreProvider<T : Store<*, *>>(
*
* @param createStore Callback to create a new [Store], used when the [ViewModel] is first created.
*/
@VisibleForTesting
class StoreProviderFactory<T : Store<*, *>>(
private val createStore: () -> T,
) : ViewModelProvider.Factory {
@ -42,3 +45,17 @@ class StoreProviderFactory<T : Store<*, *>>(
return StoreProvider(createStore()) as VM
}
}
/**
* Helper function for lazy creation of a [Store] instance scoped to a [ViewModelStoreOwner].
*
* @param createStore Function that creates a [Store] instance.
*/
@MainThread
fun <T : Store<*, *>> ViewModelStoreOwner.lazyStore(
createStore: () -> T,
): Lazy<T> {
return lazy(mode = LazyThreadSafetyMode.NONE) {
StoreProvider.get(this, createStore)
}
}

@ -63,4 +63,28 @@ class StoreProviderTest {
StoreProvider.get(fragment, createStore)
assertFalse(createCalled)
}
@Test
fun `WHEN store is created lazily THEN createStore is only invoked on access`() {
val fragment = createAddedTestFragment { Fragment() }
var createCalled = false
val createStore = {
createCalled = true
basicStore
}
val store by fragment.lazyStore(createStore)
// The store is not created yet.
assertFalse(createCalled)
assertEquals(basicStore, store)
// The store is only created when it's used.
assertTrue(createCalled)
// The store is not created again.
createCalled = false
fragment.lazyStore(createStore).value
assertFalse(createCalled)
}
}

Loading…
Cancel
Save