Suche…


Bemerkungen

Wenn Sie DependencyService , benötigen Sie normalerweise 3 Teile:

  • Schnittstelle - Hier werden die Funktionen definiert, die Sie abstrahieren möchten.
  • Plattformimplementierung - Eine Klasse in jedem plattformspezifischen Projekt, die die zuvor definierte Schnittstelle implementiert.
  • Registrierung - Jede plattformspezifische Implementierungsklasse muss über ein Metadatenattribut beim DependencyService registriert werden. Dadurch kann der DependencyService Ihre Implementierung zur Laufzeit finden.

Wenn Sie DependencyService Sie für jede Plattform, auf die Sie abzielen, eine Implementierung bereitstellen. Wenn keine Implementierung bereitgestellt wird, schlägt die Anwendung zur Laufzeit fehl.

Schnittstelle

Die Schnittstelle definiert das Verhalten, das Sie über den DependencyService verfügbar machen möchten. Ein Beispiel für die Verwendung eines DependencyService ist ein Text-To-Speech-Dienst. Es gibt derzeit keine Abstraktion für diese Funktion in Xamarin.Forms. Sie müssen also eigene erstellen. Beginnen Sie mit der Definition einer Schnittstelle für das Verhalten:

public interface ITextToSpeech
{
       void Speak (string whatToSay);
}

Da wir unsere Schnittstelle definieren, können wir aus unserem gemeinsam genutzten Code dagegen codieren.

Anmerkung: Klassen, die die Schnittstelle implementieren, müssen über einen parameterlosen Konstruktor verfügen, um mit dem DependencyService .

iOS-Implementierung

Die von Ihnen definierte Schnittstelle muss in jeder Zielplattform implementiert werden. Für iOS erfolgt dies über das AVFoundation Framework. Die folgende Implementierung der ITextToSpeech Schnittstelle behandelt das Sprechen eines bestimmten Textes in Englisch.

using AVFoundation;

public class TextToSpeechiOS : ITextToSpeech
{
    public TextToSpeechiOS () {}

    public void Speak (string whatToSay)
    {
        var speechSynthesizer = new AVSpeechSynthesizer ();

        var speechUtterance = new AVSpeechUtterance (whatToSay) {
            Rate = AVSpeechUtterance.MaximumSpeechRate/4,
            Voice = AVSpeechSynthesisVoice.FromLanguage ("en-US"),
            Volume = 0.5f,
            PitchMultiplier = 1.0f
        };

        speechSynthesizer.SpeakUtterance (speechUtterance);
    }
}

Wenn Sie Ihre Klasse erstellt haben, müssen Sie den DependencyService aktivieren, um ihn zur Laufzeit zu erkennen. Dies geschieht durch Hinzufügen eines Attributs [assembly] über der Klassendefinition und außerhalb von Namespacedefinitionen.

using AVFoundation;
using DependencyServiceSample.iOS;

[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechiOS))]
namespace DependencyServiceSample.iOS {
    public class TextToSpeechiOS : ITextToSpeech
...

Dieses Attribut registriert die Klasse beim DependencyService sodass es verwendet werden kann, wenn eine Instanz der ITextToSpeech Schnittstelle benötigt wird.

Geteilter Code

Nachdem Sie plattformspezifische Klassen erstellt und registriert haben, können Sie sie mit Ihrem freigegebenen Code verknüpfen. Die folgende Seite enthält eine Schaltfläche, die die Text-zu-Sprache-Funktion mit einem vordefinierten Satz auslöst. Es verwendet DependencyService , um eine plattformspezifische Implementierung von ITextToSpeech zur Laufzeit mithilfe der nativen SDKs ITextToSpeech .

public MainPage ()
{
    var speakButton = new Button {
        Text = "Talk to me baby!",
        VerticalOptions = LayoutOptions.CenterAndExpand,
        HorizontalOptions = LayoutOptions.CenterAndExpand,
    };
    
    speakButton.Clicked += (sender, e) => {
        DependencyService.Get<ITextToSpeech>().Speak("Xamarin Forms likes eating cake by the ocean.");
    };
    
    Content = speakButton;
}

Wenn Sie diese Anwendung auf einem iOS- oder Android-Gerät ausführen und auf die Schaltfläche tippen, hören Sie, dass die Anwendung den angegebenen Satz spricht.

Android-Implementierung

Die Android-spezifische Implementierung ist etwas komplexer, da Sie dazu Java.Lang.Object von einem nativen Java.Lang.Object zu erben und die IOnInitListener Schnittstelle zu implementieren. Für Android müssen Sie einen gültigen Android-Kontext für viele der SDK-Methoden bereitstellen, die verfügbar gemacht werden. Xamarin.Forms macht ein Forms.Context Objekt Forms.Context , das Ihnen einen Android-Kontext zur Verfügung stellt, den Sie in solchen Fällen verwenden können.

using Android.Speech.Tts;
using Xamarin.Forms;
using System.Collections.Generic;
using DependencyServiceSample.Droid;

public class TextToSpeechAndroid : Java.Lang.Object, ITextToSpeech, TextToSpeech.IOnInitListener
{
    TextToSpeech _speaker;

    public TextToSpeechAndroid () {}

    public void Speak (string whatToSay)
    {
        var ctx = Forms.Context;

        if (_speaker == null) 
        {
            _speaker = new TextToSpeech (ctx, this);
        } 
        else 
        {
            var p = new Dictionary<string,string> ();
            _speaker.Speak (whatToSay, QueueMode.Flush, p);
        }
    }

    #region IOnInitListener implementation
    
    public void OnInit (OperationResult status)
    {
        if (status.Equals (OperationResult.Success)) 
        {
            var p = new Dictionary<string,string> ();
            _speaker.Speak (toSpeak, QueueMode.Flush, p);
        }
    }
    
    #endregion
}

Wenn Sie Ihre Klasse erstellt haben, müssen Sie den DependencyService aktivieren, um ihn zur Laufzeit zu erkennen. Dies geschieht durch Hinzufügen eines Attributs [assembly] über der Klassendefinition und außerhalb von Namespacedefinitionen.

using Android.Speech.Tts;
using Xamarin.Forms;
using System.Collections.Generic;
using DependencyServiceSample.Droid;


[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechAndroid))]
namespace DependencyServiceSample.Droid {
    ...

Dieses Attribut registriert die Klasse beim DependencyService sodass es verwendet werden kann, wenn eine Instanz der ITextToSpeech Schnittstelle benötigt wird.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow