为何调用DependencyService.Get<T>()会触发App()构造方法?
为什么调用DependencyService.Get()会触发App构造方法?
嘿,这个问题的根源其实就在你的MyReceiver代码里——你直接在里面new了一个App实例:private readonly App app = new App();。咱们来捋一遍整个调用链条,你就明白为什么会触发App构造了:
- 当你在
MainPage的构造方法里调用DependencyService.Get<IMyService>()时,DependencyService会根据你注册的依赖关系,创建MyService的实例。 MyService初始化的时候,会创建MyReceiver的实例(因为_myReceiver = new MyReceiver();是它的私有字段初始化逻辑)。- 而创建
MyReceiver实例的过程中,它的私有字段app会被初始化,也就是执行new App(),这就直接触发了App类的构造方法。
这里要注意,在Xamarin.Forms里,App是整个应用的入口类,框架会自动帮你初始化一次全局的实例。手动new App()会生成一个完全独立的App对象,这不仅会触发构造方法,还可能带来各种奇怪的问题——比如页面导航逻辑混乱、服务实例重复创建等。
给你两个修正方案:
方案1:直接使用MessagingCenter全局发送(推荐)
MessagingCenter本身是全局静态的,不需要传递App实例也能正常工作,修改MyReceiver的代码:
public class MyReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { // 直接发送消息,不需要依赖App实例 MessagingCenter.Send<object, string>(this, "item", intent.GetStringExtra("item")); } }
方案2:获取当前已存在的App实例
如果你确实需要用到App的实例,不要自己new,而是获取框架已经初始化好的全局实例:
public class MyReceiver : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { var currentApp = (App)Application.Current; MessagingCenter.Send(currentApp, "item", intent.GetStringExtra("item")); } }
这样修改后,再调用DependencyService.Get<IMyService>()就不会再触发App的构造方法啦。
内容的提问来源于stack exchange,提问作者lsaudon
相关产品推荐
相关产品推荐

