2

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

您必须在每个平台项目中提供一个实现。如果没有注册接口实现,则将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这里使用了错误的选项?

4

2 回答 2

5

我假设您不需要在一个平台上实现,而是在另一个平台上实现

基本上你可以做两件事:

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

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

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

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

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

于 2018-04-23T11:20:49.887 回答
1

除了Gerald 提到的无主体实现或仅Get在选择的平台上调用这两个选项之外,您还可以只检查返回值Get并仅在有服务的情况下使用该服务。在代码中,这将是:

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

或作为单行:

DependencyService.Get<IKeyboardService>()?.HideKeyboard();
于 2019-12-05T16:11:23.100 回答