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)
}
}
編譯后正常運行