使用新的依赖注入库,如何在没有构造函数参数的情况下Hilt
注入一些类?可能吗?ViewModel
ViewModelFactory
像 in 一样Fragment
,我们只使用@AndroidEntryPoint
and @Inject
。
使用新的依赖注入库,如何在没有构造函数参数的情况下Hilt
注入一些类?可能吗?ViewModel
ViewModelFactory
像 in 一样Fragment
,我们只使用@AndroidEntryPoint
and @Inject
。
如何在没有构造函数参数和 ViewModelFactory 的情况下将一些类注入 ViewModel?可能吗?
@HiltViewModel
Hilt 支持通过(以前的@ViewModelInject
)注解对 ViewModel 进行构造函数注入。
这允许任何带@AndroidEntryPoint
注释的类将它们重新定义defaultViewModelProviderFactory
为HiltViewModelFactory
,这允许创建@HiltViewModel
通过 Dagger/Hilt 正确实例化的带注释的 ViewModel。
新的 HILT 版本:
@HiltViewModel
class RegistrationViewModel @Inject constructor(
private val someDependency: SomeDependency,
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
...
}
旧刀柄版本:
class RegistrationViewModel @ViewModelInject constructor(
private val someDependency: SomeDependency,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
...
}
接着
@AndroidEntryPoint
class ProfileFragment: Fragment(R.layout.profile_fragment) {
private val viewModel by viewModels<RegistrationViewModel>() // <-- uses defaultViewModelProviderFactory
是的,可以将依赖项注入到ViewModel
没有构造函数参数的类中。首先,我们需要创建一个带有注释的新接口@EntryPoint
来访问它。
入口点是一个接口,其中包含我们想要的每种绑定类型(包括其限定符)的访问器方法。此外,必须对接口进行注释
@InstallIn
以指定要在其中安装入口点的组件。
最佳实践是在使用它的类中添加新的入口点接口。
public class HomeViewModel extends ViewModel {
LiveData<List<MyEntity>> myListLiveData;
@ViewModelInject
public HomeViewModel(@ApplicationContext Context context) {
myListLiveData = getMyDao(context).getAllPosts();
}
public LiveData<List<MyEntity>> getAllEntities() {
return myListLiveData;
}
@InstallIn(ApplicationComponent.class)
@EntryPoint
interface MyDaoEntryPoint {
MyDao myDao();
}
private MyDao getMyDao(Context appConext) {
MyDaoEntryPoint hiltEntryPoint = EntryPointAccessors.fromApplication(
appConext,
MyDaoEntryPoint.class
);
return hiltEntryPoint.myDao();
}
}
在上面的代码中,我们创建了一个名为getMyDao
并用于从应用程序容器EntryPointAccessors
中检索的方法。MyDao
请注意,该接口带有注释,
@EntryPoint
并且它安装在 中,ApplicationComponent
因为我们需要来自 Application 容器实例的依赖项。
@Module
@InstallIn(ApplicationComponent.class)
public class DatabaseModule {
@Provides
public static MyDao provideMyDao(MyDatabase db) {
return db.MyDao();
}
}
虽然上面的代码已经过测试并且可以正常工作,但它不是android官方推荐的将依赖注入ViewModel的方式;除非我们知道自己在做什么,否则最好的方法是ViewModel
通过构造函数注入来注入依赖项。