Bis*_*uit 2 android android-databinding sealed-class
我在使用数据包装时遇到了一个小问题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>()
}
Run Code Online (Sandbox Code Playgroud)
我有这个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>
Run Code Online (Sandbox Code Playgroud)
我遇到了一个问题,因为viewModel.product不是NetworkProductDetails但是Resource<NetworkProductDetails>,而且我的 XML/数据绑定不知道如何处理它。
我找到了一种工作方式,但我想知道是否有更优雅的方式。
第一个解决方案:
<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>
Run Code Online (Sandbox Code Playgroud)
viewModel.product.observe(viewLifecycleOwner, Observer { it ->
when(it) {
is Resource.Success -> {
binding.product = it.data
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二种解决方案:
在我发表的评论中。
我遇到了一个问题,因为 viewModel.product 不是 NetworkProductDetails 而是 Resource,而我的 XML/数据绑定不知道如何处理它。
你错过了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"}'
Run Code Online (Sandbox Code Playgroud)
然而:
我不知道是否instanceof能很好地处理通用问题
我不知道是否可以LiveData在一个表达式中两次引用输出
或者,您可以尝试创建一个绑定适配器来Resource<NetworkProductDetails>处理这三种情况,尽管我从未尝试过使用泛型的类型。
| 归档时间: |
|
| 查看次数: |
5319 次 |
| 最近记录: |