Переменная viewModelFactory не была инициализирована при использовании фрагментов - PullRequest
0 голосов
/ 14 октября 2018

Теперь эта ошибка появляется, когда я пытаюсь запустить мое приложение на моем устройстве

. Причина: 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
    }
}

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

1 Ответ

0 голосов
/ 14 октября 2018

Я решил это, добавив

override fun onAttach(context: Context?) {
    super.onAttach(context)
    AndroidSupportInjection.inject(this)
}

Но я бы хотел сделать то же самое в упражнении.Почему это не работает так же, используя BuilderModule?

...