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



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow