Xamarin.Forms DependencyService并非适用于所有平台

时间:2018-04-23 11:07:39

标签: xamarin xamarin.forms dependency-resolver

docs中明确指出,您需要针对所有平台实施:

  

您必须在每个平台项目中提供实施。如果不   接口实现已注册,然后是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使用了错误的选项吗?

2 个答案:

答案 0 :(得分:2)

我假设您不需要在一个平台上实现,但在另一个平台上执行

你基本上可以做两件事:

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

如果您只在iOS上使用它,请在共享代码中执行此操作:

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

这样您就不会使用冗余类来丢弃代码。您需要在所有位置添加此项,以便执行此代码。那么更好的选择取决于你。

使用DependencyService并不是错误的,实际上是达到此类平台特定功能的唯一方法。

答案 1 :(得分:1)

除了two options Gerald mentioned具有无主体实现或仅在特定平台上调用Get之外,您还可以仅检查Get的返回值,并且仅在存在以下情况时才使用服务是一个。在代码中,应为:

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

或单线:

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