我正在尝试从 Xamarin 迁移到 MAUI。
下面的代码完美唤醒。
Xamarin 项目:
DependencyService.Get<IMyService>().Test();
Run Code Online (Sandbox Code Playgroud)
安卓:
[assembly: Dependency(typeof(MyService))]
namespace MyProject.Android
{
public class MyService: IMyService
{
public void Test(){
////
}
}
}
Run Code Online (Sandbox Code Playgroud)
IOS 和 Windows 依此类推。
但 MAUI 的DependencyService.Get 始终返回null。我找不到必须做出哪些新的改变。在我的主项目中重新编写基于 DependencyService 的所有代码将是痛苦的。
这种情况下应该做哪些改变呢?
而不是自动注入您的服务实现:
[assembly: Dependency(typeof(MyService))]
Run Code Online (Sandbox Code Playgroud)
手动执行:
DependencyService.Register<IMyService, MyService>();
Run Code Online (Sandbox Code Playgroud)
在您的 MauiApplication 子类中(MauiWinUIApplication (windows)/MauiUIApplicationDelegate (ios)/ MauiApplication(android) ...等)
您在 MAUI 中没有平台依赖服务的概念,您可以使用条件编译或部分类来执行您需要执行的操作。
因此,如果您在此处查看 Microsoft 博客: https: //learn.microsoft.com/en-us/dotnet/maui/platform-integration/invoke-platform-code,它会向您展示如何使用这两种方式来调用平台代码。
所以通过条件编译得到Orientation:
#if ANDROID
using Android.Content;
using Android.Views;
using Android.Runtime;
#elif IOS
using UIKit;
#endif
using InvokePlatformCodeDemos.Services;
namespace InvokePlatformCodeDemos.Services.ConditionalCompilation
{
public class DeviceOrientationService
{
public DeviceOrientation GetOrientation()
{
#if ANDROID
IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
bool isLandscape = orientation == SurfaceOrientation.Rotation90 || orientation == SurfaceOrientation.Rotation270;
return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
#elif IOS
UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
bool isPortrait = orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown;
return isPortrait ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
#else
return DeviceOrientation.Undefined;
#endif
}
}
}
Run Code Online (Sandbox Code Playgroud)
或部分课程
共享代码:
namespace InvokePlatformCodeDemos.Services.PartialMethods
{
public partial class DeviceOrientationService
{
public partial DeviceOrientation GetOrientation();
}
}
Run Code Online (Sandbox Code Playgroud)
平台代码:
using Android.Content;
using Android.Runtime;
using Android.Views;
namespace InvokePlatformCodeDemos.Services.PartialMethods;
public partial class DeviceOrientationService
{
public partial DeviceOrientation GetOrientation()
{
IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
bool isLandscape = orientation == SurfaceOrientation.Rotation90 || orientation == SurfaceOrientation.Rotation270;
return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6740 次 |
| 最近记录: |