【问题标题】:Flutter Dismissible causing unnecesary redraw when pushed navigated on top将导航推到顶部时,Flutter Dismissible 会导致不必要的重绘
【发布时间】:2019-07-10 13:43:29
【问题描述】:

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

目标是有一个 TextField ,当处于焦点时应该选择整个文本。我通过 FocusNode 实现了这一点。

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

这很有趣,因为该问题仅在小部件位于已由导航器推送的页面内时发生。相同的 Widget 在根 Page 中也能正常工作。

小部件如下:

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),
      ),
    ]);
  }

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

干杯

【问题讨论】:

    标签: flutter flutter-layout


    【解决方案1】:

    您应该使用 StatefulWidget 并调用 setState

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

    【讨论】:

    • 答案与我最初发布的问题无关。只是调用 setState 与此无关。
    猜你喜欢
    • 1970-01-01
    • 2019-10-03
    • 2021-01-28
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 2018-09-12
    • 2016-06-21
    • 2021-07-11
    相关资源
    最近更新 更多