flutter 为什么在TextField周围添加视图时,TextField会失去焦点?

kr98yfug  于 2023-03-31  发布在  Flutter
关注(0)|答案(1)|浏览(213)

我有一个带有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来解决这个问题。但我很确定这些都不是好的解决方案。至少后一个不能是:)
到底发生了什么事?什么才是正确的解决方法?

z2acfund

z2acfund1#

我不能告诉你为什么我的解决方案有效,但是如果你给TextField传递一个GlobalKey,它就不会失去焦点。

GlobalKey globalKey = GlobalKey();

TextField(controller: controller, key: globalKey,),

可能和这个有关?从文档上看:
具有全局键的小部件在从树中的一个位置移动到树中的另一个位置时,将重新指定其子树的父级。为了重新指定其子树的父级,小部件必须在从树中的旧位置移除时的同一动画帧中到达树中的新位置。

相关问题