【问题标题】:How to fix cannot find symbol view-model-name-BindingImpl when using two-way databinding in Android在Android中使用双向数据绑定时如何修复找不到符号view-model-name-BindingImpl
【发布时间】:2019-03-23 21:42:16
【问题描述】:

我正在使用 LiveDataViewModel 使用 Android 架构组件实现双向数据绑定,但是当我构建项目时它给出了

error: cannot find symbol
import package.[layout_name]BindingImpl;

DataBinderMapperImpl.java

我关注了官方文档并查看了 SO 以寻求答案,但他们都没有可行的解决方案。

已经试过this一和this

layout.xml

    <data>
        <import type="package.ViewModel" /> // this line was added from an answer but didn't work
        <variable
            name="model"
            type="package.ViewModel"/>
    </data>

// an input field I want to bind data with
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
                    android:id="@+id/email"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@={model.email}" // if I remove this line, builds fine
                    android:hint="@string/prompt_email"
                    android:inputType="textEmailAddress"
                    android:maxLines="1"
                    android:singleLine="true" />

AndroidViewModel 扩展我的ViewModel 而不是文档中提到的BaseObservable

ViewModel.kt

    private val email: MutableLiveData<String> by lazy { MutableLiveData<String>() }
    @Bindable // tried to change the return type to String, still no luck
    fun getEmail(): LiveData<String> {
        return email
    }

    fun setEmail(email: String) {
        this.email.value = email
    }

这就是我将ViewModelView 绑定的方式

Activity.kt

binding.model = ViewModelProviders.of(this, ViewModelProvider.AndroidViewModelFactory
            .getInstance(application))
            .get(LoginViewModel::class.java)

我错过了什么?已经包含了所有数据绑定前的东西,如果我用data class 替换了layout 中的ViewModel 并尝试从中获取数据,那效果很好,但是@{}layout

编辑

好的,所以当我将email 公开为public 时,它可以编译和绑定工作,但我无法使其设置器和获取器public,我的意思是当我尝试从它的获取器和设置器中公开它时,IDE说这些已经是privatefunctions,不能是overriden?

如何让这个属性通过functions 暴露?

【问题讨论】:

    标签: android android-databinding android-architecture-components android-jetpack


    【解决方案1】:

    我遇到了同样的问题,这里提供的解决方案都不起作用。 就我而言,问题是因为我有一个 Double 属性。

    我把它改成字符串,它工作了。

    【讨论】:

    • 这应该是公认的答案。我有一个 MutableLiveData 但它不工作。我将其更改为 MutableLiveData 并编译!谢谢!
    【解决方案2】:

    您可以使用 get() 方法直接使用特定变量的 getter 方法来变量 (也适用于 setter 作为 set(value) strong>) 如下所示:

    @get:Bindable // We make getter method bindable for data-binding
    val email = MutableLiveData<String>()
        get() { // Try to provide getter method like this
            return field as LiveData<String>
        }
        set(data) { // Try to provide setter method like this
            if(field.value != data.value) // To avoid infinite loop
                field.value = data.value
        }
    

    【讨论】:

    • 谢谢,但要让双向绑定起作用,您必须将该字段公开为 MutableLiveData 并将其设为默认值
    【解决方案3】:

    在 Reddit 上找到答案。

    要使双向数据绑定起作用,您必须公开您的字段,它们应该是MutableLiveData 之类的

    val email = MutableLiveData<String>()
    

    由于kotlin 已经有getset 属性,它们将被Binding 类用于字段

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 2019-06-29
      • 2020-02-28
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 2020-02-15
      • 2017-01-11
      • 2017-05-22
      相关资源
      最近更新 更多