Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 科特林带匕首的房间:当注入一个类时,刀是空的_Android_Kotlin_Dagger 2_Android Room - Fatal编程技术网

Android 科特林带匕首的房间:当注入一个类时,刀是空的

Android 科特林带匕首的房间:当注入一个类时,刀是空的,android,kotlin,dagger-2,android-room,Android,Kotlin,Dagger 2,Android Room,我刚刚熟悉了新房间的图书馆,遇到了一个恼人的问题。我有一个UserRepository类,它根据多种因素从网络和本地存储加载数据。当我想从数据库中注入Dao对象时,会出现以下错误: java.lang.IllegalArgumentException:指定为非null的参数为null:method kotlin.jvm.internal.Intrinsics.checkParametersNotNull 下面是部分代码,是什么导致了这个错误 应用模块 @Module class Appl

我刚刚熟悉了新房间的图书馆,遇到了一个恼人的问题。我有一个
UserRepository
类,它根据多种因素从网络和本地存储加载数据。当我想从数据库中注入Dao对象时,会出现以下错误:

java.lang.IllegalArgumentException:指定为非null的参数为null:method kotlin.jvm.internal.Intrinsics.checkParametersNotNull

下面是部分代码,是什么导致了这个错误

应用模块

    @Module
class ApplicationModule(val application: CustomApplication) {
    private val BASE_URL = "https://api.stackexchange.com/2.2/"

    @Provides
    @Singleton
    fun provideAppContext() : Context = application

    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit = Retrofit.Builder()
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(Gson()))
            .baseUrl(BASE_URL)
            .build()

    @Provides
    @Singleton
    fun provideUserRepository(retrofit: Retrofit, database: AppDatabase) =
            UserRepository(
                    retrofit.create(UserService::class.java),
                    retrofit.create(QuestionService::class.java),
                    database.userDao())

    @Provides
    @Singleton
    fun provideDatabase(context: Context)
            = Room.databaseBuilder(context, AppDatabase::class.java, "db-name").build()
} 
用户道

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAllUsers() : Flowable<List<User>>

    @Insert
    fun insertAll(users: List<User>)
}
有人知道为什么
database.userDao()
可以为空吗?在从数据库请求之前,是否需要进行额外的初始化?我在任何地方都找不到有关此的信息

我正在使用此代码:

@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {

    abstract fun userModel(): UserDao

    companion object {
        private const val DB_NAME = "users.db"

        fun createPersistentDatabase(context: Context): AppDatabase
                = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, DB_NAME).build()
    }
}
我用以下方法注射它:

   @Singleton @Provides fun provideApp(context: Context) = AppDatabase.createPersistentDatabase(context)
我正在使用以下代码:

@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {

    abstract fun userModel(): UserDao

    companion object {
        private const val DB_NAME = "users.db"

        fun createPersistentDatabase(context: Context): AppDatabase
                = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, DB_NAME).build()
    }
}
我用以下方法注射它:

   @Singleton @Provides fun provideApp(context: Context) = AppDatabase.createPersistentDatabase(context)

这基本上是相同的代码,只是创建代码被移动到AppDatabase类这基本上是相同的代码,只是创建代码被移动到AppDatabase类