Xamarin.Forms
DependenciaServicio
Buscar..
Observaciones
Cuando usa DependencyService
, normalmente necesita 3 partes:
- Interfaz : esto define las funciones que desea abstraer.
- Implementación de plataforma : una clase dentro de cada proyecto específico de plataforma que implementa la interfaz definida previamente.
- Registro : cada clase de implementación específica de la plataforma debe registrarse con
DependencyService
través de un atributo de metadatos. Esto permite queDependencyService
encuentre su implementación en tiempo de ejecución.
Al utilizar DependencyService
, debe proporcionar una implementación para cada plataforma que elija. Cuando no se proporciona una implementación, la aplicación fallará en el tiempo de ejecución.
Interfaz
La interfaz define el comportamiento que desea exponer a través del DependencyService
. Un ejemplo de uso de DependencyService
es un servicio de Text-to-Speech. Actualmente no hay abstracción para esta función en Xamarin.Forms, por lo que necesita crear el suyo propio. Comience por definir una interfaz para el comportamiento:
public interface ITextToSpeech
{
void Speak (string whatToSay);
}
Como definimos nuestra interfaz, podemos codificar contra ella desde nuestro código compartido.
Nota: Las clases que implementan la interfaz deben tener un constructor sin parámetros para trabajar con DependencyService
.
implementación de iOS
La interfaz que definió debe implementarse en cada plataforma específica. Para iOS esto se hace a través del marco AVFoundation
. La siguiente implementación de la interfaz ITextToSpeech
maneja hablar un texto dado en inglés.
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);
}
}
Cuando haya creado su clase, debe permitir que DependencyService
descubra en tiempo de ejecución. Esto se hace agregando un atributo [assembly]
encima de la definición de clase y fuera de cualquier definición de espacio de nombres.
using AVFoundation;
using DependencyServiceSample.iOS;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechiOS))]
namespace DependencyServiceSample.iOS {
public class TextToSpeechiOS : ITextToSpeech
...
Este atributo registra la clase con DependencyService
para que pueda usarse cuando se necesita una instancia de la interfaz ITextToSpeech
.
Código compartido
Una vez que haya creado y registrado sus clases específicas de la plataforma, puede comenzar a conectarlas a su código compartido. La siguiente página contiene un botón que activa la funcionalidad de texto a voz usando una oración predefinida. Utiliza DependencyService
para recuperar una implementación específica de la ITextToSpeech
de ITextToSpeech
en tiempo de ejecución utilizando los SDK nativos.
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;
}
Cuando ejecute esta aplicación en un dispositivo iOS o Android y toque el botón, escuchará que la aplicación dice la oración dada.
Implementación de Android
La implementación específica de Android es un poco más compleja porque te obliga a heredar de un objeto Java.Lang.Object
nativo y te obliga a implementar la interfaz IOnInitListener
. Android requiere que proporcione un contexto de Android válido para muchos de los métodos SDK que expone. Xamarin.Forms expone un objeto Forms.Context
que le proporciona un contexto de Android que puede usar en tales casos.
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
}
Cuando haya creado su clase, debe permitir que DependencyService
descubra en tiempo de ejecución. Esto se hace agregando un atributo [assembly]
encima de la definición de clase y fuera de cualquier definición de espacio de nombres.
using Android.Speech.Tts;
using Xamarin.Forms;
using System.Collections.Generic;
using DependencyServiceSample.Droid;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechAndroid))]
namespace DependencyServiceSample.Droid {
...
Este atributo registra la clase con DependencyService
para que pueda usarse cuando se necesita una instancia de la interfaz ITextToSpeech
.