【问题标题】:Android databinding not triggered in jetpack compose android viewAndroid 数据绑定未在 Jetpack Compose Android 视图中触发
【发布时间】:2023-01-18 01:00:30
【问题描述】:

我正在尝试将 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 = {

    }
) 

视图模型和 XML

据我所知,视图模型已正确传递。但是视图模型中的值不会触发监听 xml 视图

val isPickerEnabled: LiveData<Boolean> = selectedOption
        .map {
            it != TimeParamType.NOW
        }
        .asLiveData(Dispatchers.Main)

上面的值在视图模型中找到。但是永远不会触发相应的 xml 侦听器

android:alpha="@{viewModel.isPickerEnabled() ? 1f : 0.4f}"

【问题讨论】:

    标签: android android-jetpack-compose android-databinding


    【解决方案1】:

    在 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()
    

    关键是你不能直接从live data中取出数据,必须通过某种方式观察它,而ObservableField或者State可以直接使用。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2022-07-29
      • 2020-12-29
      • 2016-10-30
      相关资源
      最近更新 更多