Tower Guidev2
11/30/2022, 3:02 PMTower Guidev2
11/30/2022, 3:07 PMonCleared()
functions.
I was expecting to see onCleared() on each viewmodel as i navigate between screens, e.g. navigating from Screen A to B
i thought i would see viewmodel A onCleared()
triggered, then when i navigate from Screen B to C
i thought i would see viewmodel B onCleared()
triggered
this is not happening though.
can someone explain why my expectations are wrong?Zun
11/30/2022, 3:20 PMZun
11/30/2022, 3:21 PMTower Guidev2
11/30/2022, 3:40 PMA -> B -> C -> A
I am logging onCleared() calls for both A and B
ii). when i navigate S l o w I y from Screen A -> B -> C -> A
I am not logging any onCleared()Zun
11/30/2022, 3:44 PMTower Guidev2
11/30/2022, 3:46 PMZun
11/30/2022, 3:47 PMTower Guidev2
11/30/2022, 3:47 PM@Composable
fun MyScreen(
modifier: Modifier = Modifier,
viewModel: MyViewModel = hiltViewModel()
) {
val context = LocalContext.current
Tower Guidev2
11/30/2022, 3:47 PMTower Guidev2
11/30/2022, 3:48 PM@HiltViewModel
class MyViewModel @Inject constructor(private val repository: MyRepository) : BaseViewModel() {
Tower Guidev2
11/30/2022, 3:49 PM@InstallIn(ViewModelComponent::class)
@Module
object RepositoryModule {
@Provides
@ViewModelScoped
fun provideMyRepository(repository: MasterRepository): MyRepository {
return MyRepository(repository)
}
}
Zun
11/30/2022, 3:49 PMZun
11/30/2022, 3:49 PMTower Guidev2
11/30/2022, 3:51 PM/**
* Returns an existing
* [HiltViewModel](<https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel>)
* -annotated [ViewModel] or creates a new one scoped to the current navigation graph present on
* the {@link NavController} back stack.
*
* If no navigation graph is currently present then the current scope will be used, usually, a
* fragment or an activity.
*
* @sample androidx.hilt.navigation.compose.samples.NavComposable
* @sample androidx.hilt.navigation.compose.samples.NestedNavComposable
*/
@Composable
inline fun <reified VM : ViewModel> hiltViewModel(
viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
}
): VM {
val factory = createHiltViewModelFactory(viewModelStoreOwner)
return viewModel(viewModelStoreOwner, factory = factory)
}
@Composable
@PublishedApi
internal fun createHiltViewModelFactory(
viewModelStoreOwner: ViewModelStoreOwner
): ViewModelProvider.Factory? = if (viewModelStoreOwner is NavBackStackEntry) {
HiltViewModelFactory(
context = LocalContext.current,
navBackStackEntry = viewModelStoreOwner
)
} else {
// Use the default factory provided by the ViewModelStoreOwner
// and assume it is an @AndroidEntryPoint annotated fragment or activity
null
}
Tower Guidev2
11/30/2022, 4:13 PMTower Guidev2
11/30/2022, 4:13 PMTower Guidev2
11/30/2022, 4:28 PMIan Lake
11/30/2022, 8:26 PMremember
itTower Guidev2
12/01/2022, 7:57 AM