You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可接收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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:01:20