如何在代码延迟后删除showdialog可见性


代码延迟1秒后,我将_visible设置为false,但对话框仍在屏幕上。我等待对话框在一秒钟后消失。我该如何设置?
return BuildNumButton(
buttonColorDisable: _buttonColorRed(),
color: colorList[index],
number: numberList[index],
isDisable: disableButtons.contains(index),
callback: () async {
disableButtons.add(index);
CalculateScore.sumNumbers(numberList[index]);
CalculateScore.calculateScore();
_updateScore();
if (CalculateScore.answer) {
if (!CalculateScore.endGame) {
_show();
await Future.delayed(
const Duration(milliseconds: 1000), () {
setState(() {
_visible = !_visible;
});
});
disableButtons.clear();
_updateList();
_updateButtonColor();
}
_updateTarget();
}
},
);
_show() {
return AnimatedOpacity(
opacity: _visible ? 1.0 : 0.0,
duration: const Duration(milliseconds: 500),
child: _showDialog(context),
);
}
_showDialog(BuildContext context) {
return showDialog<String>(
useSafeArea: true,
barrierColor: Colors.red.withOpacity(0.5),
barrierDismissible: false,
context: context,
builder: (BuildContext context) => const Icon(
Icons.check_rounded,
size: 100,
),
);
}

您所做的实际上是错误的。

AnimatedOpacity是一个小工具&showDialog是一个函数。当您将showDialog作为AnimatedOpacity的子对象传递时,它在某种程度上起作用,但破坏了进一步的过程。正如你所看到的,一个简单的Future.delayed已经不起作用了。您可以通过简单地在&_show((下方

当您在按钮上调用AnimatedOpacity时,调用它实际上是在当前小部件上创建一个新的小部件。现在,由于您当前的代码被破坏,该过程不起作用&状态不再更新。

要解决此问题,有三个选项

  1. 移除动画不透明度&正常显示对话框。请参阅此处的示例
  2. 使用任何可以提供对话框动画(如不透明度(的软件包
  3. 使用showGeneralDialog。请参阅此处的示例(此处的参考(

当您呼叫return showDialog<String>(...时,您不在此屏幕上:

return AnimatedOpacity(
opacity: _visible ? 1.0 : 0.0,
duration: const Duration(milliseconds: 500),
child: _showDialog(context),
);

因此,如果您想关闭回调函数中需要调用的对话框页面:Navitagor.pop(context);,那么更改_visible也没关系;

Navitagor.pop(context);
setState(() {
_visible = !_visible;
});

要关闭_showDialog,是否需要调用Navigator.pop(上下文(

将其添加到Future.delayed((

await Future.delayed(const Duration(milliseconds: 1000), () {
setState(() {
_visible = !_visible;
Navigator.pop(context);
});
});

最新更新