最后我想通了,
我没有在选择器小部件(子小部件)中创建 FocusNode,而是在父小部件(表单)中创建了 FocusNode,并将其提供给其构造函数中的子小部件,由此在父小部件中创建焦点节点语境。
然后,我向子小部件添加了一个请求焦点方法,以便父小部件可以调用它们并FocusScope.of(context).requestFocus(focusNode);在子小部件内部但在父小部件提供的 focusNode 上调用。
以下是部分代码:
子小部件:
class TimeTrackerTimePicker extends StatefulWidget {
final FocusNode focusNode;
TimeTrackerTimePicker({ this.focusNode});
//This can be called from the parent widget with the parent context
void requestFocus(BuildContext context){
print("${this.pickerName} requestFocus...");
FocusScope.of(context).requestFocus(focusNode);
}
....
....
@override
State<StatefulWidget> createState() {
return TimePickerState();
}
}
状态类:
class TimePickerState extends State<TimeTrackerTimePicker> {
@override
Widget build(BuildContext context) {
return Container(
....
child: new Flexible(
child: new TextFormField(
textInputAction: TextInputAction.next,
focusNode: widget.focusNode, //linking to the focusNode
onFieldSubmitted: onSubmitButtonClicked,
decoration: InputDecoration(
hintText: widget.hint != null ? widget.hint : "",
contentPadding:
EdgeInsets.fromLTRB(10.0, 10.0, 10.0, 10.0),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20.0))),
maxLines: 1,
controller: pickerController))
)
}
}
然后在需要设置焦点时在父窗口小部件中:
FocusNode focusNode;
TimeTrackerTimePicker timePicker;
@override
void initState() {
super.initState();
focusNode = new FocusNode();
timePicker = new TimeTrackerTimePicker(focusNode: focusNode);
}
.....
//request focus when required..
void requestPickerFocus(){
timePicker.requestFocus(context);
}