.NET MAUI依赖注入后出现Android Activity不能为空错误
问题描述
配置.NET MAUI依赖注入后,运行Android项目时抛出以下异常:
System.InvalidOperationException: Android Activity can't be null. at Microsoft.Maui.Controls.Xaml.ApplyPropertiesVisitor.SetPropertyValue(Object xamlelement, XmlName propertyName, Object value, Object rootElement, INode node, HydrationContext context, IXmlLineInfo lineInfo) in D:\a\_work\1\s\src\Controls\src\Xaml\ApplyPropertiesVisitor.cs:line 379 at Microsoft.Maui.Controls.Xaml.ApplyPropertiesVisitor.Visit(ValueNode node, INode parentNode) in D:\a\_work\1\s\src\Controls\src\Xaml\ApplyPropertiesVisitor.cs:line 62 at Microsoft.Maui.Controls.Xaml.ValueNode.Accept(IXamlNodeVisitor visitor, INode parentNode) in D:\a\_work\1\s\src\Controls\src\Xaml\XamlNode.cs:line 92 at Microsoft.Maui.Controls.Xaml.ElementNode.Accept(IXamlNodeVisitor visitor, INode parentNode) in D:\a\_work\1\s\src\Controls\src\Xaml\XamlNode.cs:line 153 at Microsoft.Maui.Controls.Xaml.RootNode.Accept(IXamlNodeVisitor visitor, INode parentNode) in D:\a\_work\1\s\src\Controls\src\Xaml\XamlNode.cs:line 210 at Microsoft.Maui.Controls.Xaml.XamlLoader.Visit(RootNode rootnode, HydrationContext visitorContext, Boolean useDesignProperties) in D:\a\_work\1\s\src\Controls\src\Xaml\XamlLoader.cs:line 210 at Microsoft.Maui.Controls.Xaml.XamlLoader.Load(Object view, String xaml, Assembly rootAssembly, Boolean useDesignProperties) in D:\a\_work\1\s\src\Controls\src\Xaml\XamlLoader.cs:line 78 at Microsoft.Maui.Controls.Xaml.XamlLoader.Load(Object view, String xaml, Boolean useDesignProperties) in D:\a\_work\1\s\src\Controls\src\Xaml\XamlLoader.cs:line 53 at Microsoft.Maui.Controls.Xaml.XamlLoader.Load(Object view, Type callingType) in D:\a\_work\1\s\src\Controls\src\Xaml\XamlLoader.cs:line 49 at Microsoft.Maui.Controls.Xaml.Extensions.LoadFromXaml[LoginPage](LoginPage view, Type callingType) in D:\a\_work\1\s\src\Controls\src\Xaml\ViewExtensions.cs:line 37
异常触发在自动生成的LoginPage代码中,相关配置代码如下:
MauiProgram.cs
public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .UseMauiCommunityToolkit() .ConfigureFonts(fonts => { fonts.AddFont("Montserrat-Black.ttf", "Montserrat-Black"); }); builder.Services.AddBusinessDependencies(); builder.Services.AddSDKDependencies(); builder.Services.AddTransient<LoginPageModel>(); builder.Services.AddTransient<LoginPage>(); builder.Services.AddTransient<HttpClient>(); builder.Services.AddScoped<ICoreMethods, CoreMethods>(); var executingAssembly = Assembly.GetExecutingAssembly(); #if DEBUG builder.Logging.AddDebug(); using var stream = executingAssembly.GetManifestResourceStream("BoB.Mobile.appsettings.development.json"); #else using var stream = executingAssembly.GetManifestResourceStream("BoB.Mobile.appsettings.production.json"); #endif var config = new ConfigurationBuilder() .AddJsonStream(stream) .Build(); var sdkSettings = config.GetSection("settings").Get<SdkSettings>(); builder.Services.AddSingleton(sdkSettings); return builder.Build(); }
App.xaml.cs
public partial class App : Application { public App(LoginPage page) { InitializeComponent(); MainPage = page; } }
LoginPageModel.cs
public class LoginPageModel : BasePageModel { private readonly IAuthenticationManager _authenticationManager; private readonly ICoreMethods _coreMethods; public LoginPageModel(IAuthenticationManager authenticationManager, ICoreMethods coreMethods) { _authenticationManager = authenticationManager; _coreMethods = coreMethods; OnLoginPressedCommand = new Command(OnLoginPressed); } }
LoginPage.xaml.cs
public partial class LoginPage : ContentPage { public LoginPage(LoginPageModel viewModel) { BindingContext = viewModel; InitializeComponent(); } }
排查原因
异常核心原因是LoginPage构造函数中先设置BindingContext,再调用InitializeComponent()。在Android平台上,InitializeComponent()是加载并解析XAML的关键步骤,此时页面尚未关联到Android Activity上下文。提前设置BindingContext会导致XAML解析过程中尝试访问未初始化的Activity,从而抛出"Android Activity can't be null"的异常。
解决方法
调整LoginPage构造函数的执行顺序,先调用InitializeComponent()完成XAML加载和页面初始化,再设置BindingContext:
修改后的LoginPage.xaml.cs:
public partial class LoginPage : ContentPage { public LoginPage(LoginPageModel viewModel) { InitializeComponent(); BindingContext = viewModel; } }
此调整确保页面在完成基础初始化(包括关联Activity上下文)后,再绑定视图模型,避免XAML解析时出现上下文缺失的问题。
内容的提问来源于stack exchange,提问作者user2761804
相关产品推荐
相关产品推荐

