无法在Fragement中注入ViewModelProvider.Factory

问题描述 投票:0回答:2

所以,我有这个自定义的ViewModelFactory,我正在尝试插入片段。但这不起作用,并向我显示

lateinit属性viewModelFactory尚未初始化`

这是我的ViewModelFactory

@Singleton
class ViewModelFactory @Inject constructor(private val creators: MutableMap<Class<out ViewModel?>?, Provider<ViewModel?>?>?) : ViewModelProvider.Factory {
   ....
}

这是我的片段

class MainFragment : Fragment() {

    @Inject
    lateinit var viewModelFactory: ViewModelFactory
    private lateinit var viewModel: MainViewModel
    private var bindings: MainFragmentBinding? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        (activity?.application as BaseApplication).getAppComponent().inject(this)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        bindings = DataBindingUtil.inflate(layoutInflater, R.layout.main_fragment, container, false)
        return bindings?.root
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProvider(this, viewModelFactory).get(MainViewModel::class.java)
        setupObserver()
    }
}

这是我的ViewModelModule

@Module
abstract class ViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(MainViewModel::class)
    abstract fun bindViewModel(mainViewModel: MainViewModel): ViewModel

    @Binds
    abstract fun bindFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
}

这里是AppCompoent

@Singleton
@Component(modules = [ApiModule::class, ContextModule::class, ViewModelModule::class])
interface AppComponent {
    fun inject(mainActivity: MainActivity)
    fun inject(fragment: Fragment)
}
android kotlin dependency-injection dagger-2
2个回答
0
投票

尝试更改

fun inject(fragment: Fragment)

to

fun inject(fragment: MainFragment)

在您的AppComponent中


0
投票

您可以尝试使用

MainFragment : DaggerFragment()

而不是

MainFragment : Fragment()
© www.soinside.com 2019 - 2024. All rights reserved.