简体   繁体   English

Dao 是 null 而使用 Dagger2

[英]Dao is null while using Dagger2

When i call DAO in presenter, it returns null and causes NPE.当我在演示者中调用 DAO 时,它返回 null 并导致 NPE。 Some code here: DAO class这里有一些代码:DAO class

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

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

modules classes:模块类:

@Module
public class DatabaseModule {

    private AppDatabase appDatabase;
    public DatabaseModule(Application mApplication){
        appDatabase = Room.databaseBuilder(mApplication, AppDatabase.class,"dbWarehouse")
                .setJournalMode(RoomDatabase.JournalMode.TRUNCATE)
                .build();
    }

    @Singleton
    @Provides
    public AppDatabase provideDatabase(){
        return appDatabase;
    }

    @Singleton
    @Provides
    ElementsDao providesElementsDao(AppDatabase appDatabase){
        return appDatabase.getElementsDao();
    }
}

@Module
public class AppModule {
    Application mApplication;

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

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

Component class组件 class

@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();
}

App class (declared in manifest)应用 class(在清单中声明)

public class App extends Application {
    private static AppComponent appComponent;
    @Override
    public void onCreate() {
        super.onCreate();
        initDagger();
    }
    private void initDagger(){
        appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .databaseModule(new DatabaseModule(this))
                .build();
    }

    public static AppComponent getAppComponent() {
        return appComponent;
    }
}

And presenter和主持人

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

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

UPDATE AppDatabase class更新应用数据库 class

@Database(entities = {Elements.class}, version = 1, exportSchema = false)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
    public abstract ElementsDao getElementsDao();
    //...
}

While debuging i setted a point in presenter and saw that dao isn't initialized elementsDao Trying to use something like App.getAppComponent().elementsDao();在调试时,我在演示者中设置了一个点,发现 dao 没有初始化elementsDao尝试使用类似App.getAppComponent().elementsDao(); but it inst works too.但它也可以工作。

You need to do it this way,你需要这样做,

@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())...
    }
}

Then in然后在

@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.  
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM