[英]Hilt Inject into ViewModel without constructor params
使用新的依賴注入庫Hilt
,如何在沒有構造函數參數和ViewModelFactory
ViewModel
可能嗎?
就像在Fragment
中一樣,我們只使用@AndroidEntryPoint
和@Inject
。
如何在沒有構造函數參數和 ViewModelFactory 的情況下將一些類注入 ViewModel? 可能嗎?
Hilt 支持通過@HiltViewModel
(以前的@ViewModelInject
)注解對 ViewModel 進行構造函數注入。
這允許任何@AndroidEntryPoint
-annotated class 將其defaultViewModelProviderFactory
重新定義為HiltViewModelFactory
,這允許創建@HiltViewModel
-annotated ViewModels 通過 Dagger/Hilt 正確實例化。
新的 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
class 中。 首先,我們需要創建一個帶有@EntryPoint
注釋的新接口來訪問它。
入口點是一個接口,其中包含我們想要的每種綁定類型(包括其限定符)的訪問器方法。 此外,接口必須使用
@InstallIn
注釋以指定要在其中安裝入口點的組件。
最佳實踐是在使用它的 class 中添加新的入口點接口。
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
中,因為我們需要來自 Application 容器實例的依賴項。
@Module
@InstallIn(ApplicationComponent.class)
public class DatabaseModule {
@Provides
public static MyDao provideMyDao(MyDatabase db) {
return db.MyDao();
}
}
雖然上面的代碼已經過測試並且可以正常工作,但是android官方不推薦將依賴注入ViewModel的方法; 除非我們知道自己在做什么,否則最好的方法是通過構造函數注入將依賴項注入ViewModel
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.