Xamarin.Forms
DependencyService
Ricerca…
Osservazioni
Quando si utilizza DependencyService
genere sono necessarie 3 parti:
- Interfaccia : definisce le funzioni che desideri astrarre.
- Implementazione della piattaforma : una classe all'interno di ciascun progetto specifico della piattaforma che implementa l'interfaccia definita in precedenza.
- Registrazione - Ogni classe di implementazione specifica della piattaforma deve essere registrata con
DependencyService
tramite un attributo metadata. Ciò consente aDependencyService
di trovare l'implementazione in fase di esecuzione.
Quando si utilizza DependencyService
è necessario fornire un'implementazione per ciascuna piattaforma scelta come target. Quando non viene fornita un'implementazione, l'applicazione non riuscirà in fase di esecuzione.
Interfaccia
L'interfaccia definisce il comportamento che si desidera esporre tramite DependencyService
. Un esempio di utilizzo di DependencyService
è un servizio Da testo a voce. Al momento non ci sono astrazioni per questa funzione in Xamarin.Forms, quindi è necessario crearne di proprie. Inizia definendo un'interfaccia per il comportamento:
public interface ITextToSpeech
{
void Speak (string whatToSay);
}
Poiché definiamo la nostra interfaccia possiamo codificarci contro di essa dal nostro codice condiviso.
Nota: le classi che implementano l'interfaccia devono avere un costruttore senza parametri per lavorare con DependencyService
.
implementazione iOS
L'interfaccia che hai definito deve essere implementata in ogni piattaforma mirata. Per iOS questo viene fatto attraverso il framework AVFoundation
. La seguente implementazione dell'interfaccia ITextToSpeech
gestisce la pronuncia di un determinato testo in inglese.
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);
}
}
Una volta creato il tuo corso, devi abilitare DependencyService
per scoprirlo in fase di esecuzione. Questo viene fatto aggiungendo un attributo [assembly]
sopra la definizione della classe e al di fuori di qualsiasi definizione di spazio dei nomi.
using AVFoundation;
using DependencyServiceSample.iOS;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechiOS))]
namespace DependencyServiceSample.iOS {
public class TextToSpeechiOS : ITextToSpeech
...
Questo attributo registra la classe con DependencyService
modo che possa essere utilizzata quando è necessaria ITextToSpeech
dell'interfaccia ITextToSpeech
.
Codice condiviso
Dopo aver creato e registrato le tue classi specifiche per piattaforma puoi iniziare ad agganciarle al tuo codice condiviso. La pagina seguente contiene un pulsante che attiva la funzionalità di sintesi vocale utilizzando una frase predefinita. Utilizza DependencyService
per recuperare un'implementazione specifica della ITextToSpeech
di ITextToSpeech
in fase di esecuzione utilizzando gli SDK nativi.
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;
}
Quando si esegue questa applicazione su un dispositivo iOS o Android e si tocca il pulsante, si sentirà l'applicazione pronunciare la frase data.
Implementazione Android
L'implementazione specifica per Android è un po 'più complessa perché ti costringe ad ereditare da un Java.Lang.Object
nativo e ti costringe ad implementare l'interfaccia IOnInitListener
. Android richiede di fornire un contesto Android valido per molti dei metodi SDK che espone. Xamarin.Forms espone un oggetto Forms.Context
che ti fornisce un contesto Android che puoi utilizzare in questi casi.
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
}
Una volta creato il tuo corso, devi abilitare DependencyService
per scoprirlo in fase di esecuzione. Questo viene fatto aggiungendo un attributo [assembly]
sopra la definizione della classe e al di fuori di qualsiasi definizione di spazio dei nomi.
using Android.Speech.Tts;
using Xamarin.Forms;
using System.Collections.Generic;
using DependencyServiceSample.Droid;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechAndroid))]
namespace DependencyServiceSample.Droid {
...
Questo attributo registra la classe con DependencyService
modo che possa essere utilizzata quando è necessaria ITextToSpeech
dell'interfaccia ITextToSpeech
.