在flutter中禁用文本编辑字段

Ara*_*ash 13 dart flutter

我偶尔需要禁用TextFormField.我无法在小部件中找到标志,或者控制器只是将其设为只读或禁用.最好的方法是什么?

Hem*_*Raj 40

还有另一种方法可以实现,这也不会导致这个问题.希望这可以帮助某人.

创建AlwaysDisabledFocusNode并将其传递给a的focusNode属性TextField.

class AlwaysDisabledFocusNode extends FocusNode {
  @override
  bool get hasFocus => false;
}
Run Code Online (Sandbox Code Playgroud)

然后

new TextField(
    enableInteractiveSelection: false, // will disable paste operation
    focusNode: new AlwaysDisabledFocusNode(),
    ...
    ...
)
Run Code Online (Sandbox Code Playgroud)

更新: TextField现在enabled有财产.你可以在哪里禁用之TextField类的

new TextField(
    enabled: false, 
    ...
    ...
)
Run Code Online (Sandbox Code Playgroud)

注意:这也将禁用与文本输入关联的图标.


Vik*_*kas 31

TextField并且TextFormField都有所谓的争论enabled.您可以使用布尔变量来控制它.enabled=true意味着它将充当编辑文本字段,而enabled=false将禁用TextField.

  • 这是实际的答案. (5认同)
  • 这取决于您的需求。两者都解决了问题,但 Hemanth Raj 解决方案不会禁用与文本输入关联的图标(在您的accentColor主题上放置一些灰色),这可能会告诉用户他没有什么需要完成的(也许您希望用户单击模式并使用默认值填写该字段)。对于仅禁用输入的 Vikas Pandey 答案应该是可接受的。 (2认同)
  • `enabled=false` 的问题是它会阻止错误消息的出现 (2认同)

Doa*_*Bui 15

使用readOnly:true是正确的。但是,如果您仍想关注此文本字段,则可以按照以下代码操作:

TextFormField(
  showCursor: true,//add this line
  readOnly: true
)
Run Code Online (Sandbox Code Playgroud)

如果你想隐藏文本指针(光标),你需要设置enableInteractiveSelectionfalse.


And*_*min 13

为此... TextField 有两个属性:

TextField(
          readOnly: true,
          enabled: false,
        )
Run Code Online (Sandbox Code Playgroud)

1-如果您希望禁用 TextField 键入和敲击设置 [enabled: false]

2-如果您只想禁用TextField 键入设置 [readOnly: true]


JCh*_*___ 11

类似于html中的readonly

TextField(
    enableInteractiveSelection: false,
    focusNode: FocusNode(),
)
Run Code Online (Sandbox Code Playgroud)

这可以响应onTap。


类似于html中的禁用

TextField(
    enable: false
)
Run Code Online (Sandbox Code Playgroud)

这无法响应onTap。


小智 11

我使用了readOnlyenableInteractiveSelection属性的组合来在 TextField 上实现所需的行为。

TextField(
  readOnly: true,
  enableInteractiveSelection: true,
  onTap: () {
    do_something(),
  },
)
Run Code Online (Sandbox Code Playgroud)

enableInteractiveSelection设置为true,它将允许onTap()正常运行。


Col*_*son 9

这不是框架当前提供的功能,但您可以使用a FocusScope来阻止TextFormField请求焦点.

这是它被禁用时的样子.

(带提示文字) 空虚和只读

(具有只读值) 只读

这是它启用时的样子.

(有焦点) 重点

(没有焦点) 编辑

代码如下:

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new HomePage(),
  ));
}

class HomePage extends StatefulWidget {
  HomePageState createState() => new HomePageState();
}

class HomePageState extends State<HomePage> {

  TextEditingController _controller = new TextEditingController();
  bool _enabled = false;

  @override
  Widget build(BuildContext context) {
    ThemeData theme = Theme.of(context);
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Disabled Text'),
      ),
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.free_breakfast),
        onPressed: () {
          setState(() {
            _enabled = !_enabled;
          });
        }
      ),
      body: new Center(
        child: new Container(
          margin: const EdgeInsets.all(10.0),
          child: _enabled ?
          new TextFormField(controller: _controller) :
          new FocusScope(
            node: new FocusScopeNode(),
            child: new TextFormField(
              controller: _controller,
              style: theme.textTheme.subhead.copyWith(
                color: theme.disabledColor,
              ),
              decoration: new InputDecoration(
                hintText: _enabled ? 'Type something' : 'You cannot focus me',
              ),
            ),
          ),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


Sil*_*der 9

我尝试使用 FocuseNode(), enabled = false 但不起作用,而不是使用名为AbsorbPointer小部件。它用于防止小部件触摸或点击,我将 TextFormField 或其他小部件包装在 AbsordPointer 小部件中,并提供一个参数以禁用触摸

例子

AbsorbPointer(
      absorbing: true,  //To disable from touch use false while **true** for otherwise
      child: Your WidgetsName
);
Run Code Online (Sandbox Code Playgroud)


Man*_*ath 9

它有enabled钥匙,这对我来说很好。

TextFormField(
    enabled: false,
)
Run Code Online (Sandbox Code Playgroud)


Min*_*tan 9

TextField
(
   enable: false
)
Run Code Online (Sandbox Code Playgroud)

或者

TextFormField(
    enable: false
)
Run Code Online (Sandbox Code Playgroud)

如果你使用InputDecoration不要忘记像这样设置disabledBorder

TextFormField(
      enabled: false,
      decoration: InputDecoration(
        enabledBorder: OutlineInputBorder(
          borderRadius: BorderRadius.circular(10.0),
          borderSide: BorderSide(color: Colors.blue),
        ),
        disabledBorder:  OutlineInputBorder(
          borderRadius: BorderRadius.circular(10.0),
          borderSide: BorderSide(color: Colors.gray),
        ),
        filled: true,
      ),
    );
Run Code Online (Sandbox Code Playgroud)


Par*_*ars 5

这是某种方式禁用a TextField但保持其功能的另一种方法。我的意思是onTap使用

TextField(
    enableInteractiveSelection: false,
    onTap: () { FocusScope.of(context).requestFocus(new FocusNode()); },
)
Run Code Online (Sandbox Code Playgroud)
  • enableInteractiveSelection

    将禁用以下内容的选择 TextField

  • FocusScope.of(context).requestFocus(new FocusNode());

    将焦点更改为未使用的焦点节点

使用这种方式,您仍然可以触摸TextField但无法输入或选择其内容。相信我,有时候它会很有用(datepicker,timepicker等):)

  • 这正是我一直在寻找的。谢谢 (4认同)

Ben*_*ten 5

现在有一种禁用TextField和的方法TextFormField在这里查看github 。像这样使用它:

TextField(enabled: false)
Run Code Online (Sandbox Code Playgroud)


小智 5

TextFormField(
readOnly: true,
)
Run Code Online (Sandbox Code Playgroud)

  • 这就是我要找的,enabled: false 使后缀 iconbutton 禁用(我使用 content_copy 图标进行复制)。但这有效 (2认同)
  • readOnly:true 有一个问题 - 当用户选择此控件时 - 会出现蓝色边框 - 这基本上是说它允许将焦点放在控件上。 (2认同)