Пытался решить эту проблему, прочитав 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
.
@ViewModelInject
вместо этого, вам не нужно использовать@AssistedInject
. Но даже если я так поступлю, поведение останется прежним. Я уже пробовал. - person coroutineDispatcher   schedule 08.11.2020