使用Shiny.NET MAUI时IBleManager为空的问题求助
问题分析与解决
核心问题1:MainPage构造函数未触发依赖注入
你的MainPage存在两个构造函数,MAUI默认会调用无参构造函数,导致通过依赖注入传入的IBleManager从未被赋值,bleManager变量始终为null。跳转BluePage时传递的是null值,最终导致BluePage中的_bleManager为空。
核心问题2:手动注册IBleManager引发冲突
UseShiny()扩展方法已经自动注册了Shiny.NET的所有核心服务(包括IBleManager),手动添加.Services.AddSingleton<IBleManager, BleManager>()会覆盖默认注册,破坏Shiny内部的初始化逻辑。
修复步骤
1. 修正MauiProgram.cs,移除手动注册代码
using Microsoft.Extensions.Logging; using Shiny; using Shiny.BluetoothLE; namespace shinyTest { public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .UseShiny() // 此方法已自动完成IBleManager的注册 .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }); #if DEBUG builder.Logging.AddDebug(); #endif return builder.Build(); } } }
2. 修正MainPage.xaml.cs,保留依赖注入构造函数
using Shiny.BluetoothLE; namespace shinyTest { public partial class MainPage : ContentPage { int count = 0; private readonly IBleManager bleManager; // 仅保留带依赖注入参数的构造函数 public MainPage(IBleManager bleManager) { InitializeComponent(); this.bleManager = bleManager; } private async void OnCounterClicked(object sender, EventArgs e) { await Navigation.PushAsync(new BluePage(bleManager)); } } }
3. 增强BluePage构造函数的安全性
可以在BluePage构造函数中添加空值校验,提前发现问题:
public BluePage(IBleManager bleManager) { InitializeComponent(); _bleManager = bleManager ?? throw new ArgumentNullException(nameof(bleManager)); }
额外检查项
- 平台权限配置:
- Android:在
AndroidManifest.xml中添加对应蓝牙权限(Android 12及以下需BLUETOOTH、BLUETOOTH_ADMIN、ACCESS_FINE_LOCATION;Android 13+需BLUETOOTH_SCAN、BLUETOOTH_CONNECT)。 - iOS:在
Info.plist中添加NSBluetoothAlwaysUsageDescription和NSBluetoothPeripheralUsageDescription权限描述。
- Android:在
- 版本兼容:确保Shiny.NET版本与当前MAUI版本匹配,建议使用最新稳定版。
内容的提问来源于stack exchange,提问作者Shubhankar Pande
相关产品推荐
相关产品推荐

