You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VS2026中MAUI弹窗返回值遇空引用异常的解决方法

问题分析与修复

问题根源

出现NullReferenceException的核心原因是taskCompSrc的初始化时机错误:

  • taskCompSrc仅在OnAppearing方法中实例化,但PopupDismissed属性的getter直接访问taskCompSrc.Task。如果在弹窗实例创建后、OnAppearing执行前就获取PopupDismissed(比如调用方刚创建弹窗就等待这个Task),会直接触发空引用异常。
  • 极端场景下,若弹窗还未完成OnAppearing就被关闭,OnDisappearing执行时taskCompSrc仍未初始化,同样会报错。

修复方案

taskCompSrc的初始化移到构造函数中,确保实例创建时就完成初始化,从根源避免空引用。同时添加状态判断,防止重复设置结果引发异常。

修复后的代码:

public partial class SelectDb : PopupPage
{
    SelViewModel Sv;
    TaskCompletionSource<string> taskCompSrc;

    public Task<string> PopupDismissed => taskCompSrc.Task;

    public string RetVal { get; set; } = string.Empty;

    public SelectDb()
    {
        InitializeComponent();
        taskCompSrc = new TaskCompletionSource<string>();
    }

    protected async override void OnAppearing()
    {
        base.OnAppearing();
        // 若弹窗为复用实例,可在此处重新初始化taskCompSrc,确保每次打开都有新的Task
        // taskCompSrc = new TaskCompletionSource<string>();
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        // 避免重复设置结果导致异常
        if (!taskCompSrc.Task.IsCompleted)
        {
            taskCompSrc.SetResult(RetVal);
        }
    }
}

额外说明

  • 如果弹窗是复用实例(而非每次创建新实例),需在OnAppearing中重新初始化taskCompSrc,保证每次弹窗打开都有独立的Task等待结果。
  • 添加!taskCompSrc.Task.IsCompleted判断,防止弹窗多次关闭时重复调用SetResult引发异常。

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

火山引擎 最新活动