在没有构造函数参数的情况下将其插入ViewModel

时间:2020-07-19 12:40:33

标签: android dagger-hilt

使用新的依赖项注入库Hilt,如何在没有构造函数参数和ViewModel的情况下将某些类注入ViewModelFactory? 有可能吗?

就像Fragment一样,我们仅使用@AndroidEntryPoint@Inject

2 个答案:

答案 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中。