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时,调用它实际上是在当前小部件上创建一个新的小部件。现在,由于您当前的代码被破坏,该过程不起作用&状态不再更新。
要解决此问题,有三个选项
- 移除动画不透明度&正常显示对话框。请参阅此处的示例
- 使用任何可以提供对话框动画(如不透明度(的软件包
- 使用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);
});
});