Как использовать навигацию Android без привязки к пользовательскому интерфейсу во ViewModel (MVVM)? - PullRequest
0 голосов

Я использую навигацию Android, которая была представлена ​​на Google I / O 2018, и кажется, что я могу использовать ее, привязав к некоторому представлению или используя NavHost, чтобы получить его из Fragment.Но мне нужно перейти к другому конкретному представлению из ViewModel из моего первого фрагмента в зависимости от нескольких условий.Для ViewModel я расширяю AndroidViewModel, но не могу понять, что делать дальше.Я не могу разыграть getApplication во Фрагмент / Активность и не могу использовать NavHostFragment.Также я не могу просто привязать навигацию к onClickListener, потому что startFragment содержит только один ImageView.Как мне перейти от ViewModel?

class CaptionViewModel(app: Application) : AndroidViewModel(app) {
private val dealerProfile = DealerProfile(getApplication())
val TAG = "REGDEB"


 fun start(){
    if(dealerProfile.getOperatorId().isEmpty()){
        if(dealerProfile.isFirstTimeLaunch()){
            Log.d(TAG, "First Time Launch")
            showTour()
        }else{
            showCodeFragment()
            Log.d(TAG, "Show Code Fragment")

        }
    }
}

private fun showCodeFragment(){
    //??
}

private fun showTour(){
    //??
}

}

Мой фрагмент

class CaptionFragment : Fragment() {
private lateinit var viewModel: CaptionViewModel
private val navController by lazy { NavHostFragment.findNavController(this) }

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
    viewModel = ViewModelProviders.of(this).get(CaptionViewModel::class.java)
    return inflater.inflate(R.layout.fragment_caption, container, false)
}


override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    viewModel.start()

}

}

Я хочу сохранить логику навигации во ViewModel

1 Ответ

0 голосов
/ 07 июня 2018

Как мне перейти из ViewModel?

Ответ, пожалуйста, не надо.ViewModel предназначен для хранения и управления данными, связанными с пользовательским интерфейсом.

Новый ответ

В моих предыдущих ответах я говорил, что мы не должны переходить из ViewModel, и причина в том, что для навигации ViewModel должна иметь ссылки на Activity/ Фрагменты, которые я считаю (возможно, не самыми лучшими, но все же верю в это) никогда не являются хорошей идеей.

Но в рекомендуемой архитектуре приложений от Google упоминается, что мы должны управлять пользовательским интерфейсом измодель .И после того, как я подумаю, что они имеют в виду под этим?

Итак, я проверил пример из "android-Architecture" и нашел интересный способ, как Google это сделал.

Пожалуйста, проверьте здесь: todo-mvvm-databinding

Оказывается, они действительно управляют пользовательским интерфейсом модели .Но как?

  1. Они создали интерфейс TasksNavigator , который в основном просто навигационный интерфейс.
  2. Затем в TasksViewModel у них есть этоссылка на TaskNavigator, чтобы они могли управлять пользовательским интерфейсом без прямой ссылки на действия / фрагменты.
  3. Наконец, TasksActivity реализовала TasksNavigator для предоставления подробных сведений о каждом действии навигации, а затем установила для навигатора значение TasksViewModel.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...