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>?
我正在尝试将 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>?