朋友们好,今天我向大家介绍下 ViewModel 中如何使用 ViewModelProvider.Factory. ---- 现在开始 所以,我们首要问题是:什么是 ViewModelProvider.Factory...所以,当我们在构造方法添加参数时, ViewModelProvider.Factory 的内部无法实例化 ViewModel 对象,因为 ViewModelProvider.Factory 调用主构造方法创建...如果你想在构造方法中添加参数,你需要编写自己的 ViewModelProvider 来创建 ViewModel 实例。 什么是 ViewModelProvider.Factory?...所以,为什么我们需要 ViewModelProvider.Factory ?...什么时候不应该使用 ViewModelProvider.Factory 如果你的 ViewModel 没有依赖项,这时你就不需要去自己创建 ViewModelProvider.Factory。
5.2 ViewModelProvider 在前面的示例代码中,我们在Activity中使用ViewModelProviders.of方法来获取ViewModel实例,如下所示。...MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class); 打开ViewModelProviders类的源码,可以发现...ViewModelProviders一共有四个构造方法,都是用来创建ViewModelProvider对象,只不过参数不同而已。...} 在构建ViewModelProvider的时候需要用到ViewModelStore和Factory,下面我们来分别介绍一下它们。...获取ViewModel实例时,ViewModelProvider一共提供了4个构造函数,另一个比较重要的构造函数是 public ViewModelProvider(@NonNull ViewModelStore
ViewModel 获取通过 ViewModelProvider(activity)[VM::class.java] 今天来探究下 ViewModel 具体是如何创建出来的。...创建流程 首先会创建一个 ViewModelProvider ,ViewModelProvider 的构造函数如下: public ViewModelProvider(@NonNull ViewModelStoreOwner...getDefaultViewModelProviderFactory() : NewInstanceFactory.getInstance()); } public ViewModelProvider...里面包括两部分: factory ViewModelProvider.Factory 负责 ViewModel 对象的创建 ViewModelStore 负责 ViewModel 的存储 ViewModelStore...获取 ViewModel 示例也是通过 ViewModelProvider 的get 方法: @MainThread public T get(@
: FragmentActivity, factory: ViewModelProvider.Factory?)...: ViewModelProvider { return if (factory == null) { ViewModelProvider(activity)...fun of(fragment: Fragment): ViewModelProvider { return ViewModelProvider(fragment) }...@MainThread @JvmStatic fun of(fragment: Fragment, factory: ViewModelProvider.Factory?)...: ViewModelProvider { return if (factory == null) { ViewModelProvider(fragment)
; 通过ViewModelProvider和自定义ViewModel类获取自定义ViewModel对象; 从自定义ViewModel对象获取数据对象,进行需要的读写操作。...ViewModel同时规避了传统方法的缺点: bind同一个Activity的Fragments均可以通过ViewModelProvider获取共同的数据对象,无需主动进行数据传递; 脱离Intent、...的创建; 第一部分的职责是构建 / 查找HolderFragment,对构建过程中的异常做保护,最后返回ViewModelProvider。...HolderFragment和ViewModelProvider共同持有的ViewModelStore将成为第二部分的核心; (第二部分:获取ViewModel) 调用ViewModelProvider.get...这也解释了创建ViewModelProvider时为什么需要HolderFragment配合,HolderFragment掌控了ViewModel的生命周期。
) protected void onCleared() { } } ViewModelProviders of @NonNull @MainThread public static ViewModelProvider...(application); } return new ViewModelProvider(ViewModelStores.of(fragment), factory); } @NonNull...@MainThread public static ViewModelProvider of(@NonNull FragmentActivity activity, @Nullable...(application); } return new ViewModelProvider(ViewModelStores.of(activity), factory); } Factory...createHolderFragment(fm); mNotCommittedActivityHolders.put(activity, holder); return holder; } ViewModelProvider
(MainActivity.this).get(MyGirlViewModel.class); ViewModelProvider本质是从传递进去的ViewModelStore来获取实例,如果没有,则利用...factory去创建 3.1 ViewModelProvider的创建 public class ViewModelProvider { private final Factory mFactory...对象已经创建完毕,接下来看ViewModelProvider的get()方法 3.2 ViewModelProvider调用get()方法 public class ViewModelProvider...{ private static final String DEFAULT_KEY = "androidx.lifecycle.ViewModelProvider.DefaultKey";...通过看ViewModelProvider的构造方法,我们可以发现是在owner.getViewModelStore()中获取的 public ViewModelProvider(@NonNull
(当然还有很多其他方式) 2.2、绑定Activity 这里有如下方式: ViewModelProviders.of(this).get(class)(过时) new ViewModelProvider...这个方式比较老了,在源码中也能发现,ViewModelProviders的of方法其实也是调用了ViewModelProvider,自动创建了一个factory。...(application); } return new ViewModelProvider(fragment.getViewModelStore(), factory); } 第二种方式...:new ViewModelProvider(this,factory).get(class) ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory...myViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class
,四个静态方法如下: public static ViewModelProvider of(@NonNull Fragment fragment) public static ViewModelProvider...of(@NonNull FragmentActivity activity) public static ViewModelProvider of(@NonNull Fragment fragment..., @Nullable Factory factory) public static ViewModelProvider of(@NonNull FragmentActivity activity, @...AndroidViewModelFactory,也可以自定义 Factory,直接调用上面任意一个方法创建 ViewModelProvider 即可。...那就来看一下 ViewModelProvider,ViewModelProvider 中两个关键属性: private final Factory mFactory; private final ViewModelStore
ViewModelProvider通过ViewModelStoreOwner来获取ViewModelStore,并通过ViewModelStore来管理ViewModel的生命周期。...ViewModelProvider ViewModelProvider是用于创建和获取ViewModel实例的工具类。...在Activity中获取ViewModel实例: viewModel = new ViewModelProvider(this).get(MyViewModel.class); 在Fragment中获取...ViewModel实例: viewModel = new ViewModelProvider(this).get(MyViewModel.class); 使用ViewModel 添加ViewModel...在Activity中,使用this作为ViewModelProvider的参数,在Fragment中,使用requireActivity()作为参数。
完成的: 方法 1: ViewModelProvider 是创建 ViewModel 的工具类: 示例程序 // 不带工厂的创建方式 val vm = ViewModelProvider(this)....ViewModel 实现原理分析 2.1 ViewModel 的创建过程 上一节提到,3 种创建 ViewModel 实例的方法最终都是通过 ViewModelProvider 完成的。...ViewModelProvider 可以理解为创建 ViewModel 的工具类,它需要 2 个参数: 参数 1 ViewModelStoreOwner: 它对应于 Activity / Fragment...创建 ViewModelProvider 工具类后,你将通过 get() 方法来创建 ViewModel 的实例。...ViewModelStore mViewModelStore; // 默认使用 NewInstanceFactory 反射创建 ViewModel public ViewModelProvider(
最终走如下两个分支 public static ViewModelProvider of(@NonNull Fragment fragment, @Nullable Factory factory) {...(application); } return new ViewModelProvider(ViewModelStores.of(fragment), factory);...} public static ViewModelProvider of(@NonNull FragmentActivity activity, @Nullable...(application); } return new ViewModelProvider(ViewModelStores.of(activity), factory);...} 可以看出都是新建ViewModelProvider, 参数为@NonNull ViewModelStore store, @NonNull Factory factory 分别看, 第二个参数两个方法是类似的
(ViewModelStores.of(activity), sDefaultFactory); } @MainThread public static ViewModelProvider...继续看 of 方法: return new ViewModelProvider(ViewModelStores.of(activity), sDefaultFactory) 出现了两个新的类ViewModelProvider...与ViewModelStores,先看ViewModelProvider: public class ViewModelProvider { private static final String...DEFAULT_KEY = "android.arch.lifecycle.ViewModelProvider.DefaultKey"; private final...至此ViewModelProviders of 做了哪些事情呢: 1、初始化了ViewModelProvider内部维护了 用于创建 VM 的 Factory,和用户存放 VM 的ViewModelStore
return of(activity, null); } public static ViewModelProvider of(@NonNull FragmentActivity activity...(application); } return new ViewModelProvider(ViewModelStores.of(activity), factory);...这个工厂是 ViewModelProvider 的静态内部类。...//ViewModelProvider.java public T get(@NonNull Class modelClass) {...,调用viewmodelprovider 的 get 方法从 hashmap 获取对用的 viewmodel。
对象 , 传入如下两个参数 : ViewModelStoreOwner 对象 , 就是 本 Activity 组件 ; ViewModelProvider.Factory 对象 , 通过调用...ViewModelProvider.AndroidViewModelFactory 函数 获取 ; 调用 ViewModelProvider#get 函数 , 获取自定义 ViewModel 类 ;...var viewModel: MyViewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application...获取数据模型 var viewModel: MyViewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory...获取数据模型 var viewModel: MyViewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory
ViewModelProviders.of(this).get(CommonViewModel.class)为入口,先看ViewModelProviders.of, //ViewModelProviders.java ViewModelProvider...of(FragmentActivity activity) { return of(activity, null); } ViewModelProvider of(FragmentActivity...(application); } //ViewModelStore用来存储ViewModel return new ViewModelProvider(activity.getViewModelStore...(), factory); } 这里只需知道ViewModelProviders.of得到了当前act的ViewModelProvider,接着看get方法, //ViewModelProvider.java...首先viewModel存储在mViewModelStore,而这个store是创建ViewModelProvider时传进来的,即activity.getViewModelStore(), //ComponentActivity.java
android.os.Bundle import android.view.View import android.widget.TextView import androidx.lifecycle.ViewModelProvider...获取布局组件 textView = findViewById(R.id.textView) // 获取 ViewModel myViewModel = ViewModelProvider...(this, ViewModelProvider.AndroidViewModelFactory(application)) .get(MyViewModel...关联时 , 开始绑定 ViewModel , Activity 组件中 绑定 ViewModel 代码如下 ; // 获取 ViewModel myViewModel = ViewModelProvider...(this, ViewModelProvider.AndroidViewModelFactory(application)) .get(MyViewModel
(this) .get(MyViewModel::class.java) //默认实现反射创建ViewModel实例 二,创建实例过程自定义返回ViewModel实例即可 ViewModelProvider...(this,object :ViewModelProvider.Factory{ override fun <T : ViewModel?...简要分析 首先创建ViewModelProvider实例,看下对应源码: public ViewModelProvider(@NonNull ViewModelStoreOwner owner, @NonNull...创建完ViewModelProvider后,调用get方法获取Viewmodel实例。...private static final String DEFAULT_KEY = "androidx.lifecycle.ViewModelProvider.DefaultKey
ViewModelProviders.of(this).get(Main3ActivityViewModel.class); 但是这个方法已经过时了,替代方法是 main3ActivityViewModel = new ViewModelProvider...你可能会说,我们直接new一个传过去不就行了吗,请记住这是万万不行的,因为如果我们使用直接实例化来创建ViewModel,那么ViewModel的生命周期就受Activity的影响了,所以为什么我们只能通过ViewModelProvider...我们需要借助ViewModelProvider.Factory来实现传参,新建Main3ActivityViewModelFactor继承自 ViewModelProvider.Factory,重写其onCreate...方法,如下所示: public class Main3ActivityViewModelFactory implements ViewModelProvider.Factory { @NonNull...return (T) new Main3ActivityViewModel(count); } 在Activity中获取实例的时候 采用如下方法 main3ActivityViewModel = new ViewModelProvider
(application); } return new ViewModelProvider(ViewModelStores.of(fragment), factory); } ViewModelProviders.of...() 方法帮我们在默认情况下构建了一个 AndroidViewModelFactory 工厂类,来帮助创建 ViewModel,并且返回了一个在当前 Activity 生命周期内的 ViewModelProvider...看下来发现我们 ViewModel 的 class 是传给了 ViewModelProvider.get() 方法。...来看看 get 方法: //ViewModelProvider @NonNull @MainThread public T get(@NonNull Class...回过去再仔细看一下,ViewModelProvider 的构建好像并不简单: new ViewModelProvider(ViewModelStores.of(fragment), factory);
领取专属 10元无门槛券
手把手带您无忧上云