首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin和Room的匕首2错误

Kotlin和Room的匕首2错误
EN

Stack Overflow用户
提问于 2018-06-29 20:47:57
回答 1查看 1.2K关注 0票数 2

我正在重构一个应用程序给Kotlin,目前我正面临来自Dagger的一个奇怪的错误。我试图实现一个MVVM设计,但我很难坚持匕首错误。

AppModule

代码语言:javascript
复制
@Module
class AppModule(val app: App) {

companion object {
    private var INSTANCE: RecorderisDB? = null

    private fun getInstance(context: Context): RecorderisDB?{
        if (INSTANCE == null) {
            synchronized(RecorderisDB::class){
                INSTANCE = Room.databaseBuilder(context.applicationContext,
                        RecorderisDB::class.java,
                        "recorderis.db")
                        .build()
            }
        }
        return INSTANCE
    }

    fun destroyInstance(){
        INSTANCE = null
    }
}

@Provides @Singleton
fun provideApp() = app

@Provides @Singleton @Nullable
fun getDB(context: Context): RecorderisDB? = getInstance(context)

@Provides @Singleton
fun provideDateVM(db: RecorderisDB): DateViewModel {
    return DateViewModel(db)
}

AppComponent

代码语言:javascript
复制
@Singleton
@Component(modules = [(AppModule::class)])
interface AppComponent {

fun inject(app: App)

fun inject(form: Form)
}

DateViewModel

代码语言:javascript
复制
class DateViewModel @Inject constructor(val dB: RecorderisDB){

fun createDate(name: String, symbol: String, date: String): Completable {
    return Completable.fromAction{ dB.getDateDao().newDate(Date(name, symbol, date))}
}

Form.kt

代码语言:javascript
复制
class Form : AppCompatActivity() {

@Inject
lateinit var dateVM: DateViewModel
public override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_form)
    App.graph.inject(this)

    initDialog()
    setUpRecyclerView()
 }

Stacktrace

英语不是我的第一语言,但是我认为这个错误是矛盾的吗?是不是告诉我我的DB不是可空的,而是被提供的?基本上,我在AppModule中拥有的是我的同伴对象。

代码语言:javascript
复制
15:27:21.882 [ERROR] [org.gradle.api.Task] e: C:\Users\diego\Apps\Recorderis\app\build\tmp\kapt3\stubs\debug\tech\destinum\recorderis\DI\AppComponent.java:13: 
error: [Dagger/Nullable] tech.destinum.recorderis.Data.RecorderisDB is not nullable, 
but is being provided by @org.jetbrains.annotations.Nullable @Singleton 
@Provides tech.destinum.recorderis.Data.RecorderisDB 
tech.destinum.recorderis.DI.AppModule.getDB(android.content.Context)
public abstract void inject(@org.jetbrains.annotations.NotNull()
                     ^
  tech.destinum.recorderis.Data.RecorderisDB is injected at
      tech.destinum.recorderis.DI.AppModule.provideDateVM(db)
  tech.destinum.recorderis.Data.ViewModels.DateViewModel is injected at
      tech.destinum.recorderis.activities.Form.dateVM
  tech.destinum.recorderis.activities.Form is injected at
      tech.destinum.recorderis.DI.AppComponent.inject(tech.destinum.recorderis.activities.Form)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-29 20:50:51

它特别指出,问题在于您正在注入RecorderisDB,即使您正在提供RecorderisDB?

解决方案是什么?Dagger已经通过使用@Singleton @Provides为您处理双重检查的锁定。根本不需要这样的代码。

代码语言:javascript
复制
@Module
class AppModule(val app: App) {

    @Provides
    fun provideApp() = app

    @Provides @Singleton
    fun getDB(context: App): RecorderisDB = Room.databaseBuilder(context.applicationContext,
                        RecorderisDB::class.java,
                        "recorderis.db")
                        .build()

    @Provides 
    // @Singleton // are you CERTAIN this is singleton?
    fun provideDateVM(db: RecorderisDB): DateViewModel {
        return DateViewModel(db)
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51109196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档