问题描述:
下面是相关代码,在onFieldSubmitted中的debugPrint()正在运行,所以这个代码在这的,但是focus并没有改变。
_createItemHeadingWidget() { return Padding( padding: const EdgeInsets.all(8.0), child: TextFormField( controller: _controllerItemHed, autofocus: true, focusNode: _focusNodeItemHed, textInputAction: TextInputAction.next, onFieldSubmitted: (v) { debugPrint("ItemHeading submitted"); FocusScope.of(context).requestFocus(_focusNodeItemDetail); }, decoration: InputDecoration( labelText: "Item Heading", hintText: "Enter item heading", border: OutlineInputBorder(borderRadius: BorderRadius.circular(20.0)), ), ), ); }
Widget _createItemDetailWidget() { return Padding( padding: const EdgeInsets.all(8.0), child: TextFormField( controller: _controllerItemDetail, maxLength: 75, focusNode: _focusNodeItemDetail, textInputAction: TextInputAction.next, onFieldSubmitted: (v) { debugPrint("ItemDetail submitted"); FocusScope.of(context).requestFocus(_focusNodeItemPrice); }, decoration: InputDecoration( labelText: "Item Detail", hintText: "Enter item detail", border: OutlineInputBorder(borderRadius: BorderRadius.circular(20.0)), ), ), ); }
class DataEntryState extends State<DataEntry> { final TextEditingController _controllerItemHed = TextEditingController(); final TextEditingController _controllerItemDetail = TextEditingController(); final TextEditingController _controllerItemPrice = TextEditingController(); final TextEditingController _controllerSeller = TextEditingController(); final TextEditingController _controllerContactNr = TextEditingController(); final TextEditingController _controllerLocation = TextEditingController(); final FocusNode _focusNodeItemHed = FocusNode(); final FocusNode _focusNodeItemDetail = FocusNode(); final FocusNode _focusNodeItemPrice = FocusNode(); final FocusNode _focusNodeSeller = FocusNode(); final FocusNode _focusNodeContactNr = FocusNode(); final FocusNode _focusNodeLocation = FocusNode();
答案:
在尝试了许多无效的方法后,我唯一能找到的解决方法是:
_changeFocus(BuildContext context, FocusNode focusNodeCurrent, FocusNode focusNodeNext) { focusNodeCurrent.unfocus(); setState(() => _focusNodeCurrent = focusNodeNext); }
debugPrint()显示在in_changeFocus()中,unfocus()可以工作,requestFocus()不能工作。
if (_focusNodeCurrent != null) FocusScope.of(context).requestFocus(_focusNodeCurrent);
其他相关代码(其中一些可能是多余的):
TextFormField _createItemHeadingWidget(BuildContext context) { FocusScope.of(context).reparentIfNeeded(_focusNodeItemHed); return TextFormField( controller: _controllerItemHed, maxLength: 50, keyboardType: TextInputType.text, autofocus: _dataRec == null, focusNode: _focusNodeItemHed, textInputAction: TextInputAction.next, onFieldSubmitted: (v) { _changeFocus(context, _focusNodeItemHed, _focusNodeItemDetail); }, decoration: InputDecoration( labelText: "Item Heading", hintText: "Enter item heading", border: OutlineInputBorder(borderRadius: BorderRadius.circular(20.0)), ), ); }
未经允许不得转载:编程自学网 » FocusNode-为什么requestFocus()不工作