代码之家  ›  专栏  ›  技术社区  ›  Ispam

2号匕首,有角和房间错误

  •  1
  • Ispam  · 技术社区  · 7 年前

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

    应用程序模块

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

    应用程序组件

    @Singleton
    @Component(modules = [(AppModule::class)])
    interface AppComponent {
    
    fun inject(app: App)
    
    fun inject(form: Form)
    }
    

    日期视图模型

    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))}
    }
    

    表格.kt

    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日志

    英语不是我的第一语言,但这个错误我认为是矛盾的?告诉我我的数据库不可以为空,但正在提供?基本上,我在AppModule中有我的伴生对象。

    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)
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   EpicPandaForce Jigar Joshi    6 年前

    它特别指出问题是你在注射 RecorderisDB 即使你提供 RecorderisDB? .

    解决方案?匕首已经为你处理了双重检查锁定 @Singleton @Provides .根本不需要那个代码。

    @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)
        }
    }
    
    推荐文章