gpt4 book ai didi

android - 使用 fragment 时 viewModelFactory 变量尚未初始化

转载 作者:行者123 更新时间:2023-12-04 00:29:57 27 4
gpt4 key购买 nike

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

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property viewModelFactory has not been initialized



这个项目正在使用 fragment ,这与之前的项目在上述工作时不同。
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)
...
}
}

主视图模型工厂:
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 的模块对于 Activity 和 fragment
@Module
abstract class BuilderModule {
@ContributesAndroidInjector
abstract fun contributeMainActivity(): MainActivity

@ContributesAndroidInjector
abstract fun contributeMainFragment(): MainFragment
}

应用程序的根目录,以前只有 Activity 注入(inject):
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
}
}

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

最佳答案

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

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

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

关于android - 使用 fragment 时 viewModelFactory 变量尚未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52802191/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com