Класс Dagger2 Inject с параметром (используя Room) - PullRequest
0 голосов
/ 21 февраля 2019

У меня проблема с введением классов с Dagger2.Я использую RoomDatabase для доступа к базе данных.

Настройка моей комнаты:

Дао

interface noteDao()
interface noteTypeDao()
interface userDao()

NoteRepository

@Singleton
class NoteRepository @Inject constructor(
    private val noteDao: NoteDao,
    private val noteTypeDao: NoteTypeDao,
    private val userDao: UserDao
) {

}

База данных приложений

@Database(entities = [Note::class, User::class, NoteType::class], version = 1)
abstract class AppDatabase : RoomDatabase() {

    abstract fun noteDao(): NoteDao
    abstract fun userDao(): UserDao
    abstract fun noteTypeDao(): NoteTypeDao

    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        fun getDatabase(context: Context): AppDatabase {
            val tempInstance = INSTANCE
            if (tempInstance != null) {
                return tempInstance
            }
            synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "NoteDatabase"
                ).build()
                INSTANCE = instance
                return instance
            }
        }
    }
}

Настройка Dagger 2:

AppModule

@Module
class AppModule {

    @Provides
    fun provideNoteRepository(app: Application): NoteRepository {
        return NoteRepository(
            AppDatabase.getDatabase(app).noteDao(),
            AppDatabase.getDatabase(app).noteTypeDao(),
            AppDatabase.getDatabase(app).userDao()
        )
    }

    @Provides
    fun provideApplication(): Application {
        return Application()
    }

}

AppComponent

@Component(modules = [AppModule::class])
interface AppComponent {
    fun inject(app: MainActivity)
}

Я получаю NullPointerExeption внутри AppDatabaseв строке context.applicationContext.Любое предложение, как решить проблему?Похоже, что AppDatabase не получает экземпляр приложения из Dagger2.

1 Ответ

0 голосов
/ 21 февраля 2019

Application является классом фреймворка, вы не можете просто создать его экземпляр, вызвав его конструктор.Вместо этого вам нужно передать в ваше приложение, которое для вас создает экземпляр фреймворка, в ваш модуль и предоставить следующее:

@Module
class AppModule(val application: Application) { 
    ...

    @Provides
    fun provideApplication(): Application {
        return application
    }
}

Теперь, если вы создавали свой AppComponent, как это раньше, в приложении onCreate (предположительно, поскольку это обычный способ сделать это):

override fun onCreate() {
    injector = DaggerAppComponent.create()
}    

Вам придется заменить его чем-то вроде этого, передавая экземпляр вашего приложения модулю, чтобы он затем мог предоставитьэто:

override fun onCreate() {
    injector = DaggerAppComponent.builder()
            .appModule(appModule(this))
            .build()
}
...