如果在下面的代码片段中,我通过单击
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)));
});},
),
],
)
作为其他人未来的参考:
它似乎没有取消,但是当单击
CupertinoSegmentedControl
时,后者没有获得焦点,因此 TextField
不会失去焦点。
单击选项卡时也是如此。由于我没有找到任何优雅的方法来将焦点从文本字段中移开,因此我决定使用更复杂的 BLoC 逻辑来解决这个问题。 TextFields 设置小部件的状态,单击按钮或选项卡会触发一个事件,发出一个状态,通知 BlocListener 将该选项卡的数据发送到 BLoC - 在 BLoC 发出信号以在肯定验证的情况下显示不同的选项卡之前