Как установить ParentActivityOrWindow в Android с помощью Xamarin Prism - PullRequest
0 голосов
/ 17 января 2020

Я переписываю свое ванильное приложение Xamarin для использования библиотеки Prism.

Текущее приложение использует Azure ADB2 C для авторизации с использованием этой платформы .

Android необходимо установить родительское окно, что достигается добавлением этого кода в файл MainActivity.cs проекта Android:

var authenticationService = DependencyService.Get<IAuthenticationService>();
authenticationService.SetParent(this);

Это не работает для приложения Prism, authenticationService нулевой. Для записи используемым здесь DependencyService является Xamarin.Forms.DependencyService.

Я также попробовал пример из Prism docs и поместил этот код в AndroidInitializer:

public void RegisterTypes(IContainerRegistry container)
{
    // Register any platform specific implementations
    container.RegisterSingleton<IAuthenticationService, B2CAuthenticationService>("B2CAuthenticationService");
    var authService = Container.Resolve<IAuthenticationService>();

    authService.SetParent(this);
}

В этом коде контейнер (который является контейнером DryIo C) не имеет определения для разрешения.

Для полноты, это мой App.cs RegisterTypes:

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterSingleton<IAuthenticationService, B2CAuthenticationService>();
    ...
    ...
}

1 Ответ

0 голосов
/ 17 января 2020

Есть несколько неправильных предположений, которые вы делаете здесь. Для начала вы заметите, что IContainerRegistry определенно имеет имя Registry, что подразумевает, что мы не хотим, чтобы вы разрешали типы здесь. Вот почему вы видите не метод Resolve, а экземпляр IContainerProvider.

По своей конструкции Prism больше не работает напрямую с Xamarin.Forms DependencyService, поскольку это полный анти-шаблон. Тем не менее, если вы будете следовать инструкциям по регистрации типов платформы Platifi c, вы сможете увидеть, как использовать IPlatformInitializer для регистрации типов платформы c. Здесь важно понимать, что IPlatformInitializer вызывается до того, как RegisterTypes вызывается в PrismApplication.

Я хотел бы предложить ввести IParentWindowProvider, например:

public interface IParentWindowProvider
{
    object Parent { get; }
}

Затем вы можете реализовать это на Android например:

public class MainActivity : IPlatformInitializer, IParentWindowProvider
{
    object IParentWindowProvider.Parent => this;

    void IPlatformInitializer.RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterInstance<IParentWindowProvider>(this);
    }
}

Тогда в вашем приложении вы можете сделать что-то вроде:

protected override void OnInitialized()
{
    if(Container.IsRegistered<IParentWindowProvider>())
    {
        var provider = Container.Resolve<IParentWindowProvider>();
        var authService = Container.Resolve<IAuthenticationService>();
        authService.SetParent(provider.Parent);
    }
}

Для получения дополнительной информации обязательно ознакомьтесь с соответствующими документами и образцом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...