InstantiationException в динамических модулях с использованием Hilt

Пытался решить эту проблему, прочитав docs, а также я последовал этот пример. Но мне это не удалось. Поэтому мне нужно было бы выяснить, что я упускаю или делаю не так.

У меня есть модуль приложения, где стоит @HiltAndroidApp:

@HiltAndroidApp
class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()
        ...
    }
}

Теперь у меня есть модуль: core, в котором моя FirebaseAuth зависимость сгенерирована из модуля:

@Module
@InstallIn(ApplicationComponent::class)
class FirebaseModule{
    @Provides
    fun provideFirebaseAuth() : FirebaseAuth = FirebaseAuth.getInstance()
}

И модуль :login, в котором я застрял. Прежде чем продолжить: модуль :app реализует модули :core и :login.

Теперь я создал LoginModuleDependencies в :core:

@EntryPoint
@InstallIn(ApplicationComponent::class)
interface LoginModuleDependencies {
    fun firebaseAuth(): FirebaseAuth
}

Итак, я предполагаю, что этот используется, чтобы выявить зависимости между динамическими функциями. Переходя к LoginComponent (в модуле ': login'), делаю так:

@Component(dependencies = [LoginModuleDependencies::class])
interface LoginComponent {
    fun inject(loginFragment: LoginFragment)

    @Component.Factory
    interface Factory {
        fun create(
            loginModuleDependencies: LoginModuleDependencies
        ): LoginComponent
    }
}

Что, согласно документам, позволяет мне это делать:

@OptIn(ExperimentalCoroutinesApi::class)
class LoginFragment : Fragment(R.layout.fragment_login) {

    private val loginViewModel: LoginViewModel by viewModels()
    private var fragmentLoginBinding: FragmentLoginBinding? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        DaggerLoginComponent.factory()
            .create(
                loginModuleDependencies = EntryPointAccessors.fromApplication(
                    requireActivity().applicationContext,
                    LoginModuleDependencies::class.java
                )
            ).inject(this)
        super.onCreate(savedInstanceState)
    }
...
}

Авария: RuntimeException: Cannot create an instance of class com.coroutinedispatcher.login.LoginViewModel Еще немного по логам:

Caused by: java.lang.InstantiationException: java.lang.Class<com.coroutinedispatcher.login.LoginViewModel> has no zero argument constructor

Предполагается, что я что-то упускаю или делаю что-то не так.

Потому что мой LoginViewModel выглядит так:

class LoginViewModel @ViewModelInject constructor(private val firebaseAuth: FirebaseAuth, @Assisted private val savedStateHandle: SavedStateHandle) : ViewModel()

Я могу убедиться, что если я выполняю внедрение поля в соответствующий фрагмент, извлекается экземпляр FirebaseAuth.

Итак, что я сейчас делаю не так?

РЕДАКТИРОВАТЬ: Итак, в основном, я смог подтвердить, что могу вытащить из ApplicationComponent, потому что делаю это:

@Inject lateinit var firebaseAuth: FirebaseAuth

// onViewCreated
Log.d(someClassName, "value: ${::firebaseAuth.isInitialized}") // true

А также, создание нового нормального класса, который извлекает этот dep, работает:

class SomeWeirdClass @Inject constructor(private val firebaseAuth: FirebaseAuth)

Регистрация этого во фрагменте

Log.d(someClassName, "value: ${::someWeirdClass.isInitialized}") // true

Поэтому я предполагаю, что может быть проблема с версией, но я просто не могу понять, что именно. Предоставление ViewModelProvider.Factory работает, но какой смысл в его использовании, если вы должны использовать @ViewModelInject.


person coroutineDispatcher    schedule 08.11.2020    source источник
comment
Пользовательский конструктор AssistedInject в вашей ViewModel и укажите в конструкторе хотя бы один аргумент Assisted. @coroutineDispatcher   -  person Aslam Hossin    schedule 08.11.2020
comment
Я не могу игнорировать ваше имя: D @coroutineDispatcher   -  person iamanbansal    schedule 08.11.2020
comment
@AslamHossin Используя Hilt, вы можете использовать @ViewModelInject вместо этого, вам не нужно использовать @AssistedInject. Но даже если я так поступлю, поведение останется прежним. Я уже пробовал.   -  person coroutineDispatcher    schedule 08.11.2020
comment
Где в вашем примере @ ViewModelInject?   -  person Sinan Kozak    schedule 09.11.2020
comment
@SinanKozak только что обновил вопрос   -  person coroutineDispatcher    schedule 09.11.2020