6

我有一个像这样的密封类:

sealed class SealedClass {

    object Object1 : SealedClass()
    object Object2 : SealedClass()
    object Object3 : SealedClass()

    data class DataClass(val sealedClass: SealedClass, val anotherDataType: AnotherDataType? = null)
}

我想在 Bundle 中传递我的数据类,就像我们通常将值传递给一个新片段一样:

@JvmStatic
fun newInstance(dataClass: DataClass): Fragment {
    val fragment = Fragment()

    val args = Bundle(1)
    args.putParcelable("DATA_CLASS", dataClass)
    fragment.arguments = args

    return fragment
}

我不知道该怎么做。到目前为止,我所读到的是人们使用@Parcelize注释,这是我试图避免的 Kotlin 的一个实验性功能。另一种方法是通过 Parcelable 扩展数据类并实现 Parcelable 方法,但由于我使用自定义类作为 DataClass 中的参数(例如 SealedClass),我不知道如何在 Parcelable 实现中读取/写入这些值。这不是一个正确的方法吗?

4

3 回答 3

9

我认为现在使用最近使用Parcelable的 Kotlin 可以更简单:

@Parcelize
data class TimeSeries(
    val sourceInfo: SourceInfo? = null,
    val variable: Variable? = null,
    val values: List<Value_>? = null,
    val name: String? = null
) : Parcelable

然后在你的包中传递它:

val intent = Intent(context, DetailsActivity::class.java).apply {
   putExtra(MY_DATA, mydata[position])
}
context.startActivity(intent)

然后通过你的包把它带进来:

mydata = intent?.getParcelableExtra<TimeSeries>(MY_DATA)

如果您想传递 a Bundle,您也可以bundleOf(MY_DATA to mydata[position])在放置 Extra 时使用它,并intent?.getBundleExtra(MY_DATA)?.getParcelable<TimeSeries>(MY_DATA)在获取它时使用它,但看起来像添加另一层。

于 2020-09-25T17:35:39.857 回答
7

如果要将密封类转换为可包裹类,可以执行以下操作:

sealed class SealedClass : Parcelable {

    @Parcelize
    object Object1 : SealedClass()

    @Parcelize
    object Object2 : SealedClass()

    @Parcelize
    object Object3 : SealedClass()

    @Parcelize
    data class DataClass(val sealedClass: SealedClass, val anotherDataType: AnotherDataType? = null) : SealedClass()
}
于 2021-05-05T01:00:24.623 回答
3

在使用反射并导致更多垃圾收集时可序列化,更容易实现。

我发现使用 GSON 最简单。 https://github.com/google/gson

首先,将其添加到您的数据类中,如下所示:

data class TimeSeries(
    @SerializedName("sourceInfo")
    val sourceInfo: SourceInfo? = null,
    @SerializedName("variable")
    val variable: Variable? = null,
    @SerializedName("values")
    val values: List<Value_>? = null,
    @SerializedName("name")
    val name: String? = null
) : Serializable

然后在你的包中传递它:

val intent = Intent(context, DetailsActivity::class.java).apply {
            putExtra(MY_DATA, Gson().toJson(mydata[position]))
        }
        context.startActivity(intent)

然后通过你的包把它带进来:

mydata = Gson().fromJson(intent?.extras?.getString(MY_DATA), TimeSeries::class.java)
于 2019-08-08T03:31:46.107 回答