如何以编程方式将焦点设置到由自动完成小部件的 fieldViewBuilder 构建的 TextField?

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

尝试通过从 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();
                },
              ),
            );
          },
...
flutter autocomplete focus
1个回答
0
投票

您可以使用 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(....),
© www.soinside.com 2019 - 2024. All rights reserved.