基类中的ViewModelProviders.get(...) [英] ViewModelProviders.get(...) in base class
问题描述
我试图通过在抽象基类中移动一些ViewModel实例来削减Dagger的样板,但是找不到一个很好的方法来做到这一点.我的目的是实例化我的基本片段中的所有ViewModel,以使它们可供所有子片段使用,而无需它们自己进行实例化.我的问题在于使用通用(VM)检索ViewModel-具体在这里:.get(viewModel::class.java)
.我还尝试了.get(VM::class.java)
这是不允许的
I'm trying to cut some of Dagger's boilerplate by moving some of my ViewModel instantiation in an abstract base class but can't find quite a good way to do this. My intent is to instantiate all my ViewModels from my base fragment for them to be ready to consume by all child fragments without having them do their own instantiation. My issue lies in retrieving the ViewModel using a generic (VM)- specifically here: .get(viewModel::class.java)
. I also attempted .get(VM::class.java)
that is not permitted
BaseFragment
abstract class BaseFragment<VM : ViewModel> : Fragment() {
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
lateinit var viewModel : VM
override fun onAttach(context: Context?) {
super.onAttach(context)
viewModel = ViewModelProviders.of(this, viewModelFactory).get(viewModel::class.java)
}
}
ViewModelProviders.get(...)方法签名
public <T extends ViewModel> T get(@NonNull Class<T> modelClass)
这有可能吗?
推荐答案
如果您定义的BaseFragment
如下:
public class BaseFragment<T extends ViewModel> extends Fragment {
@Inject
protected T viewModel;
}
You can use the ViewModelUtils class from the Architecture Components's Github browser sample to create ViewModel
factories.
/**
* Creates a one off view model factory for the given view model instance.
*/
public class ViewModelUtil {
private ViewModelUtil() {}
public static <T extends ViewModel> ViewModelProvider.Factory createFor(T model) {
return new ViewModelProvider.Factory() {
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
if (modelClass.isAssignableFrom(model.getClass())) {
return (T) model;
}
throw new IllegalArgumentException("unexpected model class " + modelClass);
}
};
}
}
在BaseFragment
的onActivityCreated
方法中,您可以添加
In the onActivityCreated
method of the BaseFragment
you can add
@Override
public void onActivityCreated(@Nullable final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ViewModelProvider.Factory viewModelFactory = ViewModelUtil.createFor(viewModel);
ViewModelProviders.of(this, viewModelFactory).get(viewModel.getClass());
}
此技术的代码来自此博客发布.
这篇关于基类中的ViewModelProviders.get(...)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!