Xamarin.Forms DependencyService 不适用于所有平台

Xamarin.Forms DependencyService not for all platforms

docs 中明确指出您需要一个适用于所有平台的实现:

You must provide an implementation in every platform project. If no Interface implementation is registered, then the DependencyService will be unable to resolve the Get<T>() method at runtime.

我没有提供实现,所以应用程序崩溃了。但是在这种情况下我应该怎么做,我不需要那个平台的实现?提供这样的无体方法?

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 是错误的选项吗?

我假设您不需要在一个平台上实施,但 在另一个平台上实施。

基本上您可以做两件事:

  • 在不需要实际实现的平台上提供无主体实现,就像您自己建议的那样
  • 或;检查 DependencyService 调用周围的平台。

如果您只在 iOS 上需要它,只需在您的共享代码中这样做:

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

这样您就不会在代码中乱扔冗余 class。您确实需要在要执行此代码的 all 处添加此代码。所以这里有什么更好的选择取决于你。

使用 DependencyService 并没有错,实际上是实现此类平台特定功能的唯一方法。

除了 在 select 平台上具有无主体实现或仅调用 Get 之外,您还可以只检查 return 的值 Get 并且只有在有服务时才使用该服务。在代码中,这将是:

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

或单线:

DependencyService.Get<IKeyboardService>()?.HideKeyboard();