ViewModelComponent 是一个 Hilt 组件层次结构 (Component hierarchy) 中的一员,它遵照 ViewModel 的生命周期,并能够束缚类型的效果域到此组件上。

ViewModelComponent 增加到 Hilt 之前,ViewModel 类通过 ActivityReappointmenttainedComponent创建和注入。因而,ViewModel 中的依托项仅能够运用未束缚效果域、或是将效果域束缚到 SingletonComponentActivityRetainedComponent 中,被一切 ViewModel 同享实例的类型。

假定您的 App 每个页面都仅为一个 Activity,上述内容并不会成为问题,因为此状况中将类型的效果域束缚为 ActivityRetainedComponent 意味着每个页面的 ViewModel 类都将取得该appointment类型的不同实例。但是,每个页approach面仅为一个 Activity 并不适用于大多数 App。

此外,ActivityRetainedC缓存的视频怎样保存到本地ompoapp装置下载nent 组件不会默缓存视频兼并app下载许绑定 SavedStateHandle

现在,您能够通过遵照 ViewModel 生命周期的 ViewModelComponent 组件来创建并注入 ViewModel。每一个 ViewModel 实例持有不同的 ViewModAPPelComponent 实例,您能够运用 @ViewModelScAPPoped 注解,将类型的apple效果appointment域束缚到该组件上。

Hilt 新组件 | ViewModelComponent

ViewModelComponent 在精简版 Hilt 组件层次结构中的方位

ViewModelComponent 承继自 ActivityRetainedComponent,因而它的类型束缚依托于上层的 SingletonComponentActivityRetainedComponent。除此之外,ViewModelCompon缓存视频在手机哪里找ent 还默许绑定了一个与 ViewModel 相关的 SavedStateHandle

将效果域绑定为 ViewModelComponent

与其他组件比较,通过运用 @ViewModelScoped 将效果域绑定为 ViewModelComponent,并将缓存整理其注入缓存视频怎样转入相册到 ViewModel 中,能够取得更好的灵活性和更精细的操控粒度。ViewModel 能够在配备更改中保存状况,并且其生命周期能够被 Activity、Fragment,乃至是 导航图 操控。

但是,因为 ActivityComponentFragmentComponent 不会在配备缓存文件在哪里更改中保存状况,所以在某些状况下仍然有必要束缚效果域到这些组件。其他,Fragmen缓存视频tComponent 承继自 ActivityComponent,运用多个 ViewModeapp装置下载lComponent 无法完结相同缓存文件在哪里的行为。

因而:

  • 假定需求一切的 ViewModel 同享同一个类型的实appear例,运用 @ActivityRetainedSc缓存视频oped 注解。
  • 假定需缓存求将类型的效果域束缚为 ViewModel缓存视频在手机哪里找,使其在配备更改时保存状况,或使其受导航图操控,运用 @ViewModelScoped 注解。
  • 假定需求将类型的效果域束缚为 Activity,并且不apple期望在配备更改时保存状况,运用 @ActiviapprovetyScoped 注解,假定需求将效果域束缚为 Fragment 并完结上述行为,运用 @Fragm缓存视频entScoped 注解。

运用 @ViewModelScoped

您能够运用该注解将一个app装置下载类型的效果域束缚为特定 ViewModel 的实例。ViewModel 及其依托项以及他们的依托都将注入相同的实例。

下面的示例中,LoginViewModel 以及 Regist缓存视频怎样转入相册rationViewModel 别离运用了被 @ViewModelScoped 注解的 UserInputAuthData 类型,使它们具有不同的状况。

@ViewModelScoped // 将类型的效果域束缚为 ViewModel
class UserInputAuthData(
private val handle: SavedStateHandle //在 ViewModelComponent 中默许绑定
) { /* 逻辑代码以及缓存数据*/ }
class RegistrationViewModel(
p缓存整理rivate缓存的视频怎样保存到本地 val userInputAuthData: UserInputAuthData,
priappstorevate valAPP validateUsernameUseCase: ValidateUsernameUseCase,缓存视频
papproverivate v缓存视频怎样转入相册al validatappointmentePasswordUseCase: ValidatePasswordUseCase
) : ViewModel() { /*缓存视频怎样转入相册 ... */ }
class LoginViewModel(
private val userInputAuthData: UserInputAuthData,
privatappointmente val validateUsername缓存文件在哪里UseCase: ValidateUsernameappleUseCase,
private val validatePasswordUseCase: ValidatePasswo缓存视频怎样转入本地视频rdUseCas缓存整理e
) : ViewModel() { /* ... */ }
class ValiappointmentdateappreciateUsernameUseCase(
private val userInputAuthData: UserInputAuthData,
private val repository: UserRepository
) { /* ... */缓存 }缓存视频兼并
class ValidatePasswordUseCase(
private val userIn缓存视频putAappearuthData: UserInapp装置下载putAuthD缓存视频兼并app下载ata,
private val repository缓存的视频怎样保存到本地: UserRepository
) { /* ... */ }

因为 UserInputAuthData 的效果缓存视频兼并app下载域被束缚为 ViewModel,approveRegistrationViewModelLoginViewModel 将取得不同的 UserInputAuthData 实例。但是,每个 ViewModel 中没有束缚效果域的 UseCase 依托会与其 ViewModel 运用相同的 UserInputAuthData 实例application

向 ViewModelComponent 中增加绑缓存的视频怎样保存到本地

approve其他组件一样,缓存视频怎样转入本地视频您能够向 ViewModelComponent 中增加绑定。假定在上述代码片段中,ValidateUseapplicationrnameUseCase 是一个接口,您能够这样告知 Hilt 运用哪种完结:

@Module
@InstallIn(ViewMod缓存视频elCoAPPmponent::class)
object UserAuthModule {
@Provides
fun proapplevideValidateUsernameUseCase(
userInputAuthData: Use缓存整理rInputAuthData,  //效果域为 ViewModelComponent
reposi缓存视频在手机哪里找tory: UserRepository
): ValidateUsernam缓存eUseCase {
return ValidateUsernameUseCaseImpl(userInappearanceputAuthData, repository)
}
}缓存视频怎样转入本地视频

ViewModelComponent 遵照 ViewModel 的生命周期,并能够将类型的效果域束缚到此组件上。因为 ViewModel 的生命周appointment期能够被 Activity、Fragment 乃至是 导航图 所操控,您能够根据需求将效果域束缚到这些当地,来取得更大的灵活性和更精细的操控缓存视频粒度。

请运用 @ViewModelScoped 将类型的效果域束缚为 ViewModel。运用 @ActiviappearancetyRetainedScoped 束缚效果域,使同一界面的一切的 VappleiewModel 同享同一个类型的实例。