我正在使用MvvmCross框架,我想從Core項目中調用Android項目中定義的方法。我試圖This解決辦法,但我收到以下錯誤調用PCL項目中UI項目中定義的方法
未處理的異常: System.InvalidOperationException:您必須調用Xamarin.Forms.Init();在使用之前。發生
因爲我沒有使用Xamarin表格,所以我知道這是行不通的。有沒有任何解決方法或任何其他方式來實現這一目標?
我正在使用MvvmCross框架,我想從Core項目中調用Android項目中定義的方法。我試圖This解決辦法,但我收到以下錯誤調用PCL項目中UI項目中定義的方法
未處理的異常: System.InvalidOperationException:您必須調用Xamarin.Forms.Init();在使用之前。發生
因爲我沒有使用Xamarin表格,所以我知道這是行不通的。有沒有任何解決方法或任何其他方式來實現這一目標?
最後找到答案。下面是步驟
我 - 獲取NuGet包 「Xamarin.Forms.Labs」 在你的Android(UI)的項目,顯然現在是Scorchio.NinjaCoder.Xamarin.Forms.Labs
II - 使用在SetUp.cs下面的代碼如下所示
using Android.Content;
using MvvmCross.Core.ViewModels;
using MvvmCross.Droid.Platform;
using Xamarin.Forms.Labs.Services;
namespace SomeProject.UI.Droid
{
public class Setup : MvxAndroidSetup
{
public Setup(Context applicationContext) : base(applicationContext)
{
var resolverContainer = new SimpleContainer();
resolverContainer.Register<IViewMethodCallService>(t => new ViewMethodCallService());
Resolver.SetResolver(resolverContainer.GetResolver());
}
protected override IMvxApplication CreateApp()
{
return new App();
}
}
}
其中「IViewMethodCallService」是接口,具有該方法例如的簽名TestMethod(),在您的PCL項目和「ViewMethodCallService.cs」是在UI或Android項目中實現該接口。
III - 現在創建界面 「IViewMethodCallService」 的對象如下圖所示
IViewMethodCallService callMethod= Resolver.Resolve<IViewMethodCallService>();
callMethod.TestMethod();
的 「ViewMethodCallService.cs」 看起來像這樣
using Android.Util;
[assembly: Xamarin.Forms.Dependency(typeof(ViewMethodCallService))]
namespace SomeProject.UI.Droid
{
public class ViewMethodCallService : Java.Lang.Object, IViewMethodCallService
{
public ViewMethodCallService()
{
}
public void TestMethod()
{
Log.Info("Hurrayyyyyyyyyyyyyyyyyyyyyyyyyy", "And I am calling this service");
}
}
}
我這個答案從this question和鏈接提到的問題,如果你想做更多的研究。希望這可以幫助別人。
DependencyService是Xamarin Forms中的一個功能。如果您正在使用MvvmCross,則應該查看MvvmCross的依賴注入。 https://www.mvvmcross.com/documentation/fundamentals/dependency-injection
謝謝** lowleetak **爲您的答案,但如果我使用依賴注入然後我進入另一個問題,即如何引用PCL的App.cs中的UI類? 因爲這會導致循環依賴和VS不會允許它。如果你能提供一個小例子作爲參考,那將是非常好的。 –
您需要更具體地瞭解您嘗試實現的目標,以便我們提供更多詳細的答案 – lowleetak