Здесь я не спрашиваю о проблеме с кодом, а просто о архитектуре, я покажу, что я, конечно.
Так что я просто поиграл с этой архитектурой MVVM, я отображал список элементов, я нажимаю у элемента, который я вижу в деталях, есть много категорий в этих деталях, это означает, что, например, у меня были личные данные, отображаемые в одном просмотре карты, информация о его кредитной карте, например, в другом просмотре карты, и т. д. c .. Для некоторых пользователей которые подключены, данные кредитных карт не должны отображаться, но когда я создал модель представления в начале, это было так:
public class ContractViewModel extends ViewModel {
public MutableLiveData<ContractModel> contract = new MutableLiveData<ContractModel>();
public MutableLiveData<Boolean> isLoading = new MutableLiveData<Boolean>();
public MutableLiveData<Boolean> error = new MutableLiveData<Boolean>();
@Inject
ContractService contractService;
CompositeDisposable disposable = new CompositeDisposable();
public ContractViewModel(){
DaggerContractApiComponent.create().inject(this);
}
public void call(SingleContractRequest singleContractRequest){
fetchContract(singleContractRequest);
}
public void fetchContract(SingleContractRequest singleContractRequest){
isLoading.setValue(true);
disposable.add(
contractService.getContract(singleContractRequest)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver<ContractModel>() {
@Override
public void onSuccess(ContractModel contractModel) {
isLoading.setValue(false);
error.setValue(false);
contract.setValue(contractModel);
}
@Override
public void onError(Throwable e) {
error.setValue(true);
isLoading.setValue(false);
e.printStackTrace();
}
})
);
}
@Override
protected void onCleared(){
super.onCleared();
disposable.clear();
}
}
Но теперь мне нужна роль подключенного пользователя в приложении для отображения возможные данные, которые он может проконсультировать. Первой мыслью, которая пришла мне в голову, был просто вызов службы, которая возвращает мой userConnected.
public class ContractViewModel extends ViewModel {
public MutableLiveData<ContractModel> contract = new MutableLiveData<ContractModel>();
public MutableLiveData<UserConnected> userConnected = new MutableLiveData<UserConnected>();
public MutableLiveData<Boolean> isLoading = new MutableLiveData<Boolean>();
public MutableLiveData<Boolean> error = new MutableLiveData<Boolean>();
@Inject
ContractService contractService;
@Inject
UserConnectedService userConnectedService;
CompositeDisposable disposable = new CompositeDisposable();
public ContractViewModel(){
DaggerContractApiComponent.create().inject(this);
DaggerUserConnectedApiComponent.create().inject(this);
}
public void call(SingleContractRequest singleContractRequest){
fetchContract(singleContractRequest);
}
public void getUserConnected(){
disposable.add(
userConnectedService.getUserConnected()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver<UserConnected>() {
@Override
public void onSuccess(UserConnected userConnectedParams) {
userConnected.setValue(userConnectedParams);
}
@Override
public void onError(Throwable e) {
}
})
);
}
public void fetchContract(SingleContractRequest singleContractRequest){
isLoading.setValue(true);
disposable.add(
contractService.getContract(singleContractRequest)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver<ContractModel>() {
@Override
public void onSuccess(ContractModel contractModel) {
isLoading.setValue(false);
error.setValue(false);
contract.setValue(contractModel);
}
@Override
public void onError(Throwable e) {
error.setValue(true);
isLoading.setValue(false);
e.printStackTrace();
}
})
);
}
@Override
protected void onCleared(){
super.onCleared();
disposable.clear();
}
}
Но это не чисто, я должен вызывать два метода одновременно в своей Деятельности, что ужасно, Вторая мысль заключается в том, что мне нужно отредактировать мой contract
тип с MutableLiveData<ContractModel>
на что-то вроде MutableLiveData<NewModel>
, зная, что эта архитектура NewModel выглядит следующим образом:
public NewModel {
ContractModel contractModel;
UserModel userModel;
// ofc here a constuctor and getters and setters
}
Но это тоже проблема, что будет вызвано в бэкэнде, потому что, если мне нужно, чтобы userConnected в другой деятельности? Мне нужно будет написать похожий код в нескольких местах, чтобы подключить этого пользователя, но я хочу получить его один раз.
Любая помощь, мысли были бы очень полезны.