如何使用 Dagger2 将自定义对象从 activity class 传递到存储库 class?
How to pass a custom object from an activity class to a repository class using Dagger2?
这就是我在 `MyActivity class:
中观察数据的方式
@Module
public class MyActivity extends DaggerAppCompatActivity {
@Inject MyViewModelFactory factory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addData();
}
public void addData() {
//How to pass this custom object to ViewModel???
CustomClass obj = new CustomClass("CustomData");
MyViewModel viewModel = ViewModelProviders.of(this, factory).get(MyViewModel.class);
LiveData<Data> liveData = viewModel.getLiveData();
liveData.observe(this, this);
}
}
这是我的 ModelFactory
class:
@Singleton
public class MyViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
MyViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
Provider<? extends ViewModel> creator = creators.get(modelClass);
if (creator == null) {
for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) {
if (modelClass.isAssignableFrom(entry.getKey())) {
creator = entry.getValue();
break;
}
}
}
if (creator == null) {
throw new IllegalArgumentException("unknown model class " + modelClass);
}
try {
return (T) creator.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
这是我的 ViewModel
class:
public class MyViewModel extends ViewModel {
private LiveData<Data> dataLiveData;
private MyRepository repository;
@Inject
MyViewModel(MyRepository repository) {
this.repository = repository;
//I need it here!!!
dataLiveData = repository.addDataToLiveData(obj);
}
LiveData<Data> getLiveData() {
return dataLiveData;
}
}
这是我的 Repository
class:
@Singleton
public class MyRepository {
private MyApi myApi;
@Inject
MyRepository(MyApi myApi) {
this.myApi = myApi;
}
LiveData<Data> addDataToLiveData(CustomClass obj) {
myApi.getData(obj); //Make Api call and use obj
}
}
如何将 CustomClass
对象从 MyActivity
传递给 ViewModel
class?
在 ViewModel 中创建一个接受您的 CustomClass 对象的函数,并从 Activity 调用该函数。
public class MyViewModel extends ViewModel {
private LiveData<Data> dataLiveData;
private MyRepository repository;
@Inject
MyViewModel(MyRepository repository) {
this.repository = repository;
}
LiveData<Data> getLiveData() {
return dataLiveData;
}
public void setCustomObject(CustomObject customObj){
repository.addDataToLiveData(obj);
}
}
编辑:修正错误:
public void addData() {
//How to pass this custom object to ViewModel???
CustomClass obj = new CustomClass("CustomData");
MyViewModel viewModel = ViewModelProviders.of(this, factory).get(MyViewModel.class);
//ADD IT HERE
viewModel.setCustomObj(obj);
LiveData<Data> liveData = viewModel.getLiveData();
liveData.observe(this, this);
}
这就是我在 `MyActivity class:
中观察数据的方式@Module
public class MyActivity extends DaggerAppCompatActivity {
@Inject MyViewModelFactory factory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addData();
}
public void addData() {
//How to pass this custom object to ViewModel???
CustomClass obj = new CustomClass("CustomData");
MyViewModel viewModel = ViewModelProviders.of(this, factory).get(MyViewModel.class);
LiveData<Data> liveData = viewModel.getLiveData();
liveData.observe(this, this);
}
}
这是我的 ModelFactory
class:
@Singleton
public class MyViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
MyViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
Provider<? extends ViewModel> creator = creators.get(modelClass);
if (creator == null) {
for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) {
if (modelClass.isAssignableFrom(entry.getKey())) {
creator = entry.getValue();
break;
}
}
}
if (creator == null) {
throw new IllegalArgumentException("unknown model class " + modelClass);
}
try {
return (T) creator.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
这是我的 ViewModel
class:
public class MyViewModel extends ViewModel {
private LiveData<Data> dataLiveData;
private MyRepository repository;
@Inject
MyViewModel(MyRepository repository) {
this.repository = repository;
//I need it here!!!
dataLiveData = repository.addDataToLiveData(obj);
}
LiveData<Data> getLiveData() {
return dataLiveData;
}
}
这是我的 Repository
class:
@Singleton
public class MyRepository {
private MyApi myApi;
@Inject
MyRepository(MyApi myApi) {
this.myApi = myApi;
}
LiveData<Data> addDataToLiveData(CustomClass obj) {
myApi.getData(obj); //Make Api call and use obj
}
}
如何将 CustomClass
对象从 MyActivity
传递给 ViewModel
class?
在 ViewModel 中创建一个接受您的 CustomClass 对象的函数,并从 Activity 调用该函数。
public class MyViewModel extends ViewModel {
private LiveData<Data> dataLiveData;
private MyRepository repository;
@Inject
MyViewModel(MyRepository repository) {
this.repository = repository;
}
LiveData<Data> getLiveData() {
return dataLiveData;
}
public void setCustomObject(CustomObject customObj){
repository.addDataToLiveData(obj);
}
}
编辑:修正错误:
public void addData() {
//How to pass this custom object to ViewModel???
CustomClass obj = new CustomClass("CustomData");
MyViewModel viewModel = ViewModelProviders.of(this, factory).get(MyViewModel.class);
//ADD IT HERE
viewModel.setCustomObj(obj);
LiveData<Data> liveData = viewModel.getLiveData();
liveData.observe(this, this);
}