以下是相关代码。onFieldSubmitted中的debugPrint():正在运行,所以代码到达这里,但焦点没有改变。焦点没有改变。
_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();
7条答案
按热度按时间dba5bblo1#
在尝试了许多不起作用的事情之后,我能找到的唯一解决方案如下:
debugPrint()显示在_changeFocus()中,unfocus()可以工作,而requestFocus()不工作。
在构建版本中:
其他相关代码(其中一些可能是多余的):
r6vfmomb2#
使用
而不是
omjgkv6w3#
对我很管用
6ovsh4lw4#
使用setState()来解决这个问题在我看来并不是最佳的解决方案,所以我继续测试。经过大量的进一步测试,主要包括从应用程序中删除所有我能删除的内容,我最终用创建Scaffold来替换MaterialApp的创建。这解决了这个问题。现在它看起来像预期的那样工作。所需要做的就是:
我认为我最初创建MaterialApp的原因是我最初开始学习Flutter时从另一个应用程序复制了它。似乎没有必要创建MaterialApp,但我不知道创建MaterialApp而不是只创建支架的原因。
是否是flutter中的bug导致了这种行为,我不知道。这可能只是使用MaterialApp的一个“特性”,也可能是我误用了MaterialApp。
dsf9zpds5#
对于其他任何人挣扎与此,我只是在玩,并作出了演示。
你可以将焦点切换到左边或右边的文本字段,或者取消焦点。下面的代码是@Brian Oh的答案和一些新代码的组合。特点:
FocusScope.of(context).requestFocus(_nextFocusNode)
,不需要设置状态编辑:
我在另一个应用程序中使用了此代码,并获得了错误
处置后使用了FocusNode。
根据this github link,你不应该调用dispose。我已经注解掉了上面对焦点节点的dispose调用,错误消失了。
q5iwbnjs6#
调用时使用此=〉
pqwbnv8z7#
使用
FocusScope.of(context).nextFocus()
对我很有效我使用的自定义Widget代码