如何使用 Greenrobot.EventBus 包在 Xamarin.Forms Android 平台上使用 @Subscribe 批注

问题描述

我正在尝试在 Xamarin 上实现 EventBus,但无法订阅事件,因为当我添加注释 @Subscribe() 时,我收到错误“@Subscribe 在当前上下文中不存在”。当我在没有@Subscribe 注释的情况下运行应用程序时,它向我显示一个错误提示“MainActivity 及其超类没有带有 @Subscribe 注释的公共方法”。请帮助我如何在 Xamarin Android 平台上订阅事件

#MainActivity 类:

public class MainActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this,savedInstanceState);
            // Set our view from the "main" layout resource
           //Registering Event Bus here
            EventBus.Default.Register(this);
       
            SetContentView(Resource.Layout.activity_main);
        }
        
        @Subscribe //Showing me an error while adding this annotation
        public void OnEvent(NetworkInfo networkInfo)
        {
            Console.WriteLine(networkInfo);
        }

        protected void OnDestroy()
        {
            base.OnDestroy();
            EventBus.Default.Unregister(this);
        }
    }

PublisherEvent class:
public class PublishEvent 
    {
      public PublishEvent()
      { 
         EventBus.getDefault().post(message);
      }
    }

解决方法

我不确定 Xamarin Forms 是否支持 EventBus,并且使用 @Subscribe() 与原生 Android 相同。

但是,在 Xamarin Forms 中也有相同的方式。您可以使用 Xamarin.Forms MessagingCenter 来实现这一点,它还可以订阅消息和接收消息。

发送消息:

MessagingCenter.Send<object>(this,"Hi");

订阅消息:

MessagingCenter.Subscribe<object> (this,"Hi",(sender) =>
{
    // Do something whenever the "Hi" message is received
});
,

我能够通过 Xamarin 使 Subscribe 工作

我在这里注意到你的代码

@Subscribe //Showing me an error while adding this annotation
public void OnEvent(NetworkInfo networkInfo)
{
    Console.WriteLine(networkInfo);
}

这是按如下方式实现的吗? (注意使用属性而不是java注解)

[Subscribe] 
public void OnEvent(NetworkInfo networkInfo)
{
    Console.WriteLine(networkInfo);
}

为了使其工作,Android 需要将 Subscribe 属性转换为 Java 中的 @Subscribe 注释。如果您正确设置了该项目,Xamarin 绑定库应该为您创建 SubscribeAttribute(尽管它可能明显缺少 ThreadMode 属性,我可能正在调查很快为我自己!)

无论如何,如果 OnEvent 方法也没有在相应的 Java 类中生成,则该属性不会正确生成。我发现这不会自动发生,所以我只需要在方法中添加 [Export]

[Export]   
[Subscribe] 
public void OnEvent(NetworkInfo networkInfo)
{
    Console.WriteLine(networkInfo);
}

这实际上(有点不明显)记录在案here