Kotlin+Databinding 自定義屬性踩坑記錄

Databinding搭配kotlin使用時與java有些區(qū)別,除了需要使用kapt依賴之外,由于kotlin沒有static的特性和null-safe檢查,還是踩了不少坑的,寫個博客記錄下。

業(yè)務(wù)場景:給ImageView添加一個自定義屬性imageUrl,處理網(wǎng)絡(luò)圖片加載,xml代碼如下:

    <ImageView
        android:id="@+id/title_img"
        android:layout_width="200mm"
        android:layout_height="100mm"
        android:background="#66ccff"
        android:scaleType="fitCenter"
        app:imageUrl="@{vm.logoUrl}"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

之前用java的時候是這么處理的:

public class ImageBinds {
    @BindingAdapter("imageUrl")
    public static void bindImgUrl(ImageView imageView, String url) {

        GlideApp.with(imageView.getContext())
                .load(url)
                .placeholder(R.drawable.ic_launcher_background)
                .fitCenter()
                .into(imageView);
    }
}

直接把這個文件Convert Java File to Kotlin File如下:

object ImageBinds {
    @BindingAdapter("imageUrl")
    fun bindImgUrl(imageView: ImageView, url: String) {

        GlideApp.with(imageView.context)
                .load(url)
                .placeholder(R.drawable.ic_launcher_background)
                .fitCenter()
                .into(imageView)
    }
}

編譯沒問題,啟動應(yīng)用報錯Caused by: java.lang.IllegalStateException: Required DataBindingComponent is null in class ActivityMainBinding. A BindingAdapter in com.shouzhan.quickpush.binding.ImageBinds is not static and requires an object to use, retrieved from the DataBindingComponent. If you don't use an inflation method taking a DataBindingComponent, use DataBindingUtil.setDefaultComponent or make all BindingAdapter methods static.

這是由于自動轉(zhuǎn)換成kotlin時丟失了static,給方法添加@JvmStatic注解后再次編譯運行,
這次報另一個錯誤,Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter url

這是由于url參數(shù)沒有做可空處理,最終修改后如下:

object ImageBinds {
    @BindingAdapter("imageUrl")
    @JvmStatic
    fun bindImgUrl(imageView: ImageView, url: String?) {

        GlideApp.with(imageView.context)
                .load(url)
                .placeholder(R.drawable.ic_launcher_background)
                .fitCenter()
                .into(imageView)
    }
}

編譯后正常運行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容