代码之家  ›  专栏  ›  技术社区  ›  Ali

导致Kotlin编译器错误的数据绑定

  •  1
  • Ali  · 技术社区  · 7 年前

    我在Bitbucket中有以下分支: https://bitbucket.org/ali-rezaei/tmdb/src/dataBinding/

    我被跟踪了 Kotlin compiler 生成项目时出错:

    e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
    

    错误与以下内容有关:

    app:visibleGone="@{isLoaded}"
    

    在以下布局中:

    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">
    
        <data>
            <variable
                name="isLoaded"
                type="boolean" />
        </data>
    
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".ui.MainActivity">
    
            <android.support.v4.widget.SwipeRefreshLayout
                android:id="@+id/swipe_refresh"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
                <android.support.v7.widget.RecyclerView
                    android:id="@+id/list"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    app:visibleGone="@{isLoaded}" />
    
            </android.support.v4.widget.SwipeRefreshLayout>
    
            <include
                layout="@layout/network_state_item"
                app:visibleGone="@{!isLoaded}" />
    
        </FrameLayout>
    
    </layout>
    

    1 回复  |  直到 7 年前
        1
  •  3
  •   Blackbelt    7 年前

    我要做的改变是:在这里

    <variable
            name="isLoaded"
            type="boolean" />
    

    boolean 我将传递一个VM实例

       <variable
            name="vm"
            type="com.sample.android.tmdb.ui.MovieViewModel" />
    

        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)
        mBinding?.setVariable(BR.vm, mViewModel)
        mBinding?.setLifecycleOwner(this)
    

    声明一个方法

      @BindingAdapter("visibleGone")
      fun View.visibleGone(visible: Boolean) {
          setVisibility(if (visible) View.VISIBLE else View.GONE)
      }
    

    申报 LiveData<Boolean> MovieViewModel 并将其连接到布局中。如。

     val loading: LiveData<Boolean>
    

           <android.support.v7.widget.RecyclerView
                android:id="@+id/list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:visibleGone="@{!safeUnbox(vm.loading)}" />
    
        2
  •  0
  •   Beast77    7 年前

    我有一个稍微不同的问题导致了这个错误。 在我的ViewModel中,我有以下方法:

    `fun onSkip() {
        _score.value = (_score.value)?.minus(1)
        nextWord()
    }`
    

    android:onClick="@{() -> gameViewModel.onSkip}" 
    
                     instead of
    

    android:onClick="@{() -> gameViewModel.onSkip()}"

    注意我是如何忘记在第一个方法中使用括号的。