Xamarin, используя геолокацию из образца Xlabs
Использование Xamarin Shared Project.
Я попытался включить в свой проект share функцию Geolocation из примера Xlabs, но у меня возникают проблемы, когда дело доходит до вызова dependencyService.
У меня есть страница контента, и там у меня есть моя кнопка, которая имеет такую команду: Command = new Command(async () => await GetPosition(), () => Geolocator != null)
Команда приводит к:
private IGeolocator Geolocator
{
get
{
if (_geolocator == null)
{
_geolocator = DependencyService.Get<IGeolocator>();
_geolocator.PositionError += OnListeningError;
_geolocator.PositionChanged += OnPositionChanged;
}
return _geolocator;
}
}
и когда это должно вызвать _geolocator = DependencyService.Get<IGeolocator>();
ничего не происходит и _geolocator остается нулевым.
У меня есть все ссылки из Xlabs и интерфейс IGeolocator в моем проекте, так почему же не вызывается DependencyService??
2 ответа
Сервисы XLabs.Platform больше не (с момента обновления до 2.0) автоматически регистрируются в Xamarin.Forms.DependencyService. Это связано с удалением зависимости Xamarin.Forms от XLabs.Platform. Вы можете зарегистрировать Geolocator вручную (для каждого конкретного проекта платформы):
DependencyService.Register<Geolocator> ();
Лучше было бы использовать абстракцию контейнера IoC, предоставляемую XLabs.IoC (включается автоматически как зависимость): https://github.com/XLabs/Xamarin-Forms-Labs/wiki/IOC
Подробнее о XLabs.IoC: http://www.codenutz.com/autofac-ninject-tinyioc-unity-with-xamarin-forms-labs-xlabs/
Второй параметр Command Constructor - это функция, которая сообщает, может ли команда быть выполнена или нет, в вашем случае вы "говорите" выполнять команду только тогда, когда Geolocator is != null
, но вы инициализируете ее в своей команде, которая никогда не выполняется, потому что Geolocator имеет значение null.
Вы должны инициализировать Geolocator перед вызовом команды или удалить Geolocator is != null
условие для выполнения команды.