Android 如何获取ViewModel?
我只想在片段(扩展片段)中获得对ViewModel.class(扩展自AndroidViewModel)的引用。到处都是这样描述的:Android 如何获取ViewModel?,android,android-fragments,viewmodel,deprecated,Android,Android Fragments,Viewmodel,Deprecated,我只想在片段(扩展片段)中获得对ViewModel.class(扩展自AndroidViewModel)的引用。到处都是这样描述的: UserModel userModel = ViewModelProviders.of(getActivity()).get(UserModel.class); ,但ViewModelProviders很久以前就被弃用了 *API级别1.1.0中不推荐使用此类* 我无法导入具有以下内容的类: android.arch.lifecycle.[ViewModelP
UserModel userModel = ViewModelProviders.of(getActivity()).get(UserModel.class);
,但ViewModelProviders很久以前就被弃用了 *API级别1.1.0中不推荐使用此类* 我无法导入具有以下内容的类: android.arch.lifecycle.[ViewModelProviders] 它只提供ViewModelProvider和其他功能
我如何才能获得UserModel.class的实例
但是ViewModelProviders早就被弃用了
ViewModelProviders
未被弃用。因此,请使用ViewModelProviders
:
ViewModelProviders.of(yourFragment).get(UserModel.class)
有些ViewModelProviders
已被弃用,例如其构造函数,但该类总体上未被弃用
更新:2020-05-28现在ViewModelProviders
已被弃用。在Kotlin中,使用viewModels()的和相关属性委托。在Java中,使用新建ViewModelProvider(…).get(UserModel.class)
(根据这些viewmodels的范围,使用…
的各种值)。以下是如何编写
将Kotlin与最新的Android体系结构组件一起使用时,应使用viewModels()的Kotlin属性委托,如下所示:
class YourFragment:Fragment(){
私有val viewModel by viewModels()
}
更多信息类ViewModelProviders
已弃用!
理解使用ViewModelProvider
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
快乐编码:)在深入研究之后,我通过在活动中添加以下方法解决了类似的问题:
protected final <T extends ViewModel> ViewModel obtainViewModel(@NonNull AppCompatActivity activity, @NonNull Class<T> modelClass) {
ViewModelProvider.AndroidViewModelFactory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(activity.getApplication());
return new ViewModelProvider(activity, factory).get(modelClass);
}
还是碎片
private MyViewModel myViewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getActivity() != null) {
myViewModel = (MyViewModel) obtainFragmentViewModel(getActivity(), MyViewModel.class);
}
}
到目前为止似乎效果不错。如果有人有更好的方法,请让我们知道 is的Kotlin版本
您在哪里发现*该类在API级别1.1.0中被弃用。*@MaxAves指出它是红色的。我应该从另一个类扩展我的片段吗?还是应该添加一个依赖项?@fabi:“它是红色的”——您缺少import
语句。您还需要android.arch.lifecycle:extensions
依赖项,如中所述。不推荐使用ViewModelProviders
protected final <T extends ViewModel> ViewModel obtainViewModel(@NonNull AppCompatActivity activity, @NonNull Class<T> modelClass) {
ViewModelProvider.AndroidViewModelFactory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(activity.getApplication());
return new ViewModelProvider(activity, factory).get(modelClass);
}
protected final <T extends ViewModel> ViewModel obtainFragmentViewModel(@NonNull FragmentActivity fragment, @NonNull Class<T> modelClass) {
ViewModelProvider.AndroidViewModelFactory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(fragment.getApplication());
return new ViewModelProvider(fragment, factory).get(modelClass);
}
private MyViewModel myViewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myViewModel = (MyViewModel) obtainViewModel(this, MyViewModel.class);
}
private MyViewModel myViewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getActivity() != null) {
myViewModel = (MyViewModel) obtainFragmentViewModel(getActivity(), MyViewModel.class);
}
}
val vm = ViewModelProvider(requireActivity()).get(MyViewModel::class.java)