Sök…


Anmärkningar

När du använder DependencyService behöver du vanligtvis 3 delar:

  • Gränssnitt - Detta definierar de funktioner du vill abstrahera.
  • Platformimplementering - En klass inom varje plattformsspecifikt projekt som implementerar det tidigare definierade gränssnittet.
  • Registrering - Varje plattformsspecifik implementeringsklass måste registreras med DependencyService genom ett metadataattribut. Detta gör att DependencyService kan hitta din implementering vid körning.

När du använder DependencyService måste du tillhandahålla en implementering för varje plattform som du riktar in. När en implementering inte tillhandahålls misslyckas applikationen vid körtid.

Gränssnitt

Gränssnittet definierar beteendet som du vill exponera genom DependencyService . Ett exempel på användning av en DependencyService är en text-till-tal-tjänst. Det finns för närvarande ingen abstraktion för denna funktion i Xamarin.Forms, så du måste skapa din egen. Börja med att definiera ett gränssnitt för beteendet:

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

Eftersom vi definierar vårt gränssnitt kan vi koda mot det från vår delade kod.

Obs: Klasser som implementerar gränssnittet måste ha en parameterlös konstruktör för att fungera med DependencyService .

iOS-implementering

Gränssnittet du definierade måste implementeras i varje riktad plattform. För iOS görs detta via AVFoundation ramverket. Följande implementering av ITextToSpeech gränssnittet hanterar att tala en given text på engelska.

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);
    }
}

När du har skapat din klass måste du aktivera DependencyService att upptäcka den vid körning. Detta görs genom att lägga till ett [assembly] -attribut ovanför klassdefinitionen och utanför eventuella namnområdedefinitioner.

using AVFoundation;
using DependencyServiceSample.iOS;

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

Detta attribut registrerar klassen med DependencyService så att den kan användas när en instans av ITextToSpeech gränssnittet behövs.

Delad kod

När du har skapat och registrerat dina plattformspecifika klasser kan du börja ansluta dem till din delade kod. Följande sida innehåller en knapp som utlöser funktionen text-till-tal med en fördefinierad mening. Den använder DependencyService att hämta en plattformsspecifik implementering av ITextToSpeech vid körning med de ursprungliga SDK: erna.

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;
}

När du kör denna applikation på en iOS- eller Android-enhet och knackar på knappen kommer du att höra applikationen tala den angivna meningen.

Android-implementering

Den Android-specifika implementeringen är lite mer komplex eftersom den tvingar dig att ärva från ett ursprungligt Java.Lang.Object och tvingar dig att implementera IOnInitListener gränssnittet. Android kräver att du tillhandahåller ett giltigt Android-sammanhang för många av de SDK-metoder som den exponerar. Xamarin.Forms exponerar ett Forms.Context objekt som ger dig en Android-kontext som du kan använda i sådana fall.

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
}

När du har skapat din klass måste du aktivera DependencyService att upptäcka den vid körning. Detta görs genom att lägga till ett [assembly] -attribut ovanför klassdefinitionen och utanför eventuella namnområdedefinitioner.

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


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

Detta attribut registrerar klassen med DependencyService så att den kan användas när en instans av ITextToSpeech gränssnittet behövs.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow