尝试通过从 AutoComplete 的 fieldViewBuilder 函数中提取 FocusNode 来为 TextField 提供输入焦点。为此,我需要在 fieldViewBuilder 函数内进行 setState 调用,但这似乎不起作用。我能做什么?
...
FocusNode? myFocusNode;
@override
Widget build(BuildContext context) {
myFocusNode?.requestFocus();
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
_networkEnabled
? 'Network is on, toggle to induce network errors.'
: 'Network is off, toggle to allow requests to go through.',
),
Switch(
value: _networkEnabled,
onChanged: (bool? value) {
setState(() {
_networkEnabled = !_networkEnabled;
});
},
),
const SizedBox(
height: 32.0,
),
Autocomplete<String>(
fieldViewBuilder: (BuildContext context,
TextEditingController controller,
FocusNode focusNode,
VoidCallback onFieldSubmitted)
{
setState(() {
myFocusNode = focusNode;
});
return Padding(
padding: const EdgeInsets.all(12.0),
child: TextFormField(
decoration: InputDecoration(
border: const OutlineInputBorder(),
errorText:
_networkError ? 'Network error, please try again.' : null,
),
controller: controller,
focusNode: focusNode,
onFieldSubmitted: (String value) {
onFieldSubmitted();
},
),
);
},
...
您可以使用 postframeCallback 将焦点集中在
Autocomplete
。
FocusNode? focusNode;
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) {
focusNode?.requestFocus();
});
super.initState();
}
并使用
Autocomplete<String>(
fieldViewBuilder: (BuildContext context,
TextEditingController controller,
FocusNode f,
VoidCallback onFieldSubmitted) {
focusNode ??= f;
return Padding(....),