Xamarin.Forms
DependencyService
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 attDependencyService
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.