我想创建一个屏幕,其中许多TextFIeld
垂直排列,在编辑底部TextField
时按Enter键,一个新的TextField
被添加在它下面移动焦点太多。我创建了一个演示应用程序参考的例子在docs的FocusNode
和它的工作基本上,但键盘反弹时,移动焦点到一个新创建的TextField
(请参阅下面的gif)。如何修复此不需要的行为?
The gif of the demo app
演示应用程序的代码如下:
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: _title,
home: MyStatefulWidget(),
);
}
}
class MyStatefulWidget extends StatefulWidget {
const MyStatefulWidget({super.key});
@override
State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int focusedChild = 0;
List<Widget> children = <Widget>[];
List<FocusNode> childFocusNodes = <FocusNode>[];
@override
void initState() {
super.initState();
// Add the first child.
_addChild();
}
@override
void dispose() {
for (final FocusNode node in childFocusNodes) {
node.dispose();
}
super.dispose();
}
void _addChild() {
// Calling requestFocus here creates a deferred request for focus, since the
// node is not yet part of the focus tree.
childFocusNodes
.add(FocusNode(debugLabel: 'Child ${children.length}')..requestFocus());
children.add(
TextField(
focusNode: childFocusNodes.last,
textInputAction: TextInputAction.unspecified,
minLines: 1,
onSubmitted: (value) {
setState(() {
focusedChild = children.length;
_addChild();
});
},
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: SingleChildScrollView(
child: Column(
children: children,
),
),
),
);
}
}
1条答案
按热度按时间tkclm6bt1#
Screenshot
您需要使用TextInputAction
TextInputAction.next
:将焦点移动到下一个可聚焦项目。TextInputAction.done
:关闭键盘。更新
在编辑完成时创建新文本字段,并将焦点更改为新文本字段。
1.您需要使用
onEditingComplete
函数,而不是onSubmitted
。因为onEditingComplete
不会关闭(解散)键盘。1.我重写了你的代码,删除了生成窗口小部件列表的操作,并将其替换为
TextEditingController
,因为将UI(窗口小部件)保存在变量中是一种糟糕的体验。因此,文本字段按TextEditingController
长度生成。1.我删除了
FocusNode
列表,并使用FocusScope.of(context).nextFocus()
更改焦点。1.创建新的
TextEditingController
函数调用后,nextFocus()
延迟,以便有时间重新创建新UI。