我的应用程序中有一个异步功能,用户应该等待操作完成,但应该有一个按钮可以取消操作并在应用程序中重新测试操作 问题是,当我使用 getx 的 overley 时,它很好,但是取消 btn 不起作用,我搜索了所有地方,但仍然一无所获
await Get.showOverlay(asyncFunction: () async {
//-------------------Example for the operation----------
await Future.delayed(Duration(seconds: 5));
}, loadingWidget: Material(
color: Colors.transparent,
type: MaterialType.transparency,
elevation: 0,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('working on...',style: TextStyle(color: Colors.white,fontSize: 20,fontFamily: 'Sans',),),
SizedBox(height: 10.0,),
CircularProgressIndicator(color: Colors.blue),
BtnWidget(text: 'cancle', icon: Assets.svg.cancelSvgrepoCom, onPressed: () {
Get.back();
restartsteps();
})
],
),
));
我很感激任何帮助
我使用了 Get.back() 但它会转到上一页并且覆盖层仍然打开直到操作完成 我用过
Get.back(closeOverlays: true)
;和
Get.close(1)
,
还没有任何效果
未来不会在执行中停止。
您可以将 Timer 与 Completer 结合起来,从 Timer 中完成它并在 Completer.future 上等待,如下所示:
final Completer<bool> completer = Completer();
late Timer timer;
await Get.showOverlay(asyncFunction: ()
async {
timer = Timer(Duration(seconds: 10), () {
completer.complete(true);
});
await completer.future;
},
loadingWidget: Material(
color: Colors.transparent,
type: MaterialType.transparency,
elevation: 0,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'working on...',
style: TextStyle(
color: Colors.white,
fontSize: 20,
fontFamily: 'Sans',
),
),
SizedBox(
height: 10.0,
),
CircularProgressIndicator(color: Colors.blue),
ElevatedButton(
onPressed: () {
timer.cancel();
completer.complete(true);
},
child: Text("cancel"),
)
],
),
));