【问题标题】:Two-way binding cannot resolve a setter for java.lang.String property双向绑定无法解析 java.lang.String 属性的设置器
【发布时间】:2016-08-25 20:20:15
【问题描述】:

我正在使用 Android Studio 2.1 AFIK 中引入的数据绑定 API 的双向绑定。

我收到了这个有趣的错误:

错误:任务“:app:compileDebugJavaWithJavac”执行失败。
> java.lang.RuntimeException:发现数据绑定错误。
****/ 数据绑定错误 ****msg:无法反转表达式 address.street:双向绑定无法解析 java.lang.String 属性“street”的设置器
文件:/path/to/layout.xml
地点:34:37 - 34:50 ****\数据绑定错误****

当我尝试用谷歌搜索该错误时,我发现一个 4 天前的日本 Twitter 帖子来自一个为此哭泣的人...

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/edit_hint_zip"
    android:text="@={address.zip}"
    tools:text="12345"/>

address.zip 是 String。我猜这里的问题是CharSequence 与String 作为EditText.getText() 的返回值。

我的想法是定义它,但这对我不起作用:

@NonNull
@InverseBindingAdapter(attribute = "text")
public static String getText(EditText edit) {
    return edit.getText().toString();
}

我错过了什么?

【问题讨论】:

    标签: android android-databinding two-way


    【解决方案1】:

    如果您正在使用 kotlin ,请确保用于双向绑定的数据类字段声明为 var。如果是val无法支持双向绑定

    【讨论】:

    • 这对我有用,但是你提供了额外的信息,为什么数据绑定对 val 属性不起作用
    • 在 Kotlin Val 中意味着静态。 Var 表示非静态的。在数据绑定中,变量值可能会改变,因此必须声明为 var。
    • 在 Kotlin 中 val 并不意味着静态,而是意味着最终。我认为从双向绑定的角度来看,将类属性声明为 var 确实有意义,因为您确实希望它们的属性发生变化。
    【解决方案2】:

    根据数据绑定官方 repo https://android.googlesource.com/platform/frameworks/data-binding/ 提交消息,此错误已在 Android Studio 2.2 preview 3 中修复。

    【讨论】:

    • 你能链接你正在谈论的提交吗?我看到只有一个 8 周前推送的提交,这似乎不相关。
    • 你的意思是提交0137f2?
    • 是的,我也在不同版本的Android Studio上测试过。
    【解决方案3】:

    这个 bug 非常丑陋,完全是数据绑定 API 中的一个 bug。解决方案是生成一个setter和一个getter。我很快就想到了创建一个 setter,而不是创建一个 getter。

    这是我的简化模型:

    public class Address {
        public String street;
    
        public void setStreet(String street) {
            this.street = street;
        }
    
        public String getStreet() {
            return street;
        }
    }
    

    您可能会注意到,getter 和 setter 是无用的,但对于双向绑定是必需的。

    如果您认为这是 API 的错误,请为我的错误报告加注星标:Two-way binding required setters AND ALSO getters

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2017-07-02
      • 1970-01-01
      • 2011-09-11
      • 2012-07-20
      • 2019-09-05
      • 1970-01-01
      相关资源
      最近更新 更多