ViewModelComponent
是一个 Hilt 组件层次结构 (Component hierarchy) 中的一员,它遵照 ViewModel 的生命周期,并能够束缚类型的效果域到此组件上。
在 ViewModelComponent
增加到 Hilt 之前,ViewModel 类通过 ActivityReappointmenttainedComponent
创建和注入。因而,ViewModel 中的依托项仅能够运用未束缚效果域、或是将效果域束缚到 SingletonComponent
或 ActivityRetainedComponent
中,被一切 ViewModel 同享实例的类型。
假定您的 App 每个页面都仅为一个 Activity,上述内容并不会成为问题,因为此状况中将类型的效果域束缚为 ActivityRetainedComponent
意味着每个页面的 ViewModel 类都将取得该appointment类型的不同实例。但是,每个页approach面仅为一个 Activity 并不适用于大多数 App。
此外,ActivityRetainedC缓存的视频怎样保存到本地ompoapp装置下载nent
组件不会默缓存视频兼并app下载许绑定 SavedStateHandle
。
现在,您能够通过遵照 ViewModel 生命周期的 ViewModelComponent 组件来创建并注入 ViewModel。每一个 ViewModel 实例持有不同的 ViewModAPPelComponent 实例,您能够运用 @ViewModelScAPPoped 注解,将类型的apple效果appointment域束缚到该组件上。
ViewModelComponent 在精简版 Hilt 组件层次结构中的方位
ViewModelComponent
承继自 ActivityRetainedComponent
,因而它的类型束缚依托于上层的 SingletonComponent
和 ActivityRetainedComponent
。除此之外,ViewModelCompon缓存视频在手机哪里找ent 还默许绑定了一个与 ViewModel 相关的 SavedStateHandle
。
将效果域绑定为 ViewModelComponent
与其他组件比较,通过运用 @ViewModelScoped 将效果域绑定为 ViewModelComponent,并将缓存整理其注入缓存视频怎样转入相册到 ViewModel 中,能够取得更好的灵活性和更精细的操控粒度。ViewModel 能够在配备更改中保存状况,并且其生命周期能够被 Activity、Fragment,乃至是 导航图 操控。
但是,因为 ActivityComponent
和 FragmentComponent
不会在配备缓存文件在哪里更改中保存状况,所以在某些状况下仍然有必要束缚效果域到这些组件。其他,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,approveRegistrationViewModel
和 LoginViewModel
将取得不同的 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 同享同一个类型的实例。