Иногда мне нужно отключать TextFormField. Я не смог найти ни флага в виджете, ни контроллера, чтобы просто сделать его доступным только для чтения или отключить. Как лучше всего это сделать?
Отключить поле редактирования текста во флаттере
Ответы (12)
Эта функция в настоящее время не предоставляется платформой, но вы можете использовать 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',
),
),
),
),
),
);
}
}
FocusScopeNode(canRequestFocus: _enabled, child: .....
- person J. MARS; 23.06.2021
Это может быть достигнуто другим способом, который также не вызывает этой проблемы. Надеюсь, это может кому-то помочь.
Создайте AlwaysDisabledFocusNode
и передайте его свойству focusNode
объекта TextField
.
class AlwaysDisabledFocusNode extends FocusNode {
@override
bool get hasFocus => false;
}
тогда
new TextField(
enableInteractiveSelection: false, // will disable paste operation
focusNode: new AlwaysDisabledFocusNode(),
...
...
)
Обновление: TextField
теперь имеет свойство enabled
. Где можно просто отключить TextField
лайк
new TextField(
enabled: false,
...
...
)
Примечание. Это также отключит значок, связанный с вводом текста.
enableInteractiveSelection: false
для TextField
;)
- person MoGa; 24.01.2019
AlwaysDisabledFocusNode
?
- person Hemanth Raj; 21.11.2019
TextField
и TextFormField
имеют аргумент enabled
. Вы можете управлять им с помощью логической переменной. enabled=true
означает, что он будет действовать как текстовое поле для редактирования, тогда как enabled=false
отключит TextField
.
enabled=false
в том, что он предотвращает появление сообщения об ошибке
- person Mohamed Ali; 22.03.2019
Подобно только для чтения, как в html
TextField(
enableInteractiveSelection: false,
focusNode: FocusNode(),
)
Это может быть ответ на onTap.
Похоже на отключено, как в html
TextField(
enable: false
)
Это не может ответить на onTap.
Это еще один способ каким-то образом отключить TextField
, но сохранить его функциональность. Я имею в виду onTap
использование
TextField(
enableInteractiveSelection: false,
onTap: () { FocusScope.of(context).requestFocus(new FocusNode()); },
)
enableInteractiveSelection
отключит выбор содержимого для
TextField
FocusScope.of(context).requestFocus(new FocusNode());
изменить фокус на неиспользуемый узел фокуса
Таким образом вы по-прежнему можете касаться TextField
, но не можете вводить текст или выбирать его содержимое. Поверьте, иногда это будет полезно (datepicker, timepicker, ...) :)
Использование readOnly:true
правильно. Но если вы все еще хотите сосредоточиться на этом текстовом поле, вы можете следовать приведенному ниже коду:
TextFormField(
showCursor: true,//add this line
readOnly: true
)
А если вы хотите скрыть текстовый указатель (курсор), вам нужно установить enableInteractiveSelection
в false
.
Теперь есть способ отключить TextField
и TextFormField
. См. Github здесь. Используйте это так:
TextField(enabled: false)
Я использовал комбинацию свойств readOnly и enableInteractiveSelection для достижения желаемого поведения в TextField.
TextField(
readOnly: true,
enableInteractiveSelection: true,
onTap: () {
do_something(),
},
)
Если для enableInteractiveSelection установлено значение true, это позволит onTap () работать как обычно.
Я пробовал использовать FocuseNode (), enabled = false, но не работал. Вместо этого я использую виджет под названием AbsorbPointer. Он используется для предотвращения касания или касания виджета, я оборачиваю свой TextFormField или другой виджет внутри виджетов AbsordPointer и даю параметр для отключения от прикосновения
Пример
AbsorbPointer(
absorbing: true, //To disable from touch use false while **true** for otherwise
child: Your WidgetsName
);
Используйте 1_
TextField(
readOnly: true,
controller: controller,
obscureText: obscureText,
onChanged: (value) {
onValueChange();
},
style: TextStyle(
color: ColorResource.COLOR_292828,
fontFamily: Font.AvenirLTProMedium.value,
fontSize: ScreenUtil().setHeight(Size.FOURTEEN)),
decoration: InputDecoration(
border: InputBorder.none,
hintText: hint,
hintStyle: TextStyle(
fontSize: ScreenUtil().setHeight(Size.FOURTEEN),
color: ColorResource.COLOR_HINT,
fontFamily: Font.AvenirLTProBook.value)),
),
У него есть enabled
ключ, меня это устраивает.
TextFormField(
enabled: false,
)