правильная реализация MVVM - PullRequest
       3

правильная реализация MVVM

0 голосов
/ 26 октября 2019

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

МойСомнение заключается в следующем:

должен ли макет XML быть «присоединен» к Activity / Fragment или ViewModel? Каким должен быть правильный подход?

1) Прикрепленный к Деятельности:

В моем XML:

<data>
       <variable
            name="mainView"
            type="com.test.mymvvmapp.MainActivity" />
</data>
...
<Button ... android:onClick="@{()-> mainView.doSomething()}"/>
<TextView ... android:text="@{mainView.someText}" />

В моем Деятельности:

public class MainActivity extends AppCompatActivity {

    public MutableLiveData<String> someText = new MutableLiveData<String>();
    public MainViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setMainView(this);
        binding.setLifecycleOwner(this);

        viewModel = ViewModelProviders.of(this).get(MainViewModel.class);
        viewModel.someText.observe(this, new Observer<String>() {
            @Override
            public void onChanged(String str) {
                someText.setValue(str);
            }
        });


    }

    public void doSomething() {
        viewModel.doSomething();
    }
}

Это кажется мне самым чистым MVVM, наиболее логичным и правильным подходом.

2) Прикреплено к ViewModel:

В моем XML:

<data>
       <variable
            name="mainViewModel"
            type="com.test.mymvvmapp.MainViewModel" />
</data>
...
<Button ... android:onClick="@{()-> mainViewModel.doSomething()}"/>
<TextView ... android:text="@{mainViewModel.someText}" />

В моемУпражнение:

public class MainActivity extends AppCompatActivity {

    public MainViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setMainView(this);
        binding.setLifecycleOwner(this);

    }

}

Я не уверен с этим, потому что кажется, что у Задания нет цели. Но я бы сказал, что большинство учебных пособий и примеров, которые я видел, используют этот подход.

Чтобы сделать вещи более сложными, я видел примеры, которые используют оба подхода одновременно, делая это в XML:

<data>
       <variable
            name="mainView"
            type="com.test.mymvvmapp.MainActivity" />
       <variable
            name="mainViewModel"
            type="com.test.mymvvmapp.MainViewModel" />
</data>
...
<Button ... android:onClick="@{()-> mainView.doSomething()}"/>
<TextView ... android:text="@{mainViewModel.someText}" />

Итак, наконец, каков правильный подход? Есть ли «правильный» ответ или все они правильные и зависят от разных вещей?

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