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