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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:10:47