Xamarin.Forms
DependencyService
Zoeken…
Opmerkingen
Bij het gebruik van DependencyService
u meestal 3 delen nodig:
- Interface - Dit definieert de functies die u wilt samenvatten.
- Platform implementatie - Een klasse binnen elk platform specifiek project dat implementeert de eerder gedefinieerde interface.
- Registratie - Elke platformspecifieke implementatieklasse moet bij de
DependencyService
worden geregistreerd via een metagegevensattribuut. Hierdoor kan deDependencyService
uw implementatie tijdens runtime vinden.
Wanneer u DependencyService
u een implementatie bieden voor elk platform dat u target. Als er geen implementatie wordt verstrekt, mislukt de toepassing tijdens uitvoering.
Koppel
De interface definieert het gedrag dat u via de DependencyService
wilt blootleggen. Een voorbeeld van het gebruik van een DependencyService
is een Text-To-Speech-service. Er is momenteel geen abstractie voor deze functie in Xamarin.Forms, dus u moet uw eigen functie maken. Begin met het definiëren van een interface voor het gedrag:
public interface ITextToSpeech
{
void Speak (string whatToSay);
}
Omdat we onze interface definiëren, kunnen we hiertegen coderen vanuit onze gedeelde code.
Opmerking: Klassen die de interface implementeren, moeten een parameterloze constructor hebben om met de DependencyService
te werken.
iOS-implementatie
De door u gedefinieerde interface moet in elk doelgericht platform worden geïmplementeerd. Voor iOS gebeurt dit via het AVFoundation
framework. De volgende implementatie van de ITextToSpeech
interface zorgt ervoor dat een bepaalde tekst in het Engels wordt uitgesproken.
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);
}
}
Wanneer u uw klas hebt gemaakt, moet u de DependencyService
inschakelen om deze tijdens runtime te ontdekken. Dit wordt gedaan door een [assembly]
-attribuut toe te voegen boven de klassedefinitie en buiten eventuele naamruimtedefinities.
using AVFoundation;
using DependencyServiceSample.iOS;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechiOS))]
namespace DependencyServiceSample.iOS {
public class TextToSpeechiOS : ITextToSpeech
...
Dit kenmerk registreert de klasse met de DependencyService
zodat deze kan worden gebruikt wanneer een exemplaar van de ITextToSpeech
interface nodig is.
Gedeelde code
Nadat u uw platformspecifieke klassen hebt gemaakt en geregistreerd, kunt u deze koppelen aan uw gedeelde code. De volgende pagina bevat een knop die de tekst-naar-spraak-functionaliteit activeert met behulp van een vooraf gedefinieerde zin. Het maakt gebruik van DependencyService
om tijdens runtime een platformspecifieke implementatie van ITextToSpeech
op te halen met behulp van de native SDK's.
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;
}
Wanneer u deze applicatie op een iOS- of Android-apparaat uitvoert en op de knop tikt, hoort u de applicatie de gegeven zin uitspreken.
Android-implementatie
De Android-specifieke implementatie is een beetje complexer omdat het je dwingt om te erven van een native Java.Lang.Object
en je dwingt om de IOnInitListener
interface te implementeren. Android vereist dat u een geldige Android-context biedt voor veel van de SDK-methoden die het blootstelt. Xamarin.Forms onthult een Forms.Context
object dat u een Android-context biedt die u in dergelijke gevallen kunt gebruiken.
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
}
Wanneer u uw klas hebt gemaakt, moet u de DependencyService
inschakelen om deze tijdens runtime te ontdekken. Dit wordt gedaan door een [assembly]
-attribuut toe te voegen boven de klassedefinitie en buiten eventuele naamruimtedefinities.
using Android.Speech.Tts;
using Xamarin.Forms;
using System.Collections.Generic;
using DependencyServiceSample.Droid;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechAndroid))]
namespace DependencyServiceSample.Droid {
...
Dit kenmerk registreert de klasse met de DependencyService
zodat deze kan worden gebruikt wanneer een exemplaar van de ITextToSpeech
interface nodig is.