Обновление метки NavDestination во время выполнения

Я не могу обновить ярлык NavDestination во время выполнения. он отражает, но не с первого раза, когда я выхожу на экран, он не отражается мгновенно

Моя ViewModel

class PrepareOrderDetailsViewModel(
    brief: MarketHistoryResponse,
    private val ordersRepository: OrdersRepository
) : BaseViewModel() {

    private val _briefLiveData = MutableLiveData(brief)

    val orderIdLiveData: LiveData<Int?> =
        Transformations.distinctUntilChanged(Transformations.map(_briefLiveData) { it.id })
}

Наблюдение LiveData во фрагменте

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        registerObservers()
    }

    private fun registerObservers() {
        viewModel.orderIdLiveData.observe(viewLifecycleOwner, Observer {
            findNavController().currentDestination?.label = getString(R.string.prepare_order_details_title, it)
        })
    }

2 ответа

В соответствии с документацией Navigation UI, методы NavigationUI, такие как setupActionBarWithNavController() метод полагаться на OnDestinationChangedListener, который вызывается каждый раз, когда вы navigate() в новое место назначения. Вот почему метка не изменяется мгновенно - она ​​обновляется только при переходе к новому месту назначения.

Документация объясняет это для верхней панели приложения:

метка, которую вы прикрепляете к адресату, может автоматически заполняться из аргументов, предоставленных адресату, используя формат {argName} в вашем лейбле.

Это позволяет вам обновить ваш R.string.prepare_order_details_title быть в форме

<string name="prepare_order_details_title">Prepare order {orderId}</string>

Используя тот же аргумент в пункте назначения, ваш заголовок будет автоматически заполнен правильной информацией.

Конечно, если у вас нет аргумента, который вы могли бы определить заранее, тогда вы бы не хотели устанавливать android:label на вашем месте назначения и вместо этого вручную обновите заголовок панели действий и т. д. с этого места назначения.

Я нашел способ обойти эту проблему, открыв SupportActionBar сам и установить заголовок от имени лейбла

    private fun registerObservers() {
        viewModel.orderIdLiveData.observe(viewLifecycleOwner, Observer {
            (activity as AppCompatActivity).supportActionBar?.title =
                getString(R.string.prepare_order_details_title, it)

        })
    }
Другие вопросы по тегам