【问题标题】:Flutter : How to add autofocus to dynamically created TextFormFields in flutter?Flutter:如何在 Flutter 中为动态创建的 TextFormFields 添加自动对焦?
【发布时间】:2020-11-30 06:54:40
【问题描述】:

我从后端获得动态数量的 TextFormFields。有些字段是必需的,有些则不是。因为它是动态的,所以我不能使用 FocusScope。我想要实现的是当用户点击下一个按钮时,焦点应该被重定向到空的必填字段。我怎样才能做到这一点?我无法提供代码。

【问题讨论】:

  • `FocusScope.of(context).nextFocus()` 会自动聚焦下一个字段,当onSubmitted一个文本字段的属性时放入里面,并且存在许多答案,以及你在使用时有什么限制FocusScope??贴一些代码
  • “因为它是动态的,所以我不能使用 FocusScope” - 我不明白你为什么不能使用 FocusScope - 也许你真的应该发布一个描述你的问题的最小代码
  • @Yadu 我想关注用户按下下一个按钮时为空的字段(仅需要)。动态意味着来自后端的字段数。
  • @pskink 我无法发布代码。
  • 这并不意味着你不能使用 FocusScope,我希望你将非必填字段的 enabled 属性设置为 false,代码在这里会很有帮助

标签: android flutter dart focus


【解决方案1】:

您可以使用此onEditingComplete,它将向您展示此示例:

注意:如果您创建了静态方法,只需将上下文传递给它。

它对我很有效。

TextField(
        
        controller: controller,
        keyboardType: type,
        autofocus: false,
        enableInteractiveSelection:  false,
        maxLength: maxLength,
        
        ///Using this :
        onEditingComplete: () => FocusScope.of(context).nextFocus(),

        decoration: InputDecoration(
            hintText: 'Enter text',
            border: InputBorder.none,
            counterText: "",
            contentPadding:
                EdgeInsets.symmetric(vertical: 18.0, horizontal: 24.0)),
      )

【讨论】:

  • 现在不优先关注下一个字段。当用户按下按钮时,关注空的必填字段。
【解决方案2】:

你应该总是发布一些代码,你去吧,我没试过


class MyTextFieldHolder {
  final controller = TextEditingController();
  final focusNode = FocusNode();

  Widget builder(context) {
    return TextField(
      focusNode: focusNode,
      controller: controller,
    );
  }
  
  dispose(){
    controller.dispose();
    focusNode.dispose();
  }
}

class MyForm extends StatefulWidget {
  final List<dynamic> fields;

  const MyForm({Key key, this.fields}) : super(key: key);
  @override
  _MyFormState createState() => _MyFormState();
}

class _MyFormState extends State<MyForm> {
  List<MyTextFieldHolder> _holders = [];

  @override
  void initState() {
    widget.fields.forEach((element) {
      _holders.add(MyTextFieldHolder());
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      child: ListView.builder(
        itemCount: _holders.length,
        itemBuilder: (context, i) {
          return _holders[i].builder(context);
        },
      ),
    );
  }
  
  bool _goToNextEmptyField(){
    for(final holder in _holders){
      if(holder.controller.text.isEmpty){
        holder.focusNode.requestFocus();
        return true;
      }
    }
    return false;
  }
}

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2021-07-11
    • 2020-10-14
    • 2021-10-07
    • 2020-04-28
    • 2021-06-15
    相关资源
    最近更新 更多