gpt4 book ai didi

android - 在 Android 的导航架构组件中将复杂对象作为参数传递

转载 作者:行者123 更新时间:2023-12-02 13:22:17 25 4
gpt4 key购买 nike

我一直在寻找一些时间来研究 android 架构组件和最近的导航组件。

我正在尝试将对象作为参数传递,因此下一个 fragment 可以检索该数据,但为此我需要做以下两件事之一:

  • 通过一个 Bundle 传递它,这将使我实现该对象的 Parcelable 接口(interface)。
  • 使用我尝试过的“Safeargs”插件,它看起来像在后台使用 Bundles 并且无论如何都需要实现 Parcelable 接口(interface)。

  • 关于这些选项的事情是,我已经读过 Parcelable 使用反射,它在时间上可能会变得非常昂贵

    我也尝试构建一个“SharedMasterDetailsViewModel”,但没有运气,因为没有在我新创建的 fragment 上执行可观察的回调。 (我认为 LiveData 在我的 fragment 创建之前执行回调)

    这是一些关于我如何尝试处理此问题的代码

    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)
    }

    详情 fragment
    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 字符串并在我的 Detail fragment 的 onCreateActivity lyfecycle Hook 上重新解析该对象,但我觉得这不是正确的解决方案。

    在最坏的情况下,我只会传递对象的 id 并从网络重新获取它,但由于我已经有了想要显示的信息,所以我想将它作为参数传递。

    最佳答案

    TL;博士

    你不能。

    实际解释

    第一件事;以下声明

    The thing about these options is that I've read that Parcelable makes use of reflection and it can get quite expensive regarding time.



    是骗人的

    既然你实现了 Parcelable您只是提供有关如何使用基本原始类型进行序列化和反序列化的方法:IE: writeBytes , readBytes , readInt , writeInt .

    Parcelable不使用反射。 Serializable做!

    虽然这是真的,但您被迫使用 Parcelable jet brains 开发了一个非常有用的注释,它消除了必须编写名为 @Parcelize 的可打包实现的痛苦。 .

    示例用法:
    @Parcelize
    data class User(val username: String, val password: String) : Parcelable

    现在您无需编写任何 Parcelable 行即可传递类的实例。执行。

    更多信息 here

    关于android - 在 Android 的导航架构组件中将复杂对象作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53628730/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com