Является ли ViewModel ответственным за обработку всех операций, связанных с данными / действия / фрагмента? - PullRequest
0 голосов
/ 18 октября 2019

Я недавно начал изучать компоненты архитектуры Android (LiveData, ViewModel и Navigation). Поэтому я создал нижнее навигационное приложение.

Я помещаю здесь некоторый пример кода, чтобы обсудить его в качестве примера.

Класс SampleViewModel: -

public class DashboardViewModel extends ViewModel {

    private MutableLiveData<String> mText;

    public DashboardViewModel() {
        mText = new MutableLiveData<>();
        mText.setValue("This is dashboard fragment");
    }

    public LiveData<String> getText() {
        return mText;
    }
}

SampleFragmentClass:-

public class DashboardFragment extends Fragment {

    private DashboardViewModel dashboardViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        dashboardViewModel = ViewModelProviders.of(this).get(DashboardViewModel.class);
        View root = inflater.inflate(R.layout.fragment_dashboard, container, false);
        final TextView textView = root.findViewById(R.id.text_dashboard);
        dashboardViewModel.getText().observe(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText(s);
            }
        });
        return root;
    }
}

Позвольте мне пояснить, что в этих фрагментах кода нет ничего плохого.

Я просто хочу задать несколько вопросов: -

  1. Является ли ViewModel полностью ответственным за загрузку данных, которые будут использоваться действием или фрагментом?

  2. Если мне нужно получить некоторые данные с сервера, я бы позвонилAPI из ViewModel или само действие?

  3. Если мне нужно выполнить какие-то действия на основе контекста, я бы сделал это в упражнении или фрагменте. Есть ли какое-то соглашение или рекомендация, что я должен делать это во ViewModel?

1 Ответ

1 голос
/ 18 октября 2019

Итак, позвольте мне начать с того, что это действительно хорошие вопросы. И я рад ответить.

  1. Это ДА, если вы следуете чистой архитектуре, например, MVVM (Model, View, ViewModel). Таким образом, в этой архитектуре ваши представления действительно глупы и ничего не знают о том, откуда поступают данные. Единственное, что они делают, это показывают данные, если они поступают. Единственная ответственность View - представлять данные, они не занимаются бизнесом или сетью. С другой стороны, ViewModel может быть единственным источником правды и иметь отношение один к одному с вашими представлениями (фрагмент, активность), а ViewModel поддерживает жизненный цикл и обрабатывает все сложные и тяжелые операции. Внутренне ваша модель представления может зависеть от вашего репозитория, который имеет внутренние зависимости от локального источника данных и удаленного источника данных. ДА, ViewModel должен быть единственным источником правды для ваших представлений (действий, фрагментов) для загрузки данных.

  2. Как я уже писал, ViewModel - это единственный источник правды, и он должен бытьодин вы можете получить данные с сервера или локального.

  3. Это зависит от. Если это больше связано с пользовательским интерфейсом работы, которая нуждается в контексте, вы можете сделать это в представлениях. Или, если это тяжелые вычисления, которые требуют контекста, такого как, например, чтение тысяч строк из локальной базы данных, вы можете сделать это во ViewModel. Чтобы получить контекстную ссылку в ViewModel или на более низком уровне, чем он, вы можете использовать DI, например, dagger или koin, чтобы избежать шаблонного кода.

Следующая диаграмма от Google является одной из известныхчтобы увидеть картину высокого уровня архитектуры MVVM. enter image description here

В этом небольшом ответе есть так много вещей, которые нужно уточнить. Я думаю, что если вы ознакомитесь с архитектурой MVVM, вы автоматически найдете все четкие ответы на свои вопросы и многое другое.

В Google размещается множество примеров приложений для MVVM, которые вы можете найти в следующем списке.

Примеры приложений от Google

...