Android 将 parcelable 放入 bundle 会引发类型不匹配

Android putting parcelable in bundle raises type mismatch

我正在尝试将 parcelable 放入要发送到导航组件的包中。我的数据 class 是,

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class Post(
    val name: String,

    val slug: String,

    val thumbnail:String
) : Parcelable

导航

<argument
    android:name="post"
    app:argType="com.example.blog.models.Post"
    app:nullable="true" />

视图模型变量

val post: MutableLiveData<List<Post>> by lazy { MutableLiveData<List<Post>>() }

// after api call, the body of the response which is a list of Post objects
// are attached to viewmodel.

post.postValue(response.body())

片段

// after observing the changes in the post variable in viewmodel,
// a bundle is created which is added to the navigation.. 

val bundle =  Bundle()
bundle.putParcelable("post", post.value)

错误

编辑

Type mismatch.
Required: Parcelable?
Found: List<Post>?

建造

Type mismatch: inferred type is List<Post>? but Parcelable? was expected

首先你需要使用 LiveData 来包装你的 MutableLiveData。

 fun getPosts(): LiveData<List<Post>> {
        return post
    }

您想传递给您的 Bundle 的是直接的 List,但包装在 List 的序列化实现中。这就是为什么下面的代码将 LiveData 的值包装在 ArrayList 中的原因。

因此,您可以这样做:

  bundle.putParcelableArrayList("post", arrayListOf(getPosts().value));

回读:

bundle.getParcelableArrayList("post") as List<Post>?