Невозможно создать экземпляр MainViewModel с Hilt - PullRequest
1 голос
/ 01 августа 2020

Я тестирую рукоять с помощью простого проекта, чего я хочу достичь, так это сгенерировать экземпляр моей MainViewModel с помощью Hilt, это то, что я сделал до сих пор

MainActivity

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
 ...
}

MainFragment

@AndroidEntryPoint
class MainFragment : Fragment(),MainAdapter.OnTragoClickListener {

    private val viewModel by activityViewModels<MainViewModel>()

...
}

MainViewModel

class MainViewModel @ViewModelInject constructor(private val repo:Repo):ViewModel(){
...
}

RepoImpl

class RepoImpl @Inject constructor(private val dataSource: DataSource): Repo {
...
}

DataSourceImpl

class DataSourceImpl @Inject constructor(private val tragosDao: TragosDao): DataSource{
...
}

Теперь это архитектура приложения. Далее, здесь Repo и DataSource - простые интерфейсы, которые я использую.

Итак, после этого я генерирую все, что требуется рукоятью для генерации экземпляров

BaseApplication

@HiltAndroidApp
class BaseApplication: Application() {
}

AppModule

@Module
@InstallIn(ApplicationComponent::class)
object AppModule {

    @Singleton
    @Provides
    fun provideRoomInstance(
        @ApplicationContext context: Context
    ) = Room.databaseBuilder(
            context,
            AppDatabase::class.java,
            "tabla_tragos")
            .build()

    @Singleton
    @Provides
    fun provideTragosDao(db: AppDatabase) = db.tragoDao()

}

Модуль выше предоставляет tragoDao (), поэтому я могу получить к нему доступ в моем DataSourceImpl, поскольку мне нужен уникальный экземпляр этой базы данных, который я использую @Singleton в его предоставлении

Затем я просто создаю другой модуль, который сообщит рукоятке о реализациях интерфейсов, указанных выше.

@Module
@InstallIn(ActivityRetainedComponent::class)
abstract class ActivityModule {

    @Binds
    abstract fun bindDataSource(dataSource:DataSourceImpl): DataSource

    @Binds
    abstract fun bindRepo(repo: RepoImpl): Repo

}

Поскольку мне нужен экземпляр MainViewModel, я использую для этого модуля ActivityRetainedComponent

После компиляции приложения я получить эту ошибку

java .lang.RuntimeException: невозможно создать экземпляр класса com.g.tragosapp.ui.viewmodel.MainViewModel

Зависимости

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

dependencies {
  implementation fileTree(dir: "libs", include: ["*.jar"])
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
  implementation 'androidx.core:core-ktx:1.3.0'
  implementation 'androidx.appcompat:appcompat:1.1.0'
  implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

  //Navigation Components
  implementation "androidx.navigation:navigation-fragment-ktx:2.3.0"
  implementation "androidx.navigation:navigation-ui-ktx:2.3.0"
  implementation 'androidx.legacy:legacy-support-v4:1.0.0'

  //ViewModel y LiveData
  implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

  // KTX - Viewmodel Y Livedata
  implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
  implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-alpha05"

  implementation "androidx.fragment:fragment-ktx:1.2.5"
  implementation "androidx.activity:activity-ktx:1.1.0"

  //utils
  implementation 'com.github.bumptech.glide:glide:4.11.0'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

  //Corutinas
  implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3"

  //Retrofit
  implementation 'com.squareup.retrofit2:retrofit:2.6.0'
  implementation 'com.google.code.gson:gson:2.8.5'
  implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
  implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0'

  implementation 'com.github.chrisbanes:PhotoView:2.3.0'

  //Room
  implementation 'androidx.room:room-ktx:2.2.5'
  implementation "androidx.room:room-runtime:2.2.5"
  kapt "androidx.room:room-compiler:2.2.5"

  //Hilt
  implementation "com.google.dagger:hilt-android:2.28-alpha"
  kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
  implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'


  testImplementation 'junit:junit:4.12'
  androidTestImplementation 'androidx.test.ext:junit:1.1.1'
  androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

Я также добавил

  implementation "androidx.fragment:fragment-ktx:1.2.5"
  implementation "androidx.activity:activity-ktx:1.1.0"
  implementation "androidx.core:core:1.3.1"

, что не повлияло на

1 Ответ

1 голос
/ 01 августа 2020
class RepoImpl

Должно быть

@Singleton class RepoImpl

И то же самое для DataSourceImpl

Затем измените @InstallIn(ActivityRetainedComponent::class) на @InstallIn(SingletonComponent::class) (раньше было ApplicationComponent)

А также убедитесь, что у вас есть все эти депы (на момент написания):

apply plugin: 'dagger.hilt.android.plugin'

implementation 'com.google.dagger:dagger:2.28'
kapt 'com.google.dagger:dagger-compiler:2.28'

// hilt
implementation 'com.google.dagger:hilt-android:2.28-alpha'
kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.28-alpha'
kaptTest 'com.google.dagger:hilt-android-compiler:2.28-alpha'
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...