ViewModel для фрагмента

#android #android-activity #mvvm #fragment

#Android #android-активность #mvvm #фрагмент

Вопрос:

Я применяю шаблон MVVM в собственной разработке Android. У меня есть LoginActivity, и в нем будут размещены два разных фрагмента: LoginFragment и RegisterFragment. Я не уверен, что делать в этом случае. ViewModel для LoginActivity или две разные ViewModel для двух фрагментов. Если я создам одну ViewModel для activity, привязки и логики представления login и register будут смешиваться друг с другом. Но во многих руководствах разработчики говорят, что мы должны создавать одну viewmodel для каждого действия и получать доступ к этим viewmodels из fragment. Как я должен справиться с этим здесь?

Мой фрагмент входа в систему, если необходимо

 public class LoginFragment extends Fragment {
private LoginViewModel loginViewModel;

public LoginFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    FragmentLoginBinding fragmentLoginBinding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_login);
    loginViewModel = ViewModelProviders.of(this, new LoginViewModelFactory(getActivity().getApplication(),
            LoginRepository.getInstance())).get(LoginViewModel.class);
    fragmentLoginBinding.setViewModel(loginViewModel);
    fragmentLoginBinding.executePendingBindings();
    return inflater.inflate(R.layout.fragment_login, container, false);
}
} 
  

и LoginActivity

 public class LoginActivity extends AppCompatActivity {
private LoginViewModel loginViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    FragmentUtil.replaceFragment(getSupportFragmentManager(), R.id.entry_frame, new LoginFragment(), "login");
} 
}
  

Комментарии:

1. Я предпочитаю создавать две viewmodels, потому что экраны разные, имеют разные функции… если вы завершили какой-то процесс и он необходим для связи с действием, вы можете поделиться этой viewmodels и использовать livedata для уведомления о действии: закрыть, следующий шаг, предыдущий шаг и т.д.

Ответ №1:

Один из способов получить доступ к Activity ViewModel — это вызвать getActivity во фрагменте, затем преобразовать его в класс, который у вас есть, и получить доступ к ОБЩЕДОСТУПНОМУ свойству ViewModel.

Я не знаю вашего точного варианта использования, но я мог бы использовать несколько фрагментов и иметь репозиторий выше тех, в которых есть некоторая общая логика.

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

https://itnext.io/get-rid-of-fragment-activity-boilerplate-code-using-kotlin-1b103763baf8?sk=a4b037902f0fe4bfdec10cc9cc814426

Ответ №2:

На мой взгляд, вам следует создать две разные ViewModel. Потому что ViewModel предназначен для хранения и управления данными, связанными с пользовательским интерфейсом, в жизненном цикле действия или фрагмента. Сделайте это, чтобы помочь вам независимой и простой в управлении логикой.

Если вы хотите обмениваться данными между фрагментом и активностью или фрагментом и фрагментом, вы можете увидеть: