使用新的依赖项注入库Hilt
,如何在没有构造函数参数和ViewModel
的情况下将某些类注入ViewModelFactory
?
有可能吗?
就像Fragment
一样,我们仅使用@AndroidEntryPoint
和@Inject
。
答案 0 :(得分:2)
如何在没有构造函数参数和ViewModelFactory的情况下将某些类注入ViewModel?有可能吗?
Hilt支持通过@ViewModelInject
批注注入ViewModel的构造函数。
这允许任何带有@AndroidEntryPoint
注释的类将其defaultViewModelProviderFactory
重新定义为HiltViewModelFactory
,从而允许创建通过Dagger /正确实例化的带有@ViewModelInject
注释的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
答案 1 :(得分:0)
是的,可以在没有构造函数参数的情况下将依赖项注入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
从Application容器中检索MyDao
。
请注意,该接口使用
@EntryPoint
进行了注释, 安装在ApplicationComponent
中,因为我们要依赖 从“应用程序”容器的实例中获取。
@Module
@InstallIn(ApplicationComponent.class)
public class DatabaseModule {
@Provides
public static MyDao provideMyDao(MyDatabase db) {
return db.MyDao();
}
}
尽管上面的代码已经过测试并可以正常工作,但这不是Android官员推荐的将依赖项注入ViewModel的推荐方法;除非我们知道自己在做什么,否则最好的方法是通过构造函数注入将依赖项注入ViewModel
中。