You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
    {
        // 任务被取消,无需额外处理
    }
}

逻辑说明

  1. 弹窗显示时初始化CancellationTokenSource,启动带取消令牌的延迟任务
  2. 无论用户手动关闭弹窗还是自动关闭触发,OnDisappearing都会被调用,此时取消延迟任务,避免后续无效的关闭操作
  3. 延迟任务结束后,先通过PopupStack.Contains(this)确认弹窗仍存在,再执行PopAsync,彻底避免"No Page in PopupStack"错误

内容的提问来源于stack exchange,提问作者hk77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:45:30