android - 传递稍后(不跟随)片段所需数据的最佳方式?
问题描述
我有一个应用程序需要在完成主要工作之前收集一些数据。因此,第一个片段收集数据,第二个片段收集数据,然后第三个片段使用数据。问题是:第一个片段中的数据与我在第二个片段中收集的数据不相关。如何将数据从第一个片段传递到第三个片段?我应该逐步传递在下一个片段参数中收集的所有数据,还是应该将它们存储在其他地方?我真的很想知道最佳实践是什么。
我不会使用数据库,因为我不需要永久存储数据。谢谢!
解决方案
至于任何最佳实践,最佳答案是“视情况而定”。
如果您的应用程序非常小且简单,那么可以在参数包中将数据从一个屏幕传递到另一个屏幕。
一种更复杂的方法是将数据存储在这些Fragment
生命周期之外的某个地方。这是您可以根据需要实施的一般规则。下面举几个例子:
- 数据可以存储在
Application
类级别。Application
类在所有应用程序生命周期中运行。每个片段都可以Application
从其活动中获取实例,例如activity?.getApplication()
. Activity
如果所有片段都在单个活动中运行,则数据可以存储在级别上。Activity
可以通过Fragment
使用activity
or获得requireActivity()
。- 如果所有片段都在此父片段中运行,则数据可以存储在父片段级别。可以使用
parentFragment
.
所有这些方法都假设您将一些“父”事物转换为特定的接口或实现。例如,如果您的片段在MainActivity
其中存储一些val data: Data
作为其属性运行,那么您应该像这样使用它:(requireActivity() as MainActivity).data
澄清几个流行的答案:
- 这
Shared ViewModel
只是活动级别方法的一个特例,因为ViewModel
实例存储在Activity
范围内。 - 与
SharedPrefrences
任何“数据库”方法一样,是应用程序级别方法的一种特殊情况,因为无论您在何处创建其实例,SharedPreferences 都存储在应用程序级别(在文件存储中)。(并且 SharedPreferences 会在应用程序启动时保留数据,因此这不是您的选择)
推荐阅读
- node.js - 我们可以用 knex 发布一个对象数组吗?
- sql - 无效的列名 - 表中的所有列
- jquery - 如何在 Vue.JS 中的 v-if 之后运行方法?
- python - Django 应用程序、功能和模型
- java - Parcelable 类不生成 Parcelable 对象
- sql - 设置 Form(subForm) 记录源等于 ComboBox
- ember.js - 将查询响应分配给模型字段时丢失大量 ember-data 类属性
- python-3.x - 如何在python 3中搜索文本文件
- c# - 在 MacOS 上对来自 .NET Core 的 HttpClient 调用进行身份验证
- c# - 程序如何使用非静态类库?