Xamarin.Forms
DependencyService
Szukaj…
Uwagi
Podczas korzystania z usługi DependencyService
zazwyczaj potrzebujesz 3 części:
- Interfejs - określa funkcje, które chcesz wydzielić.
- Implementacja platformy - klasa w ramach każdego projektu specyficznego dla platformy, która implementuje wcześniej zdefiniowany interfejs.
- Rejestracja - każda klasa implementacji specyficzna dla platformy musi zostać zarejestrowana w
DependencyService
za pomocą atrybutu metadanych. Dzięki temuDependencyService
może znaleźć implementację w czasie wykonywania.
Korzystając z usługi DependencyService
musisz podać implementację dla każdej platformy, na którą kierujesz. Jeśli implementacja nie zostanie zapewniona, aplikacja przestanie działać w czasie wykonywania.
Berło
Interfejs określa zachowanie, które chcesz ujawnić za pośrednictwem usługi DependencyService
. Jednym z przykładów użycia usługi DependencyService
jest usługa zamiany tekstu na mowę. Obecnie nie ma abstrakcji dla tej funkcji w Xamarin.Forms, więc musisz stworzyć własną. Zacznij od zdefiniowania interfejsu dla zachowania:
public interface ITextToSpeech
{
void Speak (string whatToSay);
}
Ponieważ definiujemy nasz interfejs, możemy kodować go na podstawie naszego wspólnego kodu.
Uwaga: Klasy, które implementują interfejs, muszą mieć konstruktora bez parametrów, aby współpracować z DependencyService
.
Implementacja iOS
Zdefiniowany interfejs należy zaimplementować na każdej docelowej platformie. W przypadku systemu iOS odbywa się to za pomocą środowiska AVFoundation
. Poniższa implementacja interfejsu ITextToSpeech
obsługuje mówienie danego tekstu w języku angielskim.
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);
}
}
Po utworzeniu klasy musisz włączyć DependencyService
aby wykryć ją w czasie wykonywania. Odbywa się to poprzez dodanie atrybutu [assembly]
powyżej definicji klasy i poza wszelkimi definicjami przestrzeni nazw.
using AVFoundation;
using DependencyServiceSample.iOS;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechiOS))]
namespace DependencyServiceSample.iOS {
public class TextToSpeechiOS : ITextToSpeech
...
Ten atrybut rejestruje klasę w DependencyService
dzięki czemu można go użyć, gdy potrzebna jest instancja interfejsu ITextToSpeech
.
Wspólny kod
Po utworzeniu i zarejestrowaniu klas specyficznych dla platformy możesz rozpocząć ich podłączanie do wspólnego kodu. Następująca strona zawiera przycisk, który uruchamia funkcję zamiany tekstu na mowę za pomocą predefiniowanego zdania. Korzysta z DependencyService
aby pobrać specyficzną dla platformy implementację ITextToSpeech
w czasie wykonywania przy użyciu natywnych zestawów SDK.
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;
}
Po uruchomieniu tej aplikacji na urządzeniu z systemem iOS lub Android i dotknięciu przycisku usłyszysz, jak aplikacja wypowiada podane zdanie.
Wdrożenie Androida
Implementacja specyficzna dla Androida jest nieco bardziej złożona, ponieważ zmusza do dziedziczenia z natywnego Java.Lang.Object
i zmusza do implementacji interfejsu IOnInitListener
. Android wymaga podania prawidłowego kontekstu Androida dla wielu metod SDK, które udostępnia. Forms.Context
udostępnia obiekt Forms.Context
który zapewnia kontekst systemu Android, którego można użyć w takich przypadkach.
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
}
Po utworzeniu klasy musisz włączyć DependencyService
aby wykryć ją w czasie wykonywania. Odbywa się to poprzez dodanie atrybutu [assembly]
powyżej definicji klasy i poza wszelkimi definicjami przestrzeni nazw.
using Android.Speech.Tts;
using Xamarin.Forms;
using System.Collections.Generic;
using DependencyServiceSample.Droid;
[assembly: Xamarin.Forms.Dependency (typeof (TextToSpeechAndroid))]
namespace DependencyServiceSample.Droid {
...
Ten atrybut rejestruje klasę w DependencyService
dzięki czemu można go użyć, gdy potrzebna jest instancja interfejsu ITextToSpeech
.