Flutter Dismissible,在顶部导航时会导致不必要的重绘

时间:2019-07-10 13:43:29

标签: flutter flutter-layout

我正在使用Flutter制作应用程序,但发现了一个奇怪的行为,需要在一个小演示中重现:https://pastebin.com/ZJd2fnHK

目标是要有一个TextField,当焦点对准时应选择整个文本。我是通过FocusNode实现的。

一切正常,直到我设置了Dismissible小部件以从列表中删除项目。由于某种原因(可能是绘图原因),整个页面都进行了重建,并且focusnode状态丢失了。

这非常有趣,因为仅当窗口小部件位于导航器推入的页面内时才发生此问题。相同的小部件在根页面中可以正常工作。

窗口小部件如下:

Widget build(BuildContext context) {
    textControllerA.text = "Hello";
    textControllerB.text = "World";
    return Column(children: [
      Dismissible(
        key: Key("potatoes"),
        onDismissed: (direction) {},
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Padding(
              child: TextField(
                focusNode: focusNodeA,
                controller: textControllerA,
              ),
              padding: EdgeInsets.all(20),
            ),
          ],
        ),
      ),
      Padding(
        child: TextField(
          focusNode: focusNodeB,
          controller: textControllerB,
        ),
        padding: EdgeInsets.all(20),
      ),
    ]);
  }

也许我应该尝试将焦点的状态存储在状态中,但这会产生一些开销。也许(可能)我做错了什么,在这种情况下,我希望获得一些指导。

欢呼

1 个答案:

答案 0 :(得分:-1)

您应该使用 StatefulWidget 并调用 setState

 onDismissed: (direccion) {
      setState(() {
          ...
      });