使用片段时未初始化 viewModelFactory 变量

gam*_*ofe 3 android viewmodel android-fragments kotlin dagger-2

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

引起: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)
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

主视图模型工厂:

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

我也有这个模块:

@Module
class ViewModelModule {
    @Provides
    @Singleton
    fun provideMainViewModel(factory: MainViewModelFactory): ViewModelProvider.Factory = factory
}
Run Code Online (Sandbox Code Playgroud)

在我的 AppComponent 中使用:

@Singleton
@Component(modules = [
    AndroidInjectionModule::class,
    BuilderModule::class,
    AppModule::class,
    NetworkModule::class,
    DaoModule::class,
    ViewModelModule::class
])
interface AppComponent {
    fun inject(app: App)
}
Run Code Online (Sandbox Code Playgroud)

而这个@ContributeAndroidInjector用于活动和片段的模块

@Module
abstract class BuilderModule {
    @ContributesAndroidInjector
    abstract fun contributeMainActivity(): MainActivity

    @ContributesAndroidInjector
    abstract fun contributeMainFragment(): MainFragment
}
Run Code Online (Sandbox Code Playgroud)

应用程序的根目录,以前只有活动注入:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

gam*_*ofe 8

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

override fun onAttach(context: Context?) {
    super.onAttach(context)
    AndroidSupportInjection.inject(this)
}
Run Code Online (Sandbox Code Playgroud)

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