I do DI into my fragments like so: ```class MyFrag...
# announcements
k
I do DI into my fragments like so:
Copy code
class MyFragment : ... {
  @Inject lateinit var mViewModelFactory: ViewModelProvider.Factory
  private val mViewModel by lazy { 
    ViewModelProviders
      .of(requireActivity(), mViewModelFactory)
      .get(MyViewModel::class.java) // MyViewModel extends ViewModel
  }
}
Any idea how I might parametrize this into a base class to ideally get rid of ALL this boilerplate? I have
Copy code
abstract class BaseFragment<VM: ViewModel>: ... {
  abstract var mViewModelFactory: ViewModelProvider.Factory
  private val mViewModel by lazy {
    ViewModelProviders
      .of(requireActivity(), mViewModelFactory)
      .get(?????)
  }
}
This wuold at least enable
Copy code
class MyFragment<MyViewModel> {
  @Inject lateinit var mViewModelFactory: ViewModelProvider.Factory
}
But I’m stuck here. I thought about making a lookup table to map fragment classes to viewmodel classes, but would like to avoid that if possible. Thoughts? I doubt it can be done, but thought I’d ask here.
k
Copy code
abstract class  BaseFragment<V : ViewModel, S : ViewState> : Fragment() {
    @Inject
    lateinit var factory: ViewModelFactory

    abstract val clazz: Class<V>

    val _state = PublishSubject.create<S>()
    val state = _state.hide()

    val compositeBag = CompositeDisposable()
    val vm: V by lazy {
        ViewModelProviders.of(this, factory).get(clazz)
    }

    override fun onDetach() {
        _state.onComplete()
        compositeBag.clear()
        super.onDetach()
    }
}
👍 1
Copy code
class XXFragment : BaseFragment<XXViewModel, XXState>() {
    override val clazz: Class<XXViewModel> = XXViewModel::class.java