#flutter #dart
#трепетать #дротик
Вопрос:
У меня есть простое текстовое поле. Пользователю не разрешается писать в этом текстовом поле до нажатия специальной кнопки. Это мой код , эта функция не работает, но все остальное в нем работает нормально, что я сделал не так ?
TextEditingController _textFieldController = TextEditingController(); bool isTextFieldEnable = false; FocusNode _focusNode = FocusNode(); Row( children: [ Container( width: 305, margin: EdgeInsets.only(left: 34), height: 250, child: SingleChildScrollView( child: TextField( controller: _textFieldController, decoration: new InputDecoration.collapsed(hintText: "Описание"), maxLines: null, focusNode: _focusNode, enabled: isTextFieldEnable, onChanged: (value) { CheckListModel.checkLists[arg['index']].description = value; }, onSubmitted: (value) async { FocusScope.of(context).unfocus(); _textFieldController.text = CheckListModel.checkLists[arg['index']].description; CheckListModel checkList = CheckListModel.checkLists[arg['index']]; await checkList.writeToFile(checkList.toJson()); }, textInputAction: TextInputAction.done, )), ), Column( mainAxisAlignment: MainAxisAlignment.start, children: [ IconButton( onPressed: () { setState(() { isTextFieldEnable = true; print(isTextFieldEnable); }); }, icon: Icon(Icons.edit), ), ], ) ], ),
Комментарии:
1. Используйте только для чтения, если установлено только для чтения, текстовое поле true отключено
2. Находится
isTextFieldEnable
подbuild()
методом? Тогда это не сработает. Потому что всякийsetState()
раз, когда он будет вызван,build()
он будет вызван снова и, как вы можете видеть, независимо от того, что вы сделали,isTextFieldEnable
будет инициализированfalse
первым.
Ответ №1:
Пожалуйста, обратитесь к приведенному ниже коду
Мы можем контролировать, отключено текстовое поле или нет, установив для его свойства только для чтения значение true или false,
TextEditingController _textFieldController = TextEditingController(); bool isTextFieldEnable = true; FocusNode _focusNode = FocusNode(); Row( children: [ Container( width: 305, margin: EdgeInsets.only(left: 34), height: 250, child: SingleChildScrollView( child: TextField( controller: _textFieldController, decoration: new InputDecoration.collapsed(hintText: "Описание"), maxLines: null, focusNode: _focusNode, readOnly: isTextFieldEnable, /* change this if read only is set to false you can enter in text field or if it is set to true you cannot enter any text in TextField. */ onChanged: (value) { CheckListModel.checkLists[arg['index']].description = value; }, onSubmitted: (value) async { FocusScope.of(context).unfocus(); _textFieldController.text = CheckListModel.checkLists[arg['index']].description; CheckListModel checkList = CheckListModel.checkLists[arg['index']]; await checkList.writeToFile(checkList.toJson()); }, textInputAction: TextInputAction.done, )), ), Column( mainAxisAlignment: MainAxisAlignment.start, children: [ IconButton( onPressed: () { setState(() { isTextFieldEnable = false; print(isTextFieldEnable); }); }, icon: Icon(Icons.edit), ), ], ) ], ),