簡體   English   中英

沒有構造函數參數的 Hilt Inject 到 ViewModel

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM