[Flutter/Dart]:如何动态更改表单中 TextFormField 的键盘类型?

awa*_*air 7 dart flutter

我有一个小部件,它呈现 TextFormFields 的 ListView 以输入数据。但是,我想动态更改其中一个文本字段的键盘类型。以下是小部件的概述:


class CreateTodo extends StatefulWidget {
  @override
  _CreateTodoState createState() => _CreateTodoState();
}

class _CreateTodoState extends State<CreateTodo> {
  final _formKey = GlobalKey<FormState>();
  final double formWidth = 175.0;

  final Map<String, Icon> itemsMap = {
    'Heading': Icon(Icons.title),
    'Description': Icon(Icons.edit),
    'Date': Icon(Icons.calendar_today)
  };

  final items = ['Heading', 'Description', 'Date'];

  _changeKeyboardType(entry) {
    if (entry == "Description") {
      return TextInputType.multiline;
    }

    return TextInputType.text;
  }

  ListView createListItems() {
    return ListView.builder(
      padding: EdgeInsets.only(
        left: 50.0,
        right: 50.0,
        top: 20.0
      ),
      scrollDirection: Axis.vertical,
      itemCount: 3,
      itemBuilder: (context, index) {
        var currentHeading = this.items[index];
        var currentIcon = this.itemsMap[currentHeading];

        return Padding(
          padding: EdgeInsets.only(bottom: 50.0),
          child: new TextFormField(
              validator: (input) {
                if (input.isEmpty) {
                  return 'You must enter a ${currentHeading.toLowerCase()} for your to-do';
                }
              },
              keyboardType: this._changeKeyboardType(currentHeading),
              decoration: new InputDecoration(
                prefixIcon: currentIcon,
                labelText: currentHeading,
                border: OutlineInputBorder(),
              ),
            )
        );
      }
    );
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      autovalidate: true,
      child: Expanded(
        child: (this.createListItems())
      )
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

不起作用的主线是:keyboardType: this._changeKeyboardType(currentHeading)...我是否以错误的方式处理这个问题?任何方向都会非常有帮助。我基本上希望描述的 textFormFeld 是多行的,以便用户可以更好地可视化他们的描述。

Can*_*Can 6

我现在的工作解决方案:

// Where entry is an object containing its focusNode and textInputType
entry.focusNode.unfocus();
setState(() {
  entry.textInputType = type;
});
// The delay was necessary, otherwise only the 2nd tap would actually change
Future.delayed(const Duration(milliseconds: 1), () {
  FocusScope.of(context).requestFocus(entry.focusNode);
});
Run Code Online (Sandbox Code Playgroud)

到目前为止我无法修复的唯一缺点是键盘在新版本重新出现之前就消失了TextInputType

Google 的电子表格应用程序无需关闭即可立即完成此操作,很想知道这是否以及如何在 Flutter 中实现。

你必须改变你的逻辑,因为我的例子是异步的。
让我知道这是否有帮助或者您是否需要更多帮助。
或者,如果您已经弄清楚了,那么您是如何做到的

可能会喜欢这样在此输入图像描述

学分:它的灵感来自/sf/answers/4094893211/