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 de DependencyService 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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow