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

MAUI迁移Mopups遇System.InvalidCastException问题求助

MAUI Mopups迁移后InvalidCastException异常解决

问题背景

从Rg.Plugins.Popups迁移到Mopups后,调用MopupService.Instance.PushAsync打开弹窗时抛出System.InvalidCastException,怀疑和依赖注入有关,寻求解决方法。

现有代码

MyViewModel.cs

MopupService.Instance.PushAsync(new OrganizationPopup(this));

OrganizationPopup类

public partial class OrganizationPopup : PopupPage {
        
    private MyViewModel _viewModel;
    public OrganizationCodePopup(MyViewModel viewModel) {
        BindingContext = _viewModel = viewModel;
        InitializeComponent();
    }
}

MauiProgram.cs

public static MauiApp CreateMauiApp() {
    var builder = MauiApp.CreateBuilder();
    builder
        .UseMauiApp<App>()
        .UseMauiCommunityToolkit()
        .ConfigureMopups()
    // 其他配置...
}

异常信息

[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidCastException: Specified cast is not valid.
                                                                                                   at Microsoft.Maui.Platform.ElementExtensions.CreateTypeWithInjection(Type viewType, IMauiContext mauiContext) in D:\a\_work\1\s\src\Core\src\Platform\ElementExtensions.cs:line 47
                                                                                                   at Microsoft.Maui.Platform.ElementExtensions.ToHandler(IElement view, IMauiContext context) in D:\a\_work\1\s\src\Core\src\Platform\ElementExtensions.cs:line 85
                                                                                                   ...(省略中间堆栈)
                                                                                                   at Mopups.Droid.Implementation.AndroidMopups.AddAsync(PopupPage page)
                                                                                                   at Mopups.Services.PopupNavigation.<>c__DisplayClass20_0.<<PushAsync>g__PushPage|0>d.MoveNext()
                                                                                                --- End of stack trace from previous location ---

解决方法

1. 修正构造函数名称错误

你的OrganizationPopup类的构造函数名为OrganizationCodePopup,这是严重错误——构造函数名称必须与类名完全一致,否则.NET无法识别为该类的构造函数,导致Mopups通过反射创建实例时失败,引发类型转换异常。

修正后的构造函数:

public partial class OrganizationPopup : PopupPage {
        
    private MyViewModel _viewModel;
    public OrganizationPopup(MyViewModel viewModel) { // 构造函数名改为OrganizationPopup
        BindingContext = _viewModel = viewModel;
        InitializeComponent();
    }
}

2. 正确配置依赖注入

Mopups设计上依赖.NET MAUI的依赖注入容器来管理弹窗实例,手动new弹窗的方式容易和DI机制冲突,建议按以下步骤配置:

步骤1:在MauiProgram中注册弹窗和ViewModel

public static MauiApp CreateMauiApp() {
    var builder = MauiApp.CreateBuilder();
    builder
        .UseMauiApp<App>()
        .UseMauiCommunityToolkit()
        .ConfigureMopups()
        // 注册ViewModel和弹窗
        .Services.AddTransient<MyViewModel>()
        .Services.AddTransient<OrganizationPopup>();

    return builder.Build();
}

步骤2:通过DI获取弹窗并打开

在MyViewModel中注入IPopupNavigation和弹窗实例,避免手动new:

public class MyViewModel {
    private readonly IPopupNavigation _popupNavigation;
    private readonly OrganizationPopup _organizationPopup;

    // 通过构造函数注入依赖
    public MyViewModel(IPopupNavigation popupNavigation, OrganizationPopup organizationPopup) {
        _popupNavigation = popupNavigation;
        _organizationPopup = organizationPopup;
        // 绑定当前ViewModel到弹窗
        _organizationPopup.BindingContext = this;
    }

    // 打开弹窗的方法
    public async Task OpenOrganizationPopup() {
        await _popupNavigation.PushAsync(_organizationPopup);
    }
}

3. 备选方案:保留手动实例化(不推荐)

如果坚持手动new弹窗,需要确保弹窗的构造函数是无参的,或者手动处理所有依赖,同时避免Mopups的DI解析冲突:

// 修改弹窗为无参构造函数,手动设置BindingContext
public partial class OrganizationPopup : PopupPage {
    public OrganizationPopup() {
        InitializeComponent();
    }
}

// 在ViewModel中调用
var popup = new OrganizationPopup();
popup.BindingContext = this;
await MopupService.Instance.PushAsync(popup);

关键说明

  • 异常的核心原因是构造函数名称与类名不匹配,导致反射创建实例时类型转换失败,和DI的直接关联是Mopups内部使用DI容器尝试解析弹窗实例时出错。
  • 始终遵循.NET类的构造函数命名规则,同时尽量使用MAUI的DI机制管理视图和ViewModel实例,避免手动new带来的生命周期和依赖问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:37:33