Обратный вызов Xamarin MessagingCenter не вызывается - PullRequest
0 голосов
/ 13 февраля 2019

Я использую детектор ориентации устройства с помощью Xamarin MessagingCenter.Что я хотел бы сделать, так это отправлять сообщения из моего проекта MainActivity в Android в реализацию класса Singleton внутри моего проекта .NET Standart.

Как вы видите, я переопределил метод OnConfigurationChanged (...) "внутри моей MainActivity и все точки останова попадают в мои операторы IF, когда я переключаю ориентацию с альбомной на портретную.Проблема в том, что я новее получаю эти сообщения.Обратный вызов внутри моего «OrientationHelper» называется более новым.

«OrientationHelper» запускается при первой загрузке страницы (для тех, кто скажет, что у меня нет экземпляра :))

MainActivity:

public override void OnConfigurationChanged(Android.Content.Res.Configuration newConfig)
{
    base.OnConfigurationChanged(newConfig);

    if (newConfig.Orientation == Android.Content.Res.Orientation.Landscape)
        MessagingCenter.Send(this, "OrientationContract"
            , new OrientationChangedEventArgs(Orientation.Landscape));

    else if (newConfig.Orientation == Android.Content.Res.Orientation.Portrait)
        MessagingCenter.Send(this, "OrientationContract"
            , new OrientationChangedEventArgs(Orientation.Portrait));
}

Класс Singleton, который будет получать сообщения от MainActivity:

public class OrientationHelper
{
    private OrientationHelper()
        => MessagingCenter.Subscribe<OrientationChangedEventArgs>(this, "OrientationContract"
            , s => DeviceOrientation = s.Orientation);

    private static OrientationHelper s_instace;
    public static OrientationHelper Instance
    {
        get
        {
            if (s_instace == null)
                s_instace = new OrientationHelper();
            return s_instace;
        }
    }

    private Orientation _deviceOrientation;
    public Orientation DeviceOrientation
    {
        get => _deviceOrientation;
        private set
        {
            if (_deviceOrientation == value)
                return;
            _deviceOrientation = value;
        }
    }
}

OrientationChangedEventArgs:

public class OrientationChangedEventArgs : EventArgs
{
    public Orientation Orientation { get; private set; }

    public OrientationChangedEventArgs(Orientation orientation)
        => Orientation = orientation;
}

1 Ответ

0 голосов
/ 13 февраля 2019

методы подписки и отправки определены следующим образом

  • Subscribe (подписчик объекта, строковое сообщение, обратный вызов действия, источник TSender = null)

  • Send (отправитель TSender, строковое сообщение) Send (отправитель TSender, строковое сообщение, аргументы TArgs)

первый параметр T в обоих вызовах должен совпадатьтип класса, отправляющего сообщение

MessagingCenter.Send<MyType, OrientationChangedEventArgs>(this, "OrientationContract"
        , new OrientationChangedEventArgs(Orientation.Landscape));

MessagingCenter.Subscribe<MyType, OrientationChangedEventArgs>(this, "OrientationContract"
        , s => DeviceOrientation = s.Orientation);
...