Передача сложных объектов в качестве параметра в компоненте архитектуры навигации Android - PullRequest
0 голосов
/ 05 декабря 2018

Я некоторое время искал компоненты для Android-архитектуры и в последнее время для компонента Navigation.

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

  1. Пропустить его через Bundle, что заставит меня реализовать интерфейс Parcelable для этого объекта.
  2. Use the "Плагин Safeargs ", который я пробовал, и похоже, что он скрыт, использует Bundles и все равно требует реализации интерфейса Parcelable.

Что касается этих опций, я читал, чтоParcelable использует отражение, и это может стать довольно дорогим из-за времени


Я также попытался создать SharedMasterDetailsViewModel, но безуспешно, так как наблюдаемые обратные вызовы не выполняются для моего недавно созданного фрагмента.(Я думаю, что LiveData выполняет обратный вызов до создания моего фрагмента)

Вот некоторый код о том, как я пытался приблизиться к этому

SharedSessionViewModel

class SessionSharedViewModel : ViewModel() {


    var sharedSession: LiveData<Session> = MutableLiveData()
        private set

    fun setSession(data: Session) {
        val casted = this.sharedSession as MutableLiveData<Session>
        casted.postValue(data)
    }
}

MasterFragment

override fun onItemClicked(item: Session) {
    sessionSharedViewModel.setSession(item) // Item is a complex object of mine
    this@HomeFragment.findNavController().navigate(R.id.sessionDetailsFragment)
}

DetailsFragment

class SessionDetailsFragment : Fragment() {

    companion object {
        fun newInstance() = SessionDetailsFragment()
    }

    private lateinit var sharedViewModel: SessionSharedViewModel

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

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        Log.d("SESSIONDETAILS","created!")

        super.onActivityCreated(savedInstanceState)
        sharedViewModel = ViewModelProviders.of(this).get(SessionSharedViewModel::class.java)
        sharedViewModel.sharedSession.observe({this.lifecycle},{ handleUI(it!!)})
    }

    fun handleUI(sharedSession: Session) {
        Toast.makeText(activity, "This is inside new activity: ${sharedSession.title()}", Toast.LENGTH_SHORT)
    }
}

Моя последняя надежда - сериализациямой объект в строку JSON и повторно обработать этот объект на ловушке onCreateActivity lyfecycle моего фрагмента Detail, но я чувствую, что это не правильное решение.

В худшем случае scenerio я бы просто передал id объектаи повторно получить его из сети, но, поскольку у меня уже есть информация, которую я хочу показать, я хочу передать ее в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...