【问题标题】:viewModelFactory variable has not been initialized when utilizing fragments使用片段时 viewModelFactory 变量尚未初始化
【发布时间】:2019-03-19 00:33:02
【问题描述】:

现在,当我尝试在我的设备中运行我的应用程序时会显示此错误

原因: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
}

应用的根目录,之前只有activity注入:

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
    }
}

我之前构建的应用程序没有使用片段,我仍然认为这可能是它在这个使用片段的项目中失败的原因。

【问题讨论】:

    标签: android android-fragments kotlin viewmodel dagger-2


    【解决方案1】:

    我通过添加解决了这个问题

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

    但我想在活动中做同样的事情。为什么使用BuilderModule 不能正常工作?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-12
      • 2012-03-25
      • 2015-07-04
      • 1970-01-01
      相关资源
      最近更新 更多