android - 资源包装密封类,数据绑定错误
问题描述
我在使用Resource
环绕我的数据时遇到了一个小问题,我不知道如何在我的数据绑定中使用它。
密封类:
sealed class Resource<out T: Any> {
data class Success<out T: Any>(val data: T): Resource<T>()
data class Error(val exception: Throwable): Resource<Nothing>()
object Loading: Resource<Nothing>()
}
我有这个val product: LiveData<Resource<NetworkProductDetails>>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="my.package.ProductDetailsViewModel" />
</data>
<TextView
android:id="@+id/product_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{viewModel.product.productName}"
android:textAppearance="?attr/textAppearanceBody1"
android:gravity="center"/>
...
</layout>
我遇到了一个问题,因为viewModel.product
不是NetworkProductDetails
但是Resource<NetworkProductDetails>
我的 XML/Databinding 不知道如何处理它。
我找到了一种工作方式,但我想知道是否有更优雅的方式。
第一个解决方案:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="my.package.ProductDetailsViewModel" />
<variable
name="product"
type="my.package.NetworkProductDetails" />
</data>
<TextView
android:id="@+id/product_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{product.productName}"
android:textAppearance="?attr/textAppearanceBody1"
android:gravity="center"/>
...
</layout>
viewModel.product.observe(viewLifecycleOwner, Observer { it ->
when(it) {
is Resource.Success -> {
binding.product = it.data
}
}
}
第二种解决方案:
在我发表的评论中。
解决方案
我遇到了一个问题,因为 viewModel.product 不是 NetworkProductDetails 而是 Resource 并且我的 XML/Databinding 不知道如何处理它。
你错过了data
. 就算你清盘了Resource.Success
,productName
也不是财产,Resource
甚至Resource.Success
。data
是 的属性Resource.Success
,我假设这productName
是 的属性NetworkProductDetails
。你的表情没有data
。
您还需要教授有关其他两种情况(Loading
, Error
)的数据绑定以及在它们中做什么。
在最好的情况下,您可能能够像这样提取绑定表达式:
android:text='@{viewModel.product instanceof Resource.Success ? viewModel.product.data.productName : "like, whatever"}'
然而:
我不知道是否
instanceof
能很好地处理泛型我不知道你是否可以
LiveData
在一个表达式中引用输出两次
或者,您可以尝试创建一个绑定适配器来Resource<NetworkProductDetails>
处理这三种情况,尽管我从未尝试过使用泛型的类型。
推荐阅读
- mongodb - $add 仅支持数字或日期类型,不支持数组在 Mongoose 中递增时出错
- javascript - Jquery循环比较没有得到预期的结果
- javascript - 在 React 的组件构造函数中传递函数
- symfony - 一次执行多个请求时,Windows 上的 Doctrine 缓存问题
- javascript - 选项卡控件在 ASP.net MVC 中无法按预期工作
- ios - 如何在 swift 5 中过滤数组以在搜索栏中搜索文本?
- stm32 - STM32 HAL_I2C_Master_Transmit - 为什么我们需要转移地址?
- mysql - 如何在 mySQL 中删除小数点前的前导 0
- python - 使用 numpy trapz 将 2D 数据与 nans 集成
- spring - 对springboot postgres表进行分区