Xamarin Forms:实现Rg.Plugins.Popup自动关闭并避免重复关闭错误
解决Rg.Plugins.Popup自动关闭时的"No Page in PopupStack"错误
要解决这个问题,核心是在弹窗关闭时取消未完成的延迟任务,同时执行关闭操作前先检查弹窗是否还在栈内。具体可以按以下方式处理:
关键改进点
- 用
CancellationTokenSource控制延迟任务的生命周期,弹窗关闭时直接终止任务 - 重写弹窗的消失生命周期方法,触发任务取消逻辑
- 执行关闭操作前,先验证弹窗是否仍在
PopupStack中,做双重保险
修改后的完整代码
private CancellationTokenSource _delayCts; protected override void OnAppearing() { base.OnAppearing(); _delayCts = new CancellationTokenSource(); _ = RunAutoCloseTask(_delayCts.Token); } protected override void OnDisappearing() { base.OnDisappearing(); // 弹窗关闭时取消延迟任务并释放资源 _delayCts?.Cancel(); _delayCts?.Dispose(); } private async Task RunAutoCloseTask(CancellationToken token) { try { await Task.Delay(10000, token); // 先检查当前弹窗是否还在栈内,再执行关闭 if (PopupNavigation.Instance.PopupStack.Contains(this)) { await PopupNavigation.Instance.PopAsync(true); } } catch (TaskCanceledException) { // 任务被取消,无需额外处理 } }
逻辑说明
- 弹窗显示时初始化
CancellationTokenSource,启动带取消令牌的延迟任务 - 无论用户手动关闭弹窗还是自动关闭触发,
OnDisappearing都会被调用,此时取消延迟任务,避免后续无效的关闭操作 - 延迟任务结束后,先通过
PopupStack.Contains(this)确认弹窗仍存在,再执行PopAsync,彻底避免"No Page in PopupStack"错误
内容的提问来源于stack exchange,提问作者hk77
相关产品推荐
相关产品推荐

