2016-06-09 6 views
0

Ich habe die neueste Xamarin Alpha installiert und kann nicht UWP und DependencyService arbeiten.Xamarin.Forms DependencyService Get() Methode gibt Null in PCL zurück

Im UWP Projekt habe ich:

Forms.Init(e); 

// For release version, doc said debug will do this itself 
DependencyService.Register<SpecialInterface>(); 
IInterface1 iinterface1 = DependencyService.Get<IInterface1>(); 

Diese die Schnittstelle Zeiger findet.

In einem PCL ich habe:

IInterface1 iinterface1 = DependencyService.Get<IInterface1>(); 

In einem View-Modell in der PCL enthält (nach einem Button-Klick) ist es nicht einen null Wert für den Get<IInterface1>() Anruf auf beiden UWP und Android zurück.

ist die Umsetzung in der UWP Projekt enthalten:

using PrismUnityApp2.UWP; 
using SharedProject1; 
using Xamarin.Forms; 

[assembly: Dependency(typeof(SpecialInterface))] 

namespace PrismUnityApp2.UWP 
{ 
    public class SpecialInterface : IInterface1 
    { 
     public SpecialInterface() { } 

     public int TestMethod(int i) 
     { 
      return i; 
     } 
    } 
} 

Schließlich wird die Schnittstelle in einem freigegebenen Projekt wie folgt definiert:

namespace SharedProject1 
{ 
    internal interface IInterface1 
    { 
     int TestMethod(int i); 
    } 
} 

ich die Probe "UsingDependencyService" haben arbeiten in Android, WinPhone schlägt fehl, weil HyperV für Android ausgeschaltet ist.

Was fehlt mir?

Danke für jede Hilfe.

Mit folgenden Pakete/Versionen:

  • Prism.Unity.Forms 6.2.0.pre4
  • Prism.Forms 6.1.0.pre4
  • Xamarin.Forms 2.2.0.45
  • Unity 4.0.1
  • Windows-10 UWP

    public void OnNavigatedTo(NavigationParameters parameters) 
    { 
        if (parameters.ContainsKey("title")) 
         Title = (string) parameters["title"] + " and Prism"; 
    
        IInterface1 iinterface1 = DependencyService.Get<IInterface1>(); 
        if (iinterface1 != null) 
        { 
         int value = iinterface1.TestMethod(1); 
         Title += " ::: " + value; 
        } 
    } 
    
+0

Versuchen Sie, die Schnittstelle öffentlich zu machen? –

+0

Das wäre eine einfache Lösung gewesen, aber ich ersetzte interne mit öffentlichen und es schlägt immer noch fehl. Ich werde es heute noch einmal anschauen, damit ich etwas finden kann –

+0

Sie sollten den Aufruf der Registermethode nicht benötigen, das Attribut sollte ausreichen. Können Sie den Code mit dem DependencyService.Get und der Click-Behandlung veröffentlichen? –

Antwort

1

Der Aufruf DependencyService.Get<IInterface1>() gibt in der PCL null zurück, weil es nach einer anderen Version von IInterface1 sucht, die tatsächlich mehrmals definiert wird.

Da IInterface1 in einem freigegebenen Projekt befindet, die sowohl vom PCL-Projekt und die UWP & Android Projekte verwiesen, es ist im Grunde die gleiche wie die Schnittstelle separat bei der Erstellung sowohl die PCL und App-Projekte mit dem gleichen Namen und Unterschrift. Die Elternbaugruppe ist jedoch anders.

Wenn Sie sind IInterface1 in bestehenden PCL oder eine separate PCL zu bewegen, die sowohl von der bestehenden PCL und App-Projekten verwiesen wird, sollte DependencyService Lage sein, Ihre plattformspezifische Implementierung zu lokalisieren, SpecialInterface, wie erwartet.

0

Wenn jemand auf null Ergebnis Bezug auf Xamarin, iOS: ImagePickerService

DependencyService.Bekommen();

Was ich war umfassen entgehen,

Xamarin.Forms.DependencyService.Register<Xamarin.Forms.ImagePicker.IImagePickerService, Xamarin.Forms.ImagePicker.iOS.ImagePickerService>(); 

auf AppDelegate, Verfahren FinishedLaunching.

Referenz: https://github.com/matheusneder/Xamarin.Forms.ImagePicker