#android #kotlin #generics
#Android #kotlin #дженерики
Вопрос:
Я хочу использовать его как официальный сайт val viewModel by viewModels { SavedStateViewModelFactory(application, this) }
Да, это намного проще, чем использовать ViewModelProvider...
Мы все знаем, что ViewModel может быть инкапсулирован в базовый фрагмент, поэтому я хочу знать, как его инкапсулировать by viewmodels
.
Я попытался инкапсулировать базовый фрагмент, но у меня возникла проблема с дженериками
точно так же, как показано ниже:
мой базовый фрагмент:
abstract class AbsFragment444<DB :ViewDataBinding, VM :ViewModel> :Fragment(){
***//other var
***//other var
***//other var
protected val mViewModel: VM by viewModels(this,SavedStateViewModelFactory(requireActivity().application,this))
}
Однако компилятор запрашивает: cannot use 'VM' as modified type parameter. Use a class instead
Что мне делать?
Комментарии:
1. Попробуйте эту строку абстрактного кода val ViewModel: Class<VM>
2. Я попробовал, затем компилятор запрашивает в ViewModels :
Type parameter bound for VM in inline fun <reified VM : ViewModel> Fragment.viewModels(noinline ownerProducer: () -> ViewModelStoreOwner = ..., noinline factoryProducer: (() -> ViewModelProvider.Factory)? = ...): Lazy<VM> is not satisfied: inferred type Class<VM> is not a subtype of ViewModel
3.
by viewModels
должен знать конкретный тип, который он создает. Поскольку ваш абстрактный класс не может этого знать, это невозможно.4. спасибо, теперь я изменил его на ‘ViewModelProvider …’