为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Factory 将自定义参数传递给 ViewModel?

如何使用 Factory 将自定义参数传递给 ViewModel?

慕尼黑5688855 2022-01-06 17:50:46
我知道为了将自定义参数传递给ViewModel,我们可以使用ViewModelProvider.NewInstanceFactory,像这样:// Factory Class    class MyFactory extends ViewModelProvider.NewInstanceFactory {        private final String mId;        public MyFactory(String id) {            mId = id;        }        @NonNull        @Override        public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {            return (T) new MyViewModel(mId);        }    }// MyViewModel classclass MyViewModel extends ViewModel {  public MyViewModel(String id) {     ...  }}// Activity I can Initialise as: MyFactory modelFactory = new MyFactory(id);viewModel = ViewModelProviders.of(this, modelFactory).get(MyViewModel.class);如何使用AndroidViewModel子类中的自定义参数以及应用程序上下文实现相同的效果。喜欢// MyAndroidViewModel class    class MyAndroidViewModel extends AndroidViewModel {      public MyViewModel(Application context, String id) {         super(context);         ...      }    }如何初始化MyAndroidViewModel以及ViewModelProvider.NewInstanceFactory如何在这里发挥作用?
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

我以前遇到过这个问题,我通过这样做来解决它。在您的活动中,创建您的ViewModel工厂,如下所示:


//Inside MyActivity

ViewModelProvider.Factory factory = new ViewModelProvider.Factory() {

            @NonNull

            @Override

            public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {

                return (T) new MyAndroidViewModel(getApplication(),

                        "My string!");

            }

        };

然后用它来创建你的ViewModel:


viewModel = ViewModelProviders.of(this, factory).get(MyAndroidViewModel.class); 

更新:


由于ViewModelProviders该类已被弃用,更新后的答案如下。工厂和以前一样,只是换成了 Kotlin。


var factory = object : ViewModelProvider.Factory {

        override fun <T : ViewModel?> create(modelClass: Class<T>): T {

            return  SimpleAndroidViewModel(activity!!.application,

                "My string!") as T

        }

    }

但是,我们创建 ViewModel 实例的行已经改变,现在我们正在使用ViewModelProvider该类。


private val viewModel: SimpleAndroidViewModel by lazy {

        ViewModelProvider(this, factory).get(SimpleAndroidViewModel::class.java)

    }


查看完整回答
反对 回复 2022-01-06
  • 1 回答
  • 0 关注
  • 200 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信