gpt4 book ai didi

android - 表达式中 ObservableFields 的 get()

转载 作者:行者123 更新时间:2023-11-29 01:04:00 26 4
gpt4 key购买 nike

我有一个相当简单的数据绑定(bind)布局:

<data>
<variable
name="viewModel"
type="MyViewModel" />

<variable
name="navigator"
type="MyNavigator" />
</data>

<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="@{() -> navigator.goto(viewModel.insurance, viewModel.title)}"
android:text="Click">

这是 Kotlin 中的 viewModel:

class MyViewModel {
val title = ObservableInt()
val insurance = ObservableField<Insurance?>()
}

这是 Kotlin 中的导航器:

class MyNavigator(private val activity: MyActivity) {

fun goto(insurance: Insurance?, @StringRes title: Int) {
if (insurance != null) {
val intent = OtherActivity.newIntent(activity, insurance,title)
activity.startActivity(intent)
} else {
Timber.w("goToClaimsQuestionsList but no insurance")
}
}
}

预期:

当我点击按钮时,Navigator 应该接收事件,并启动另一个 Activity 。 但是,insurance Insurance? 始终为 null

当我在布局中使用这个表达式时(使用 .get()):

android:onClick="@{() -> navigator.goto(viewModel.insurance.get(), viewModel.title.get())}"

一切正常,但我在构建时收到警告:

Warning:warning: Do not explicitly call 'get()' on ObservasbleFields in an expression. This support will be removed soon. 'viewModel.insurance.get()'

这是当前 Kotlin 数据绑定(bind)实现中的错误吗?或者是否有另一种解释为什么我必须使用 ObservableField.get()

注意:

  • 适用于 Mac 的 AndroidStudio 3.0
  • 构建工具版本:27.0.3
  • android gradle插件:3.0.1
  • kotlin版本:1.2.21

最佳答案

它似乎是一个 bugKotlin 无关。

但在您的情况下,有人可能会争辩说,最好不要从 XML 层使用它。

相反,您可以创建一个带有回调的变量来封装导航逻辑

class Callbacks(val vm: MyViewModel, val navigator: MyNavigator) {
fun buttonClicked() = navigator.goto(vm.insurance.get(), vm.title.get())
}

并调用此函数onClick

android:onClick="@{() -> callbacks.buttonClicked())}"

关于android - 表达式中 ObservableFields 的 get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48929493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com