[英]Android databinding not triggered in jetpack compose android view
我正在嘗試將 Jetpack compose 與我們擁有的一些遺留代碼混合使用。 希望這將是一個簡單的修復,因為這是很少使用的應用程序的一部分。 手頭的問題是我正在嘗試將具有數據綁定的舊視圖添加到已經制作的撰寫視圖中
@SuppressLint("ViewConstructor")
class TimeAndDateScroller @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0,
timePickerViewModel: TimeAndDatePickerViewModel,
) : LinearLayout(context, attrs, defStyle) {
var binding: ViewTimePickerBinding? = null
init {
binding = ViewTimePickerBinding.inflate(LayoutInflater.from(context), this, true).apply {
this.viewModel = timePickerViewModel
}
}
}
AndroidView(
factory = {
TimeAndDateScroller(it, timePickerViewModel = viewModel).apply {
layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
}
}, update = {
}
)
據我所知,視圖 model 已正確傳遞。 但是視圖 model 中的值不會觸發監聽 xml 視圖
val isPickerEnabled: LiveData<Boolean> = selectedOption
.map {
it != TimeParamType.NOW
}
.asLiveData(Dispatchers.Main)
上面的值是在視圖model中找到的。但是對應的xml監聽器永遠不會被觸發
android:alpha="@{viewModel.isPickerEnabled() ? 1f : 0.4f}"
在 viewModel 中,您通常會添加:
val isPickerEnabledValue = ObservableField<Boolean>()
init {
isPickerEnabledValue.set(false)
}
然后這將根據活動/片段中的實時數據進行更新:
vm.isPickerEnabledLiveData.observe(this, isEnabled ->
vm.isPickerEnabledValue.set(isEnabled)
}
)
然后在 xml 中它將是:
android:alpha="@{viewModel.isPickerEnabledValue ? 1f : 0.4f}"
因此,由於這是與 compose 的混合,我們將使用 ObservableField 而不是:
var isPickerEnabledValue: State<Boolean> = stateOf(false)
然后在 Compose 中你可以使用:
AndroidView(
factory = {
viewModel.isPickerEnabledValue = viewModel.isPickerEnabledLiveData.observeAsState()
關鍵是你不能直接從實時數據中取出數據,必須通過某種方式觀察它,而 ObservableField 或 State 可以直接使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.