android - 在 Fragment 之间共享数据的更好方法是什么?

标签 android android-fragments android-architecture-components android-viewmodel android-safe-args

我想将一个 fragment 中的一些整数值共享到另一个 fragment 。我不想在设备更改配置时丢失数据。

因此,我遇到并想知道哪一种更适合我的用例的两种方法是:

1。分享ViewModel多个 fragment 之间

class SharedViewModel : ViewModel(){
    ...
}

class FragmentA : Fragment(){
    private val model: SharedViewModel by activityViewModels()
    ...
}

class FragmentB : Fragment(){
    private val model: SharedViewModel by activityViewModels()
    ...
}

2。使用 SafeArgs 和自定义的组合 ViewModelProvider.Factory

使用 SafeArgs 将数据作为参数传递到从一个 fragment (例如 A)到另一个 fragment (例如 B)的导航操作。实现ViewModel (参数化)和 ViewModelFactory fragment B 的类。将数据从 SafeArgs 传递到 ViewModelFactory 以创建 ViewModel(使用 ViewModelProvider )

类似这样的事情:

class B : Fragment() {

    //Seperate classes for ViewModelB & ViewModelFactoryB
    private lateinit var viewModel: ViewModelB
    private lateinit var viewModelFactory: ViewModelFactoryB

    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {

        val binding: BFragmentBinding = DataBindingUtil.inflate(
                inflater,
                R.layout.b_fragment,
                container,
                false
        )

        viewModelFactory = ViewModelFactoryB(BFragmentArgs.fromBundle(requireArguments()).data)
        viewModel = ViewModelProvider(this, viewModelFactoryB).get(ViewModelB::class.java)

        return binding.root
    }
}

最佳答案

这完全取决于您的用例、您在 fragment 之间共享哪些数据以及如何使用这些数据。

尽管这两种情况都支持传递自定义对象,但您必须考虑一些事情。

对于导航组件,关于自定义对象:

  • 数据必须是可打包的(首选)或可序列化的;
  • 使用 Bundle 对象传递的所有数据都有其自身的局限性,并且数据量较大时可能会导致 TransactionTooLargeException ( more about it )。使用共享 View 模型时可以轻松避免这种情况。

对于共享 View 模型:

  • 您必须定义新的类来包装您的模型;
  • 您必须添加新的类成员来保存共享 View 模型;
  • 共享 View 模型将占用内存,直到 Activity 完成或 View 模型存储被清除。

那么答案是什么?

这样的问题会导致固执己见的答案,但我考虑在 safe argument 之间进行选择时遵循一组提示。和 shared view model .

在以下情况下使用安全参数:

  1. 数据较小;
  2. 当您在使用此数据后不需要需要将结果返回到前一个 fragment 时;
  3. 您并不关心这些数据在使用完毕后是否会从内存中删除,并且每次都必须再次查询。

在以下情况下使用共享 View 模型:

  1. 数据相对较大,或者您认为它可能很大;
  2. 您有多个数据模型/集;
  3. 当您在使用此数据后确实需要将结果返回到前一个 fragment 时;
  4. 当数据查询成本高昂时。共享 View 模型通常与 Activity 一起存在。

关于android - 在 Fragment 之间共享数据的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63235825/

相关文章:

java - 刷新 Activity 中的方法

android - 使用 FFmpeg 将 Android 屏幕捕获为视频文件

android - ImageView 源缩放正确。如何?

Android:ViewPager 卡在 View 之间

android - 如何处理后退按钮转到特定 fragment ?

android - Webview Activity 崩溃

Android 架构组件 LiveData

android - 当 minifyenabled 为真时,Tesseract 错误 java.lang.NoSuchFieldError

android - 为什么当我导航回 fragment 时会调用 onChanged?

安卓房间数据库。如何将我的模型类添加到 Room 数据库中