2

使用新的依赖注入库,如何在没有构造函数参数的情况下Hilt注入一些类?可能吗?ViewModelViewModelFactory

像 in 一样Fragment,我们只使用@AndroidEntryPointand @Inject

4

2 回答 2

6

如何在没有构造函数参数和 ViewModelFactory 的情况下将一些类注入 ViewModel?可能吗?

@HiltViewModelHilt 支持通过(以前的@ViewModelInject)注解对 ViewModel 进行构造函数注入。

这允许任何带@AndroidEntryPoint注释的类将它们重新定义defaultViewModelProviderFactoryHiltViewModelFactory,这允许创建@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
于 2020-07-21T13:11:02.320 回答
1

是的,可以将依赖项注入到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通过构造函数注入来注入依赖项。

于 2020-07-28T20:29:55.623 回答