Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 表达式中ObservableFields上的get()_Android_Lambda_Data Binding_Kotlin_Android Databinding - Fatal编程技术网

Android 表达式中ObservableFields上的get()

Android 表达式中ObservableFields上的get(),android,lambda,data-binding,kotlin,android-databinding,Android,Lambda,Data Binding,Kotlin,Android Databinding,我有一个相当简单的数据绑定布局: <data> <variable name="viewModel" type="MyViewModel" /> <variable name="navigator" type="MyNavigator" /> </data> <Button android:layout_width="match_parent"

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

<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">
期望值:

当我单击按钮时,导航器将接收事件,并启动另一个活动但是,
保险?
始终为空

在布局中使用此表达式时(使用
.get()
):

所有操作均按预期进行,但我在构建时收到警告:

警告:警告:不要对表达式中的ObservasbleFields显式调用“get()”。这种支持很快就会被取消。”viewModel.insurance.get()'

这是Kotlin当前数据绑定实现中的一个bug吗?或者对于我为什么必须使用
observeField.get()
,还有其他解释吗

注:

  • 适用于Mac的AndroidStudio 3.0
  • BuildTools版本:27.0.3
  • android gradle插件:3.0.1
  • 科特林:1.2.21
它似乎与科特林无关

但在您的案例中,有人可能会争辩说,最好不要从XML层使用它

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

class Callbacks(val vm: MyViewModel, val navigator: MyNavigator) {
    fun buttonClicked() = navigator.goto(vm.insurance.get(), vm.title.get())
}
并调用此函数
onClick

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

谢谢我仍然想知道这个表达有什么不同。似乎99%的时间,对于我的代码库,我不需要
.get()
。但是由于某些原因,我确实需要它在这个表达式中。看来这个错误已经被修复了。
android:onClick="@{() -> navigator.goto(viewModel.insurance.get(), viewModel.title.get())}"
class Callbacks(val vm: MyViewModel, val navigator: MyNavigator) {
    fun buttonClicked() = navigator.goto(vm.insurance.get(), vm.title.get())
}
android:onClick="@{() -> callbacks.buttonClicked())}"