Recherche…


Remarques

Lorsque vous utilisez DependencyService vous avez généralement besoin de trois parties:

  • Interface - Définit les fonctions que vous souhaitez abstraire.
  • Implémentation de la plate-forme - Classe de chaque projet spécifique à la plate-forme qui implémente l'interface définie précédemment.
  • Registration - Chaque classe d'implémentation spécifique à la plate-forme doit être enregistrée avec DependencyService via un attribut de métadonnées. Cela permet à DependencyService de trouver votre implémentation au moment de l'exécution.

Lorsque vous utilisez DependencyService vous devez fournir une implémentation pour chaque plate-forme que vous ciblez. Lorsqu'une implémentation n'est pas fournie, l'application échouera au moment de l'exécution.

Interface

L'interface définit le comportement que vous souhaitez exposer via le service DependencyService . Un exemple d'utilisation d'un DependencyService est un service Text-To-Speech. Il n'y a actuellement aucune abstraction pour cette fonctionnalité dans Xamarin.Forms, vous devez donc créer les vôtres. Commencez par définir une interface pour le comportement:

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

Parce que nous définissons notre interface, nous pouvons le coder à partir de notre code partagé.

Remarque: Les classes qui implémentent l'interface doivent disposer d'un constructeur sans paramètre pour fonctionner avec DependencyService .

mise en œuvre iOS

L'interface que vous avez définie doit être implémentée dans chaque plate-forme ciblée. Pour iOS, cela se fait via le framework AVFoundation . L'implémentation suivante de l'interface ITextToSpeech gère la ITextToSpeech charge d'un texte donné en anglais.

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

Lorsque vous avez créé votre classe, vous devez activer DependencyService pour le découvrir au moment de l'exécution. Cela se fait en ajoutant un attribut [assembly] au-dessus de la définition de classe et en dehors de toute définition d'espace de noms.

using AVFoundation;
using DependencyServiceSample.iOS;

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

Cet attribut enregistre la classe avec DependencyService afin de pouvoir l'utiliser lorsqu'une instance de l'interface ITextToSpeech est requise.

Code partagé

Une fois que vous avez créé et enregistré vos classes spécifiques à la plate-forme, vous pouvez les connecter à votre code partagé. La page suivante contient un bouton qui déclenche la fonctionnalité de synthèse vocale à l'aide d'une phrase prédéfinie. Il utilise DependencyService pour récupérer une implémentation spécifique à la plate-forme de ITextToSpeech au moment de l'exécution en utilisant les SDK natifs.

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

Lorsque vous exécutez cette application sur un appareil iOS ou Android et que vous appuyez sur le bouton, vous entendrez l'application parler la phrase donnée.

Implémentation Android

L'implémentation spécifique à Android est un peu plus complexe car elle vous oblige à hériter d'un Java.Lang.Object natif et vous oblige à implémenter l'interface IOnInitListener . Android exige que vous fournissiez un contexte Android valide pour un grand nombre des méthodes SDK qu’il expose. Xamarin.Forms expose un objet Forms.Context qui vous fournit un contexte Android que vous pouvez utiliser dans de tels cas.

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
}

Lorsque vous avez créé votre classe, vous devez activer DependencyService pour le découvrir au moment de l'exécution. Cela se fait en ajoutant un attribut [assembly] au-dessus de la définition de classe et en dehors de toute définition d'espace de noms.

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


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

Cet attribut enregistre la classe avec DependencyService afin de pouvoir l'utiliser lorsqu'une instance de l'interface ITextToSpeech est requise.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow