Dismissible verifyDismiss 与新的路线导航结合导致 Flutter 崩溃

2024-02-19

上下文:
我在测试时偶然发现了一次轻微的崩溃ListView of DismissibleFlutter 中的 s。当滑动可关闭时,Dialog显示使用confirmDismiss选项,用于确认。这一切都运行良好,但是在测试不太可能的用例时,UI 会崩溃。页面上有几个选项可用于导航到其他(指定)路线。当滑动可关闭项并在动画期间点击导航到新路线的选项时,就会发生崩溃。

如何复制崩溃:

  1. 驳回 可驳回的
  2. 在接下来的动画(可消除位置的转换)中,点击一个操作,将您带到一个 新路线。执行此操作的时间范围很短,我在示例中延长了它。
  3. 新路线加载并且 UI 冻结

作为参考,这是错误消息:

AnimationController.reverse() 在 AnimationController.dispose() 之后调用

罪魁祸首是动画在已经被处理后试图反转:

包:flutter/…/widgets/dismissible.dart:449 https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/dismissible.dart

我尝试过的事情:
最初,我尝试检查this.mounted在 - 的里面showDialog builder但很快意识到问题并不在那里。
另一个想法是通过使用来规避这个问题CancelableOperation.fromFuture然后在中取消它dispose()包含小部件的方法,但这无济于事。

我可以做什么来解决或至少规避这个问题?

代码(也可以找到并克隆here https://github.com/KnockaertSven/dismissible-crash):

// (...)
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())导航到另一个屏幕,但作为回报,我遇到了这个错误:

AnimationController.reverse() 之后调用 AnimationController.dispose()

因此,为了解决在confirmDismiss内部的问题,我在confirmDismiss之外调用一个future函数(不带await),然后在该函数调用之后添加return true或false以完成confirmDismiss的动画。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dismissible verifyDismiss 与新的路线导航结合导致 Flutter 崩溃 的相关文章

随机推荐