android - 单击 TextField 时键盘被关闭

标签 android ios flutter

我有一个文本字段,点击键盘即可打开并立即关闭。这是我的 TextField 代码:

class DataItem extends StatefulWidget {
Data data;
List<Menu> menuList;
int quantity;
String price;
String title;
var id;
DataItem(
  {this.data,
  this.menuList,
  this.id,
  this.quantity,
  this.price,
  this.title});

  @override
_DataItemState createState() => _DataItemState();
 }

class _DataItemState extends State<DataItem> {
String selectedType = 'Select Type';
String comments = 'No';

@override
Widget build(BuildContext context) {

return Dismissible(
  key: UniqueKey(),
  background: Container(
    color: Theme.of(context).errorColor,
    child: Icon(
      Icons.delete,
      color: Colors.white,
      size: 40,
    ),
    alignment: Alignment.centerRight,
    padding: EdgeInsets.only(right: 20),
    margin: EdgeInsets.symmetric(
      horizontal: 15,
      vertical: 4,
    ),
  ),
  direction: DismissDirection.endToStart,
  confirmDismiss: (direction) {
    return showDialog(
      context: context,
      builder: (ctx) => AlertDialog(
        title: Text('Are you sure?'),
        content: Text('Do you want to remove?'),
        actions: <Widget>[
          FlatButton(
            child: Text('No'),
            onPressed: () {
              Navigator.of(ctx).pop(false);
            },
          ),
          FlatButton(
            child: Text('Yes'),
            onPressed: () {
              Navigator.of(ctx).pop(true);
            },
          )
        ],
      ),
    );
  },
  onDismissed: (direction) {

    //Delete Functionality

  },
  child: Card(
    margin: EdgeInsets.symmetric(
      horizontal: 15,
      vertical: 4,
    ),
    child: Padding(
      padding: EdgeInsets.all(8),
      child: Column(
        children: <Widget>[
          ListTile(
            leading: CircleAvatar(
              backgroundColor:Colors.purple,
              child: Padding(
                padding: EdgeInsets.all(5),
                child: FittedBox(
                  child: Text(
                    widget.price,
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              ),
            ),
            title: Text(widget.title),
            subtitle: Text(
              'Total: 0',
            ),
            trailing: Text(widget.quantity.toString() + ' x'),
          ),
          Padding(
            padding: const EdgeInsets.only(
                left: 15, right: 5, top: 5, bottom: 5),
            child: Container(
              width: double.infinity,
              decoration: (BoxDecoration(
                  borderRadius: BorderRadius.circular(7),
                  border: Border.all(color:Colors.red))),
              child: DropdownButton<String>(
                items:
                    <String>['Type1 ', 'Type2'].map((String value) {
                  return new DropdownMenuItem<String>(
                    value: value,
                    child: new Text(
                      value,
                      style: TextStyle(color: Colors.black),
                    ),
                  );
                }).toList(),
                hint: Padding(
                  padding: const EdgeInsets.only(left: 16),
                  child: Text(selectedType),
                ),
                onChanged: (String val) {
                  setState(() {
                    selectedType = val;
                          selectedType);
                  });
                },
              ),
            ),
          ),
          Padding(
            padding: const EdgeInsets.only(
                left: 32, right: 5, top: 10, bottom: 5),
            child: GestureDetector(
              onTap: () {
                var focusNode = new FocusNode();
                //  var textField = new TextField(focusNode: focusNode);

                FocusScope.of(context).requestFocus(focusNode);
              },
              child: TextField(
                decoration:
                    new InputDecoration.collapsed(hintText: 'Add Comments'),


            ),
          )
        ],
      ),
    ),
  ),
 );
  }

这是DataItem类的代码。点击文本字段时,键盘会打开并立即关闭。请帮忙。我也尝试过使用 GestureDetector、请求焦点和 onChanged,但没有任何效果。

最佳答案

您应该将焦点节点放在构建方法之外。添加了测试示例。

 var focusNode = new FocusNode(); // This should be here and not inside the build method

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Padding(
              padding:
                  const EdgeInsets.only(left: 32, right: 5, top: 10, bottom: 5),
              child: GestureDetector(
                onTap: () {
                  FocusScope.of(context).requestFocus(focusNode);
                },
                child: TextField(
                  decoration:
                      InputDecoration.collapsed(hintText: 'Add Comments'),
                ),
              ),
            ),
          ],
        ),
      ),
    );

DartPad Example

关于android - 单击 TextField 时键盘被关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59386531/

相关文章:

从 DatePicker 中选取值后,Android setError 验证仍然显示。?

ios - 如何减少 reloadData 的故障(视觉上)?

iOS:如何检查是否启用了触觉反馈(iOS 设置)

flutter - 如何放置隐藏参数并发送下一页

java - GridView 中的 CheckBox 在 clickable=false 时仍然可以点击

android - react native : Unable to download JS bundle from the Dev Server

PHP Moved Temporarily 错误?我在 Android 中使用 c2dm

ios - 通过 UIMenuController 的 UIMenuItem 传值

Flutter 将小部件绘制到特定路径位置的 Canvas

flutter - 如何检测用户已停止在 TextField 中输入?