【问题标题】:Dagger2 Inject class with parameter (using Room)Dagger2 带参数的注入类(使用 Room)
【发布时间】:2019-02-21 19:46:02
【问题描述】:

我在使用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()
    }

}

应用组件

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

我在context.applicationContext 行中得到一个 NullPointerExeption int AppDatabase。任何建议如何解决这个问题? AppDatabase 似乎没有从Dagger2 获取应用程序实例。

【问题讨论】:

  • return Application() 是关于创建实际的 android 应用程序实例的吗?我认为这是你的空指针的错误和根本原因。

标签: android kotlin dagger-2 android-room


【解决方案1】:

Application 是一个框架类,你不能自己通过调用它的构造函数来实例化它。相反,您需要将框架为您实例化的应用程序传递到您的模块中,并提供:

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

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

现在,如果您以前像这样在您的应用程序的onCreate 中创建AppComponent(大概是通常的做法):

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

你必须用类似这样的东西替换它,将你的应用程序实例传递给模块,以便它可以提供它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2017-09-29
    相关资源
    最近更新 更多