【问题标题】:Cannot inject interface in kotlin dagger2 mvvm无法在 kotlin dagger2 mvvm 中注入接口
【发布时间】:2020-03-24 00:58:04
【问题描述】:

嗨,当我尝试在以下类中注入我的 Doa 接口时,我正在使用 mvvm 和 dagger2

@Singleton
class PodCastRepository @Inject constructor(private val dao: PodCastDao) {
}

我的接口类

interface PodCastDao {

    fun getLegoThemes(): LiveData<PodCast>

}

我收到以下错误

错误:[Dagger/MissingBinding] in..myapplication.podcast.data.PodCastDao 无法提供 没有 @Provides 注释的方法。公共抽象接口 应用组件 { ^ 在..myapplication.podcast.data.PodCastDao 被注入 在..myapplication.podcast.data.PodCastRepository(dao) in..myapplication.podcast.data.PodCastRepository 被注入 在..myapplication.podcast.PodCastViewModel(存储库) in..myapplication.podcast.PodCastViewModel 被注入 在..myapplication.di.ViewModelModule.bindThemeViewModel(viewModel) java.util.Map,javax.inject.Provider> 被注射在 在..myapplication.di.ViewModelFactory(创作者) in..myapplication.di.ViewModelFactory 注入于 在..myapplication.di.ViewModelModule.bindViewModelFactory(工厂) androidx.lifecycle.ViewModelProvider.Factory 在注入 在..myapplication.podcast.PodcastFragment.viewModelFactory in..myapplication.podcast.PodcastFragment 被注入 dagger.android.AndroidInjector.inject(T) [in..myapplication.di.AppComponent → 在..myapplication.di.MainActivityModule_ContributeMainActivity.MainActivitySubcomponent → 在..myapplication.di.FragmentBuildersModule_ContributeThemeFragment.PodcastFragmentSubcomponent]

请帮我解决这个问题,我是 dagger 的新手,我也在使用 kotlin 和 mvvm

【问题讨论】:

  • 需要先提供数据库。然后在您为 dao 提供的方法中返回 dao。
  • 首先dagger不能提供接口。由于不会创建Interface的实例,您必须提供实现,让dagger知道如何创建实例或自己创建实例。

标签: android kotlin mvvm dagger-2 android-mvvm


【解决方案1】:

需要先提供一个数据库。然后在您为 dao 提供的方法中返回 dao

例如:

package com.test.demo.db

import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.test.demo.model.entity.Movie
import com.test.demo.model.entity.Article
import com.test.demo.util.StringListConverter

@Database(entities = [Article::class,Movie::class],
    version = 3, exportSchema = false)

@TypeConverters(value = [StringListConverter::class/*, (IntegerListConverter::class),
    (KeywordListConverter::class), (VideoListConverter::class), (ReviewListConverter::class)*/])
abstract class AppDatabase : RoomDatabase() {
    abstract fun movieDao(): MovieDao
    abstract fun peopleDao(): ArticleDao
}



package com.test.demo.di

import android.app.Application
import androidx.annotation.NonNull
import androidx.room.Room
import com.test.demo.db.AppDatabase
import com.test.demo.db.MovieDao
import com.test.demo.db.ArticleDao
import dagger.Module
import dagger.Provides
import javax.inject.Singleton

@Module
class PersistenceModule {

  @Provides
  @Singleton
  fun provideDatabase(@NonNull application: Application): AppDatabase {
    return Room
      .databaseBuilder(application, AppDatabase::class.java, "Demo1.db")
      .allowMainThreadQueries()
      .build()
  }

  @Provides
  @Singleton
  fun provideMovieDao(@NonNull database: AppDatabase): MovieDao {
    return database.movieDao()
  }


  @Provides
  @Singleton
  fun providePeopleDao(@NonNull database: AppDatabase): ArticleDao {
    return database.peopleDao()
  }

}

【讨论】:

    【解决方案2】:

    Dagger 不能只创建某个接口的实例。这就是错误所说的。当需要注入 PodCastDao 时,你需要告诉 Dagger 提供什么。

    因此,如果您还没有模块,则需要创建一个模块。然后你需要在里面写一段代码告诉 Dagger 注入什么到 PodCastDao:

    @Module
    class DaoModule {
    
        // This will tell Dagger how to construct PodCastDao when it's injected somewhere.
        // Could be annotated with @Singleton
        @Provides
        fun providePodCastDao(): PodCastDao {
            return PodCastDaoImpl() // Create implementation for the interface
        }
    
        // Other Providers for XyzDaos ...
    
    }
    

    您需要将此模块添加到您的 AppComponent:

    @Singleton // Or not, depends what you want
    @Component(modules = { DaoModule.class /*, other modules*/ })
    interface AppComponent { }
    

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 2019-06-28
      • 2017-09-29
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多