簡體   English   中英

單擊 TextField 時鍵盤被解除

[英]Keyboard getting dismissed on click of TextField

我有一個 TextField 在它的鍵盤上打開並立即關閉。 這是我的 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 類的代碼。 在點擊 TextField 時,鍵盤會立即打開並關閉。 請幫忙。 我也嘗試過使用 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 示例

我已經使用 TextFormField 而不是 TextField 解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM