【问题标题】:TextField onValueChanged not callingTextField onValueChanged 没有调用
【发布时间】:2021-11-26 15:47:39
【问题描述】:

我有一个只读的 TextField,它从 DatePicker 中获取值(不可组合)。 问题是当 TextField 的值改变时 onValueChange 回调不会调用。 当我尝试通过用户输入更改值时(使 readonly = false)我工作正常。 那么在没有用户输入的情况下调用 onValueChange 的任何解决方案? 一些代码:

val start = remember { mutableStateOf(state.timeStart) }

OutlinedTextField(
    value = DateTimeConverter.formatLogsTime(start.value),
    onValueChange = {
        start.value = DateTimeConverter.logDateToEpoch(it)!!
        onEvent(Logs.Event.TimeStartChanged(start.value))
    },
    colors = TextFieldDefaults.textFieldColors(
        backgroundColor = Color.White,
        unfocusedIndicatorColor = Color.Transparent,
        focusedIndicatorColor = Color.Transparent
    ),
    textStyle = textStyle,
    modifier = Modifier
        .fillMaxWidth()
        .padding(20.dp)
        .background(
                    LightLightGray,
                    RoundedCornerShape(8.dp)
         ),
         trailingIcon = {
             Icon(
                 Icons.Rounded.DateRange, "DateRange",
                 Modifier.clickable { createDateTimePicker(currentContext, start) })
         },
         readOnly = true
)

private fun createDateTimePicker(
    context: Context,
    dateHolder: MutableState<Long>
) {
    val calendar = Calendar.getInstance()
    val listener = OnDateSetListener { _, year, monthOfYear, dayOfMonth ->
        calendar.set(Calendar.YEAR, year)
        calendar.set(Calendar.MONTH, monthOfYear)
        calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth)
        val rawDate = "$dayOfMonth.$monthOfYear.$year 23:59:59"
        val newDate = DateTimeConverter.logDateToEpoch(rawDate)
        if (newDate != null)
            dateHolder.value = newDate
    }
    val picker = DatePickerDialog(context, listener, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH))
    picker.show()
}

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案1】:

    onValueChange 只能由TextField 调用。如果您手动更改 TextField 中的文本,您需要自己执行与回调中相同的操作。

    试试这个代码:

    // Inside Modifier.clickable
    createDateTimePicker(currentContext) { date ->
        start.value = date
        onEvent(Logs.Event.TimeStartChanged(start.value))
    }
    
    // Now your function will be
    private fun createDateTimePicker(
        context: Context,
        onDateChange: (Long) -> Unit
    ) {
        ...
        if (newDate != null)
            onDateChange(newDate)
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 2014-04-21
      • 2022-01-16
      相关资源
      最近更新 更多