Java 使用匕首2时Dao为空

Java 使用匕首2时Dao为空,java,android,android-room,dagger-2,Java,Android,Android Room,Dagger 2,当我在presenter中调用DAO时,它返回null并导致NPE。 这里有一些代码: 刀类 @Dao public interface ElementsDao { @Query("SELECT * FROM `elements`") Flowable<List<Elements>> getAll(); @Insert Maybe<Long> insert(Elements element);... }

当我在presenter中调用DAO时,它返回null并导致NPE。 这里有一些代码: 刀类

@Dao
public interface ElementsDao {
    @Query("SELECT * FROM   `elements`")
    Flowable<List<Elements>> getAll();

    @Insert
    Maybe<Long> insert(Elements element);...
}
组件类

@Singleton
@Component(dependencies = {},modules = {AppModule.class, DatabaseModule.class})
public interface AppComponent {

    void inject(MainActivity mainActivity);
    void inject(ElementsActivity elementsActivity);
    void inject(ActivityElementsPresenter activityElementsPresenter);

    ElementsDao elementsDao();

    AppDatabase appDatabase();

    Application application();
}
应用程序类(在清单中声明)

主持人

@InjectViewState
public class ActivityElementsPresenter extends MvpPresenter<ActivityElementsView> {
    @Inject
    ElementsDao elementsDao;

    public void addElement(Elements element){
        elementsDao.insert(element).subscribeOn(Schedulers.io())...
在调试时,我在presenter中设置了一个点,发现dao没有初始化
尝试使用类似于
App.getAppComponent().elementsDao()的东西但它也起作用。

你需要这样做

@InjectViewState
public class ActivityElementsPresenter extends MvpPresenter<ActivityElementsView> {
    @Inject
    ElementsDao elementsDao;

    public ActivityElementsPresenter(){
       App.getAppComponent().inject(this);//calling the dagger's injector to inject dependency.
    }

    public void addElement(Elements element){
        elementsDao.insert(element).subscribeOn(Schedulers.io())...
    }
}

您可以添加
AppDatabase
类的代码吗?不在这里,添加到您的问题中,这里不可读。@rahat抱歉,问题已更新您如何获得
ActivityElementsPresenter
的实例?您可以添加
MvpPresenter
的代码吗,
MvpPresenter
是所有演示者的基类吗?是的,这就是问题所在,现在感谢每一位演示者,您必须向AppComponent添加一个抽象方法,并在构造函数中调用
inject
方法。如果您使用BasePresenter模式,那么注入将更容易。
@InjectViewState
public class ActivityElementsPresenter extends MvpPresenter<ActivityElementsView> {
    @Inject
    ElementsDao elementsDao;

    public void addElement(Elements element){
        elementsDao.insert(element).subscribeOn(Schedulers.io())...
@Database(entities = {Elements.class}, version = 1, exportSchema = false)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
    public abstract ElementsDao getElementsDao();
    //...
}
@InjectViewState
public class ActivityElementsPresenter extends MvpPresenter<ActivityElementsView> {
    @Inject
    ElementsDao elementsDao;

    public ActivityElementsPresenter(){
       App.getAppComponent().inject(this);//calling the dagger's injector to inject dependency.
    }

    public void addElement(Elements element){
        elementsDao.insert(element).subscribeOn(Schedulers.io())...
    }
}
@Singleton
@Component(dependencies = {},modules = {AppModule.class, DatabaseModule.class})
public interface AppComponent {
    void inject(MainActivity mainActivity);
    void inject(ElementsActivity elementsActivity);
    void inject(ActivityElementsPresenter activityElementsPresenter);//will inject dependency to ActivityElementsPresenter.  
}