Борьба, чтобы получить тот же экземпляр ViewModel - PullRequest
0 голосов
/ 03 июня 2018

Я не уверен, правильно ли я понимаю архитектуру ViewModel в Android.Я полагаю, что жизненный цикл ViewModel связан с действием, поэтому мы ожидаем того же экземпляра, и не имеет значения, передаем ли мы контекст действия или фрагмента в ViewModelProvider?

В любом случае, вот мой ViewModel:

class MainViewModel : ViewModel() {
    var teamName: String = "Warriors";
}

Вот моя активность:

class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

        viewModel.teamName = "Cavaliers";
        Log.d("YouQi", "activity viewModel.teamName: ${viewModel.teamName}");

        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                    .replace(R.id.container, MainFragment.newInstance())
                    .commitNow()
        }
    }
}

и, наконец, вот мой фрагмент:

class MainFragment : androidx.fragment.app.Fragment() {
    companion object {
        fun newInstance() = MainFragment()
    }

    private lateinit var viewModel: MainViewModel

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        return inflater.inflate(R.layout.main_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        Log.d("YouQi", "fragment viewModel.teamName: ${viewModel.teamName}");
    }

}

Я получаю следующий вывод в Logcat:

2018-06-03 16:06:24.591 31124-31124/com.axzae.zapkotlin D/YouQi: activity viewModel.teamName: Cavaliers
2018-06-03 16:06:24.652 31124-31124/com.axzae.zapkotlin D/YouQi: fragment viewModel.teamName: Warriors

Показывает, что значение не обновлено до Cavaliers.я использую ViewModel неправильно и должен использовать Dagger для получения синглтона?

Ответы [ 2 ]

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

Нет, вам не нужно использовать внедрение зависимостей для достижения синглтона во ViewModel.Вы можете передать контекст активности в ViewModel следующим образом:

viewModel = ViewModelProviders.of(activity).get(MainViewModel::class.java)// by this you will get the same value of teamName as your activity
0 голосов
/ 03 июня 2018

Неважно, что ViewModelProvider вы используете - из активности или из фрагмента.Пожалуйста, попробуйте использовать ViewModelProviders.of(getActivity()) для фрагмента.

Это на самом деле очень удобно - вы можете сохранить модель, связанную с фрагментами, и более общую модель, связанную с деятельностью, отдельно.

...