如何创建可接收Int参数的Android ViewModel?
如何给ViewModel传递int类型参数(遵循Android最新ViewModel指南)
我正尝试创建一个可接收int类型参数的ViewModel类,遵循Android官网的最新指南。我的ViewModel代码如下:
public class TargetFragmentVM extends ViewModel { private int targetId; public TargetFragmentVM(int targetId) { this.targetId = targetId; } }我参考了官网的ViewModelInitializer示例,但不清楚如何将这种方式应用到我的场景中,实现传递int类型参数。
实现步骤
要通过ViewModelInitializer传递自定义int参数,核心是利用CreationExtras携带参数,具体实现如下:
1. 修改ViewModel类,添加Initializer和自定义参数Key
创建自定义ViewModelProvider.Key标识int参数,同时定义ViewModelInitializer从CreationExtras中取参并实例化ViewModel:
import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelInitializer; import androidx.lifecycle.ViewModelProvider; public class TargetFragmentVM extends ViewModel { // 自定义Key,用于在CreationExtras中传递int参数 public static final ViewModelProvider.Key<Integer> TARGET_ID_KEY = new ViewModelProvider.Key<>(); private final int targetId; public TargetFragmentVM(int targetId) { this.targetId = targetId; } // 定义ViewModel初始化器 public static final ViewModelInitializer<TargetFragmentVM> INITIALIZER = new ViewModelInitializer<>( TargetFragmentVM.class, creationExtras -> { // 从CreationExtras中取出targetId Integer targetId = creationExtras.get(TARGET_ID_KEY); if (targetId == null) { throw new IllegalArgumentException("必须提供targetId参数"); } return new TargetFragmentVM(targetId); } ); }
2. 在Fragment/Activity中获取ViewModel并传递参数
在需要获取ViewModel的位置,通过ViewModelProvider.Factory.from()的第二个参数,将int参数存入CreationExtras:
// 示例:从Fragment的arguments中获取targetId(也可以是其他来源的int值) int targetId = requireArguments().getInt("TARGET_ID"); // 创建包含参数的Factory ViewModelProvider.Factory factory = ViewModelProvider.Factory.from( TargetFragmentVM.INITIALIZER, extras -> extras.set(TargetFragmentVM.TARGET_ID_KEY, targetId) ); // 获取ViewModel TargetFragmentVM viewModel = new ViewModelProvider(this, factory).get(TargetFragmentVM.class);
关键说明
- 自定义
ViewModelProvider.Key是为了在CreationExtras中唯一标识参数,避免和系统内置Key冲突。 - 在Initializer中添加非空判断可确保参数不缺失,规避空指针异常。
- 该方式完全遵循Android官方推荐的
ViewModelInitializer模式,替代了传统自定义Factory类的写法。
内容的提问来源于stack exchange,提问作者Vadym Melnychenko
相关产品推荐
相关产品推荐

