Объект LiveData Observer никогда не вызывается - PullRequest
0 голосов
/ 08 июля 2019

У меня есть Activity, в которой есть фрагмент с моделью представления.Активность должна иметь возможность обновлять значение объекта liveata так же, как и фрагмент.

Я объявил свою ViewModel для фрагмента следующим образом:

class BottomNavViewModel:ViewModel() {
    var isConnected = MutableLiveData<Boolean>()
}

В BottomNavFragment у меня есть этот код для объявления ViewModel

    private val viewModel: BottomNavViewModel by lazy { ViewModelProviders.of(this).get(BottomNavViewModel::class.java) }

Несколько строк ниже этогоУ меня есть это:

private val changeObserver = Observer<Boolean> { value ->
    value?.let {
        Timber.i("Update of isConnected received. Updating text field now")

        if(it) {
            connectedText.text = getString(R.string.connected)
            connectedText.setTextColor(activity!!.getColor(R.color.colorSelectedGreen))
        }
        else {
            connectedText.text = getString(R.string.not_connected)
            connectedText.setTextColor(activity!!.getColor(R.color.off_red))
        }
    }

    ...

    override fun onAttach(context: Context) {
    super.onAttach(context)
    if (context is BottomNavFragment.OnFragmentInteractionListener) {
        listener = context
    }
    else {
        throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener")
    }

    viewModel.isConnected.observe(this, changeObserver)
}

Этот Наблюдатель никогда не получает удар.

В моей деятельности у меня есть это:

    private var sharedBottomNavViewModel:BottomNavViewModel? = null

    ...

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_connection)

    sharedBottomNavViewModel = ViewModelProviders.of(this).get(BottomNavViewModel::class.java)

    ...
    override fun onResume() {
    super.onResume()

    startBackgroundThread()
    checkCameraPermission()

    //TODO: Change this to listen for a connection
    sharedBottomNavViewModel?.let {
        Timber.i("Updating isConnected to true now")
        it.isConnected.value = true
    }
}

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

Может кто-нибудьскажи мне, что я делаю не так, пожалуйста?

1 Ответ

1 голос
/ 08 июля 2019

Ваши 2 модели просмотра не совпадают.Вы создаете модель представления и передаете владельца жизненного цикла, и в одном случае вы указываете фрагмент, а в другом - действие.

Измените свой фрагмент следующим образом:

private val viewModel: BottomNavViewModel by lazy { ViewModelProviders.of(activity).get(BottomNavViewModel::class.java) }

Будьте осторожныгде вы инициализируете модель представления, хотя activity (getActivity()) равно nullable.

Edit: (credit Ian Lake) Или, если вы используете артефакты fragment-ktx, вы можете сделать это

private val viewModel: BottomNavViewModel by activityViewModels()
...