Теперь эта ошибка появляется, когда я пытаюсь запустить мое приложение на моем устройстве
. Причина: kotlin.UninitializedPropertyAccessException: свойство lateinit viewModelFactory не было инициализировано
Этот проект использует фрагменты, в отличие от предыдущего проекта, когда работало выше.
class MainFragment : Fragment() {
private lateinit var binding: FragmentMainBinding
private lateinit var adapter: MainAdapter
private lateinit var viewModel: MainViewModel
@Inject lateinit var viewModelFactory: MainViewModelFactory
...
private fun populateUi() {
viewModel = ViewModelProviders.of(this, viewModelFactory).get(MainViewModel::class.java)
...
}
}
MainViewModelFactory:
class MainViewModelFactory @Inject constructor(private val mainViewModel: MainViewModel) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
return mainViewModel as T
}
throw IllegalArgumentException("Unknown class name")
}
}
У меня также есть этот модуль:
@Module
class ViewModelModule {
@Provides
@Singleton
fun provideMainViewModel(factory: MainViewModelFactory): ViewModelProvider.Factory = factory
}
используется в моем AppComponent:
@Singleton
@Component(modules = [
AndroidInjectionModule::class,
BuilderModule::class,
AppModule::class,
NetworkModule::class,
DaoModule::class,
ViewModelModule::class
])
interface AppComponent {
fun inject(app: App)
}
И этот модуль, который использует @ContributeAndroidInjector
для активности и фрагментов
@Module
abstract class BuilderModule {
@ContributesAndroidInjector
abstract fun contributeMainActivity(): MainActivity
@ContributesAndroidInjector
abstract fun contributeMainFragment(): MainFragment
}
Корень приложения, в котором ранее была только инъекция активности:
class App : Application(), HasActivityInjector, HasSupportFragmentInjector {
@Inject
lateinit var activityInjector: DispatchingAndroidInjector<Activity>
@Inject
lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>
override fun onCreate() {
super.onCreate()
DaggerAppComponent
.builder()
.appModule(AppModule(this))
.networkModule(NetworkModule("https://jsonplaceholder.typicode.com/"))
.build()
.inject(this)
}
override fun activityInjector(): AndroidInjector<Activity> {
return activityInjector
}
override fun supportFragmentInjector(): AndroidInjector<Fragment> {
return fragmentInjector
}
}
Предыдущее приложение, которое я создал, не использовало фрагменты, и я все еще думаю, что это может быть причиной его неудачи в этом проекте, который использует фрагменты.