如何使用Dagger 2将存储库注入ViewModel

时间:2017-09-20 10:56:06

标签: java android dagger-2

我尝试使用与Architecture Guide类似的Dagger 2将存储库注入我的ViewModel。但是,我的存储库值始终为null。

这是我的ViewModel

public class MainActivityViewModel extends ViewModel {
    @Inject
    public CustomRepository repository;
    private MutableLiveData<List<CustomItem>> items = new MutableLiveData<>();

    public void initModel(Date month){    
        try {
            items = repository.getItems(month);
        } catch (Exception e) {
            items = new MutableLiveData<>();
        }
    }

    public MutableLiveData<List<CustomItem>> getItems() {
        return items;
    }
}

我的AppModule

@Module
public class AppModule {

    Application mApplication;

    public AppModule(Application application) {
        mApplication = application;
    }

    @Provides
    @Singleton
    Application providesApplication() {
        return mApplication;
    }

    @Provides
    @Singleton
    public ItemDao provideItemDao(AppDatabase appDatabase){
        return appDatabase.itemDao();
    }

    @Provides
    @Singleton
    public AppDatabase provideDatabase(){
        //TODO remove allow main thread and use asynchronous query
        return Room.databaseBuilder(mApplication, AppDatabase.class, AppDatabase.DB_NAME)
                .allowMainThreadQueries().build();
    }
}

我的AppComponent

@Singleton
@Component(modules = {AppModule.class})
public interface MyAppComponent {
    public CustomRepository repository();
}

我的申请类

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        DaggerMyAppComponent.builder()
                            .appModule(new AppModule(this))
                            .build();
    }
}
你能帮我看看我在这里缺少什么吗?我想我需要在某处调用inject()方法,但我不确定应该如何以及在哪里进行此操作。

2 个答案:

答案 0 :(得分:1)

您可以通过ViewModel构造函数从DaggerGraph中注入所有必需的依赖项。

请按照https://stackoverflow.com/a/49087002/4770877

的说明操作

答案 1 :(得分:0)

MyApp课程中,创建DaggerApplicationComponent后,您可以调用component.inject(this),其中this是您的应用程序的实例。

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ApplicationComponent component = DaggerMyAppComponent.builder()
                            .appModule(new AppModule(this))
                            .build();
        component.inject(this);
    }
}

这意味着在您的应用程序组件MyAppComponent中,您需要添加一个inject()方法,这样才能解决您的问题

@Singleton
@Component(modules = {AppModule.class})
public interface MyAppComponent {
    void inject(MyApp myApp);
    public CustomRepository repository();
}