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

Xamarin中MVVMCross的Setup类实例化及启动异常排查

问题排查与最小可运行实现方案

看起来你遇到的核心问题是Setup类无法被MvvmCross实例化,再加上CreateApp返回null,直接导致了启动时的未处理异常。下面一步步帮你修复,同时解释Setup类的实例化逻辑:

1. 修复Setup类的关键问题

你的Setup构造函数用了protected修饰符,MvvmCross没办法从外部实例化它;而且CreateApp返回null,导致应用没有核心的App实例,这两个是触发异常的直接原因。修改后的Setup类应该是这样:

public class Setup : MvxAndroidSetup
{
    // 改为public构造函数,让MvvmCross能正常实例化
    public Setup(Context applicationContext) : base(applicationContext) { }

    // 返回PCL项目中定义的App实例,而非null
    protected override IMvxApplication CreateApp() 
    { 
        return new App(); 
    }
}

2. 完善PCL中的App类

你的App类需要注册自定义的AppStart,否则MvvmCross不知道启动后要导航到哪个ViewModel。更新App的Initialize方法:

public class App : MvxApplication
{
    public override void Initialize() 
    { 
        base.Initialize();
        // 注册我们定义的AppStart,告诉MvvmCross启动逻辑
        RegisterAppStart<AppStart>();
    }
}

3. 验证启动屏的主题配置

你的SplashScreen代码逻辑没问题,但要确保@style/Theme.Splash在Android项目的Resources/values/styles.xml中正确定义,比如:

<style name="Theme.Splash" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="android:windowBackground">@drawable/splash_background</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
</style>

(如果不需要自定义启动背景,也可以使用MvvmCross的默认主题,但必须保证主题存在)

4. MvvmCross中Setup类的实例化逻辑

MvvmCross在Android平台的启动流程里,通过MvxAndroidSetupSingleton自动处理Setup的实例化:

  • 当你的SplashScreen(继承自MvxSplashScreenActivity)启动时,它的OnCreate方法会触发MvvmCross的初始化流程
  • MvxAndroidSetupSingleton会通过反射查找当前项目中继承自MvxAndroidSetup的类,然后实例化它
  • Setup类是连接Android平台项目和PCL项目的核心:它负责初始化MvvmCross的IoC容器、注册平台专属服务、创建并初始化App实例,是整个框架启动的基础

完成以上修改后,调试器应该会正常进入Setup的构造函数,应用也能顺利启动并导航到MainViewModel。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:38:26