Xamarin.Forms DependencyService не для всех платформ

В документации четко указано, что вам нужна реализация для всех платформ:

Вы должны обеспечить реализацию в каждом проекте платформы. Если реализация интерфейса не зарегистрирована, то DependencyService не сможет решить Get<T>() метод во время выполнения.

Я не предоставил реализацию, и приложение упало. Но что мне делать в том случае, если мне не нужна реализация для этой платформы? Предоставить такой метод без тела?

public void HideKeyboard()
{
    // We need an implementation for the DependencyService, even it is empty.
}

Должен ли я обеспечить реализацию все же?

public void HideKeyboard()
{
    try
    {
        InputPane myInputPane = InputPane.GetForCurrentView();
        myInputPane.TryHide();
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
}

Или это использование DependencyService неправильный вариант здесь?

1 ответ

Решение

Я предполагаю, что вам не нужна реализация на одной платформе, а нужна на другой.

Есть в основном две вещи, которые вы можете сделать:

  • Обеспечьте реализацию без тела на платформе, где вам не нужна фактическая реализация, как вы сами себе предложили
  • или же; поставить проверку платформы вокруг вызова DependencyService.

Если вам это нужно только на iOS, просто сделайте это в своем общем коде:

if (Device.RuntimePlatform == Device.iOS)
    DependencyService.Get<IKeyboardService>().HideKeyboard();

Таким образом, вы не засоряете свой код избыточным классом. Вам нужно добавить это во всех местах, где вы собираетесь выполнить этот код. Так что лучший вариант здесь зависит от вас.

Использование DependencyService не является неправильным и фактически единственным способом достижения такого рода специфической для платформы функциональности.

В дополнение к двум вариантам, которые Джеральд упомянул о реализации без тела или только о вызовеGet на некоторых платформах вы также можете просто проверить возвращаемое значение Getи пользуйтесь сервисом, только если он есть. В коде это будет:

var ds = DependencyService.Get<IKeyboardService>();
if (ds != null)
    ds.HideKeyboard();

или как однострочный:

DependencyService.Get<IKeyboardService>()?.HideKeyboard();
Другие вопросы по тегам