gpt4 book ai didi

安卓数据绑定(bind) : @BindingAdapter in Kotlin does not recognize lambdas

转载 作者:IT老高 更新时间:2023-10-28 13:38:36 31 4
gpt4 key购买 nike

这是我的 BindingAdapter:

@BindingAdapter(value = *arrayOf("bind:commentsAdapter", "bind:itemClick", "bind:avatarClick", "bind:scrolledUp"), requireAll = false)    
fun initWithCommentsAdapter(recyclerView: RecyclerView, commentsAdapter: CommentsAdapter,
itemClick: (item: EntityCommentItem) -> Unit,
avatarClick: ((item: EntityCommentItem) -> Unit)?,
scrolledUp: (() -> Unit)?) {
//Some code here
}

initWithCommentsAdapter 是顶级函数

这是我的布局(必不可少的部分):

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">

<data>
<variable
name="viewModel"
type="some.example.path.CommentsViewModel"/>
<variable
name="commentsAdapter"
type="some.example.path.CommentsAdapter"/>
</data>

<android.support.v7.widget.RecyclerView
...
bind:avatarClick="@{(item) -> viewModel.avatarClick(item)}"
bind:itemClick="@{viewModel::commentClick}"
bind:commentsAdapter="@{commentsAdapter}"
bind:isVisible="@{viewModel.commentsVisibility}"
bind:scrolledUp="@{() -> viewModel.scrolledUp()}"
/>
</layout>

当我在布局中为 lambda 分配 kotlin 方法调用时,在构建过程中出现这样的错误:

e: java.lang.IllegalStateException: failed to analyze: 
java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:cannot find method avatarClick(java.lang.Object)
in class some.example.path.CommentsViewModel
****\ data binding error ****

或者如果我通过引用分配方法:

e: java.lang.IllegalStateException: failed to analyze: 
java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Listener class kotlin.jvm.functions.Function1
with method invoke did not match signature of any method viewModel::commentClick
file:C:\Android\Projects\...\fragment_comments.xml
loc:70:12 - 83:17
****\ data binding error ****

但我有这样的方法,类型正确,而不是 Object

问题

如何在布局中为 Kotlin 中的自定义 @BindingAdapter 分配 Kotlin lambda?

编辑

viewModel的相关部分:

class CommentsViewModel(model: CommentsModel): BaseObservable() {
//Some binded variables here
...
fun commentClick(item: EntityCommentItem) {
//Some code here
}

fun avatarClick(item: EntityCommentItem) {
//Some code here
}
fun scrolledUp() {
//Some code here
}
...
}

变量绑定(bind)工作得很好

最佳答案

简答

不要使用 Kotlin 通用 lambda 类型,而是将 interfaces 与单个方法一起使用,该方法与您的方法引用 (itemClick) 或监听器 (头像点击)。您还可以使用具有单个抽象方法的抽象类,也可以使用匹配的参数和返回类型。

说明

其实是Databinding docs永远不要提到 Kotlin lambda 类型作为数据绑定(bind)监听器或方法引用工作,可能是因为这些 lambda 类型在底层转换为 Kotlin 的 Function1Function2... 它们是泛型的,因此它们的一些类型信息不会进入可执行文件,因此在运行时不可用。

为什么您的 scrolledUp 绑定(bind)确实有效?因为类型 () -> Unit 不需要泛型。它甚至可以使用 Runnable

代码

interface ItemClickInterface {
// method may have any name
fun doIt(item: EntityCommentItem)
}

@BindingAdapter(
value = ["commentsAdapter", "scrolledUp", "itemClick", "avatarClick"],
requireAll = false
)
fun initWithCommentsAdapter(
view: View,
commentsAdapter: CommentsAdapter,
scrolledUp: () -> Unit, // could have been Runnable!
itemClick: ItemClickInterface,
avatarClick: ItemClickInterface
) {
// Some code here
}

关于安卓数据绑定(bind) : @BindingAdapter in Kotlin does not recognize lambdas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46971445/

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