Проблема с архитектурой MVVM при попытке получить детали моего предмета? - PullRequest
1 голос
/ 13 апреля 2020

Здесь я не спрашиваю о проблеме с кодом, а просто о архитектуре, я покажу, что я, конечно.

Так что я просто поиграл с этой архитектурой 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 в другой деятельности? Мне нужно будет написать похожий код в нескольких местах, чтобы подключить этого пользователя, но я хочу получить его один раз.

Любая помощь, мысли были бы очень полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...