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
相关产品推荐
相关产品推荐

