dart - Dismissible confirmDismiss 结合新的路由导航导致 Flutter 崩溃
问题描述
背景:我在 Flutter 中测试 a of s
时偶然发现了一个小崩溃。滑动可关闭选项时,使用选项显示 a 以进行确认。这一切都很好,但是在测试不太可能的用例时 UI 会崩溃。页面上有几个选项可以导航到其他(命名的)路线。当轻扫可关闭的对象时,并且在动画期间点击导航到新路线的选项时,会发生崩溃。ListView
Dismissible
Dialog
confirmDismiss
如何复制崩溃:
- 解雇可解雇的人
- 在随后的动画中(可关闭位置的平移),点击一个将您带到新路线的动作。执行此操作的时间范围很短,我在示例中对其进行了扩展。
- 新路由加载并且 UI 冻结
作为参考,这是错误消息:
AnimationController.reverse() 在 AnimationController.dispose() 之后调用
罪魁祸首是动画在它已经被释放时试图反转:
我尝试过的事情:
最初,我尝试检查this.mounted
内部,showDialog builder
但很快意识到问题并不存在。另一个想法是通过使用然后在包含小部件的方法中取消它
来规避问题,但这无济于事。CancelableOperation.fromFuture
dispose()
我能做些什么来解决或至少规避这个问题?
代码(也可以在这里找到和克隆):
// (...)
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的动画。
推荐阅读
- python - 带有 TypeError 的 Tkinter 回调中的异常
- javascript - 更改网页中的日期格式
- html - Django:无法更新 CSS 更改
- keras - 为什么我的模型的训练和验证准确度在一个 epoch 之后保持不变?[凯拉斯]
- compiler-errors - 推力集差异无法通过从 __host__ __device__ 函数调用 __host__ 函数进行编译是不允许的
- docker - 在 Docker 撰写文件中定义任务
- python - 从数学绘图库窗口中提取图像 (jpg)
- visualization - 可视化强化学习代理的进度
- postgresql-11 - 错误:运算符不存在:字符 <> 整数
- c++ - 为什么这些源代码(C++)为化学反应提供了不同的结果?