william
05/07/2019, 3:57 PMClass
as well?
abstract class BaseViewModelFragment<T : ViewModel>(private val type: Class<T>) : BaseInjectedFragment() {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
private lateinit var viewModel: T
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProviders.of(this, viewModelFactory).get(type)
}
}
wbertan
05/07/2019, 4:04 PMabstract class BaseViewModelFragment<T : ViewModel> : Fragment() {
lateinit var viewModelFactory: ViewModelProvider.Factory
private lateinit var viewModel: T
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProviders.of(this, viewModelFactory).get(
(this.javaClass
.genericSuperclass as ParameterizedType)
.actualTypeArguments[0] as Class<T>
)
}
}
william
05/07/2019, 4:10 PMwbertan
05/07/2019, 4:19 PMwilliam
05/07/2019, 4:20 PMwbertan
05/07/2019, 4:22 PMabstract class BaseViewModelFragment<T : ViewModel> : Fragment() {
lateinit var viewModelFactory: ViewModelProvider.Factory
private lateinit var viewModel: T
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProviders.of(this, viewModelFactory).get(viewModel::class.java)
}
}
william
05/07/2019, 4:22 PMwbertan
05/07/2019, 4:25 PMbstract class BaseViewModelFragment<T : ViewModel> : Fragment() {
lateinit var viewModelFactory: ViewModelProvider.Factory
abstract val viewModel: T
inline fun <reified K : ViewModel> asasMagic() = ViewModelProviders.of(this, viewModelFactory).get(K::class.java)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
}
class OtherViewModelFragment: BaseViewModelFragment<ViewModel>() {
override val viewModel: ViewModel
get() = asasMagic()
}
william
05/07/2019, 4:28 PMfun main() {
Fuzz(3.0)
}
class Fuzz<T : Number>(init: T) {
init {
println(init::class.java)
}
}
prints class java.lang.Double
Stephan Schroeder
05/08/2019, 9:14 AMwilliam
05/11/2019, 10:05 PMabstract class BaseViewModelFragment : BaseInjectedFragment() {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
/**
* Lazily get the view model
*/
inline fun <reified VM : ViewModel> viewModel() = lazy {
ViewModelProviders.of(this, viewModelFactory).get(VM::class.java)
}
}
BaseViewModelFragment
I use private val viewModel: HomeViewModel by viewModel()