我尝试使用与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()方法,但我不确定应该如何以及在哪里进行此操作。
答案 0 :(得分:1)
您可以通过ViewModel构造函数从DaggerGraph中注入所有必需的依赖项。
的说明操作答案 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();
}