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




