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

Aad*_*raj 3 java android android-viewmodel android-architecture-components

我知道为了将自定义参数传递给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 class
class 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);
Run Code Online (Sandbox Code Playgroud)

如何使用AndroidViewModel子类中的自定义参数以及应用程序上下文来实现相同的效果。喜欢

// MyAndroidViewModel class
    class MyAndroidViewModel extends AndroidViewModel {

      public MyViewModel(Application context, String id) {
         super(context);
         ...
      }
    }
Run Code Online (Sandbox Code Playgroud)

如何初始化MyAndroidViewModel以及ViewModelProvider.NewInstanceFactory如何在这里发挥作用?

Mos*_*jad 5

我以前遇到过这个问题,我通过这样做解决了它。在您的活动中创建您的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!");
            }
        };
Run Code Online (Sandbox Code Playgroud)

然后用它来创建您的ViewModel

viewModel = ViewModelProviders.of(this, factory).get(MyAndroidViewModel.class); 
Run Code Online (Sandbox Code Playgroud)

更新:

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

var factory = object : ViewModelProvider.Factory {
        override fun <T : ViewModel?> create(modelClass: Class<T>): T {
            return  SimpleAndroidViewModel(activity!!.application,
                "My string!") as T
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

private val viewModel: SimpleAndroidViewModel by lazy {
        ViewModelProvider(this, factory).get(SimpleAndroidViewModel::class.java)
    }
Run Code Online (Sandbox Code Playgroud)