在 Hilt 中使用 ActivityRetainedScoped 时,什么时候会销毁存储库?

When will repository be destroyed when using ActivityRetainedScoped in Hilt?

我有一个名为 MainRepository 的存储库,带有 @ActivityRetainedScoped

@ActivityRetainedScoped
class MainRepository @Inject constructor( ... ) {
   fun getCurrentUser(): Flow<User?> = callbackFlow { ... }
}

这个存储库像这样注入到多个视图模型中,因为我需要使用回调流在不同的活动中使用来自 firestore 的相同实时数据

@HiltViewModel
class MainViewModel @Inject constructor(
    mainRepository: MainRepository) : ViewModel() {
    val user: LiveData<User?> = mainRepository.getCurrentUser().asLiveData()
}

@HiltViewModel
class ProgramViewModel @Inject constructor(
    mainRepository: MainRepository): ViewModel() {
    val user: LiveData<User?> = mainRepository.getCurrentUser().asLiveData()
}

最后,我在这样的活动中使用我的视图模型

val mainViewModel: MainViewModel by viewModels()
val currentUser by mainViewModel.user.observeAsState()
val programViewModel: ProgramViewModel by viewModels()
val currentUser by programViewModel.user.observeAsState()

我想知道我的存储库到底什么时候会被销毁,当然,如果有更好的方法,请提出来,我的 objective 是为了减少多个云 firestore 请求。我刚接触 Hilt

因此,这里将在创建 activity 时创建存储库,并在销毁 activity 时销毁存储库,因为您使用的是 @ActivityRetainedScoped 范围,那么您的存储库将仍然存在在配置更改期间,但将使用 activity 创建和销毁。以及您的存储库所属的activity。

另请参阅 hilt 官方文档的评论:

ActivityRetainedComponent lives across configuration changes, so it is created at the first onCreate and last onDestroy.

但我想您不需要将范围界定添加到您的存储库中,因为存储库总是附加一些功能 activity 和 ViewModel 并且会自动落入功能范围。