onFocusChange 事件似乎被 onValueChanged 事件取消了

问题描述 投票:0回答:1

如果在下面的代码片段中,我通过单击

TextField
留下
CupertinoSegmentedControl
,我希望首先调用
onFocusChange
TextField
事件,然后调用
onValueChanged
CupertinoSegmentedControl
事件.

但是,没有证据表明

onFocusChange
更改被调用,即使我在
onValueChanged
CupertinoSegmentedControl
之前放置计时器也不会。例如,
print
语句不会被执行。我做错了什么?

这种可能有趣的设置的原因:我有一个多页表单。我正在 BloC 内进行验证。特别是如果有人编辑任务,则可能会通过单击进度选项卡而不是“保存”和“继续”按钮来移动。因此,我认为支持这一点的最简单方法是当用户将焦点移开时保存每个 TextField 的数据。这工作正常,除非点击

CupertinoSegmentedControl

内的某个值
Column( // task type
  children: [
    Focus(child: TextField(
      controller: titleController,
      decoration: createDecoration("Title of task", widget.state.validationData.titleHelper),
      ),
      onFocusChange: (hasFocus) {
print("TASK TITLE has focus: $hasFocus");
        if (!hasFocus) {
          taskEditBloc.add(TaskEditDataEntered(taskData:
            widget.state.taskData!.copyWith(title: () => titleController.text)));
        }
      },
    ),
    CupertinoSegmentedControl(
      children: {
        0: const Text('A',),
        1: const Text('B',),
      },
      groupValue: taskType,
      onValueChanged: (value) {
        Timer(Duration(milliseconds: 200), () {
          taskEditBloc.add(TaskEditDataEntered(taskData:
            widget.state.taskData!.copyWith(taskType: () => value)));
        });},
    ),
  ],
)
flutter events
1个回答
0
投票

作为其他人未来的参考:

它似乎没有取消,但是当单击

CupertinoSegmentedControl
时,后者没有获得焦点,因此
TextField
不会失去焦点。

单击选项卡时也是如此。由于我没有找到任何优雅的方法来将焦点从文本字段中移开,因此我决定使用更复杂的 BLoC 逻辑来解决这个问题。 TextFields 设置小部件的状态,单击按钮或选项卡会触发一个事件,发出一个状态,通知 BlocListener 将该选项卡的数据发送到 BLoC - 在 BLoC 发出信号以在肯定验证的情况下显示不同的选项卡之前

© www.soinside.com 2019 - 2024. All rights reserved.