上下文:
在Flutter中测试ListViewDismissible时,我偶然发现了一次轻微的崩溃。刷可解雇商品时,会使用Dialog选项显示confirmDismiss进行确认。这一切都很好,但是在测试不太可能的用例时,UI会崩溃。页面上有几个导航到其他(命名)路线的选项。刷下可解雇对象时,在动画过程中点击了导航到新路线的选项时,就会发生崩溃。

如何复制崩溃:

  • 关闭可关闭的
  • 在随后的动画(可忽略位置的平移)中,点击将您带到屏幕上的 Action 。
    新路线。执行此操作的时间非常短,在示例中已对其进行了扩展。
  • 新路线加载,UI冻结

  • 供引用,这是错误消息:



    罪魁祸首是当动画已被处置时试图反转的动画:



    我尝试过的事情:
    最初,我尝试检查this.mounted中的showDialog builder,但很快意识到问题不存在于此。
    另一个想法是通过使用CancelableOperation.fromFuture来解决该问题,然后在包含的小部件的dispose()方法中将其取消,但这无济于事。

    我该如何解决或至少规避此问题?

    代码(也可以找到并克隆here):
    // (...)
    class _DimissibleListState extends State<DimissibleList> {
      int childSize = 3;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: ListView.builder(
            itemCount: childSize,
            itemBuilder: (context, index) {
              if (index == 0) {
                return _buildNextPageAction(context);
              }
              return _buildDismissible();
            },
          ),
        );
      }
    
      Widget _buildNextPageAction(context) {
        return FlatButton(
          child: Text("Go to a new page"),
          onPressed: () => Navigator.of(context).pushNamed('/other'),
        );
      }
    
      Dismissible _buildDismissible() {
        GlobalKey key = GlobalKey();
    
        return Dismissible(
          key: key,
          child: ListTile(
            title: Container(
              padding: const EdgeInsets.all(8.0),
              color: Colors.red,
              child: Text("A dismissible. Nice."),
            ),
          ),
          confirmDismiss: (direction) async {
            await Future.delayed(const Duration(milliseconds: 100), () {});
            return showDialog(
              context: context,
              builder: (context) {
                return Dialog(
                  child: FlatButton(
                    onPressed: () => Navigator.of(context).pop(true),
                    child: Text("Confirm dismiss?"),
                  ),
                );
              },
            );
          },
          resizeDuration: null,
          onDismissed: (direction) => setState(() => childSize--),
        );
      }
    }
    

    最佳答案

    我的confirmDismiss几乎有相同的问题,在我的情况下,我在confirmDismiss中使用(await Navigator.push())导航到另一个屏幕,但作为返回,我遇到了此错误:



    所以要解决我的问题,我在confirmDismiss内部调用了一个外部函数,即confirmDismiss(没有await),然后在该函数调用后添加return true或false,以完成confirmDismiss的动画。

    08-28 04:05