簡體   English   中英

如何使用 Xamarin.Forms 中的 DependencyService 在共享代碼中獲取平台特定代碼的 static 成員?

[英]How to get static member of platform specific code in shared code using DependencyService in Xamarin.Forms?

我正在實現一次選擇多個文件的 MediaPicker 服務。 一切正常,當我使用LoadApplication(new App(MultiMediaPickerService.SharedInstance)); 我用它在我的共享代碼中初始化IMultiMediaPickerService

但我想使用依賴服務來初始化和調用平台特定代碼中的方法。

簡而言之,目前我正在將LoadApplication(new App(SharedInstance))中的 object 傳遞給我的共享項目。 SharedInstanceMultiMediaPickerService的 static object 。 因此,實例被傳遞到共享項目。 但我想使用Dependency Service來做到這一點。

這是我在共享項目中的接口 IMultiMediaPickerService:

public interface IMultiMediaPickerService
{
    event EventHandler<MediaFile> OnMediaPicked;
    ...
}

平台項目(Android)中的MultiMediaPickerService:

[assembly: Dependency(typeof(MyProject.Droid.MultiMediaPickerService))]
namespace MyProject.Droid
{
    public class MultiMediaPickerService : IMultiMediaPickerService
    {
        public static MultiMediaPickerService SharedInstance = new MultiMediaPickerService();
        ...
    }
}

平台項目(Android)中的MainActivity:

protected override void OnCreate(Bundle savedInstanceState)
{
    ...
    LoadApplication(new App(MultiMediaPickerService.SharedInstance));
}

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    MultiMediaPickerService.SharedInstance.OnActivityResult(requestCode, resultCode, data);
}

我使用上述方法從我的共享項目中訪問MultiMediaPickerService.SharedInstance 但我想使用 DependencyService 訪問它,就像:

var multiMediaPickerService = DependencySevice.Get<IMultiMediaPickerService>();
multiMediaPickerService.OnMediaPicked += (s, a) => { Debug.WriteLine("Media Picked"); };

由於這是創建另一個實例,我沒有得到 static object MultiMediaPickerService.SharedInstance 怎么做? 如何使用 DependencyService 從共享項目訪問平台代碼的 static 成員?

我認為您想要的事情可以在沒有任何 static 成員的情況下完成。 您只需要在 DependencyService 中將 IMultiMediaPickerService 的實例注冊為IMultiMediaPickerService

IMultiMediaPickerService.cs

public interface IMultiMediaPickerService
{
    ...
}

MultiMediaPickerService.cs(Android 實現)

//[assembly: Dependency(typeof(MyProject.Droid.MultiMediaPickerService))] <-- remove this
namespace MyProject.Droid
{
    public class MultiMediaPickerService : IMultiMediaPickerService
    {
        ...
        //no static shared instance here
    }
}

MainActivity.cs

protected override void OnCreate(Bundle savedInstanceState)
{
    ...
    //register an instance of MultiMediaPickerService as a singleton, the same instance will be returned whenever you ask for it using DependencySevice.Get<T>. Effectively, this gives you a shared instance without using static members
    var multiMediaPickerService = new MultiMediaPickerService();
    DependencyService.RegisterSingleton<IMultiMediaPickerService>(multiMediaPickerService);
    //use the instance to initialize the app
    LoadApplication(new App(multiMediaPickerService));
}

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    //whenever using the IMultiMediaPickerService, get it using the DependencyService.Get<T> method
    var multiMediaPickerService = DependencyService.Get<IMultiMediaPickerService>();
    multiMediaPickerService.OnActivityResult(requestCode, resultCode, data);
}

用法

//whenever using the IMultiMediaPickerService, get it using the DependencyService.Get<T> method
var multiMediaPickerService = DependencySevice.Get<IMultiMediaPickerService>();
multiMediaPickerService.OnMediaPicked += (s, a) => { Debug.WriteLine("Media Picked"); };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM