我有一个带有TextField
的简单屏幕。上面有一个信息文本,下面有一个信息文本。这些信息文本仅在满足特定条件时显示。
最小示例:
class FooPage extends StatefulWidget {
const FooPage({Key? key}) : super(key: key);
@override
State<StatefulWidget> createState() {
return FooState();
}
}
class FooState extends State<FooPage> {
TextEditingController controller = TextEditingController();
bool show = true;
@override
void initState() {
super.initState();
controller.addListener(() {
setState(() => show = controller.text.length < 5);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
show ? const Text("hello1") : const SizedBox.shrink(),
TextField(controller: controller),
show ? const Text("hello2") : const SizedBox.shrink(),
],
),
);
}
}
问题是,当信息文本出现或消失时,TextField
会失去焦点!如果我只使用一个文本(其中任何一个),一切都正常。
我可以通过用ExcludeFocus
Package 信息文本或在TextField
上使用autoFocus: true
来解决这个问题。但我很确定这些都不是好的解决方案。至少后一个不能是:)
到底发生了什么事?什么才是正确的解决方法?
1条答案
按热度按时间z2acfund1#
我不能告诉你为什么我的解决方案有效,但是如果你给TextField传递一个GlobalKey,它就不会失去焦点。
可能和这个有关?从文档上看:
具有全局键的小部件在从树中的一个位置移动到树中的另一个位置时,将重新指定其子树的父级。为了重新指定其子树的父级,小部件必须在从树中的旧位置移除时的同一动画帧中到达树中的新位置。