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();
在 docs 中明确指出您需要一个适用于所有平台的实现:
You must provide an implementation in every platform project. If no Interface implementation is registered, then the
DependencyService
will be unable to resolve theGet<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 并没有错,实际上是实现此类平台特定功能的唯一方法。
除了 Get
之外,您还可以只检查 return 的值 Get
并且只有在有服务时才使用该服务。在代码中,这将是:
var ds = DependencyService.Get<IKeyboardService>();
if (ds != null)
ds.HideKeyboard();
或单线:
DependencyService.Get<IKeyboardService>()?.HideKeyboard();