Xamarin C # Кроссплатформенная и привязка к платформе - PullRequest
0 голосов
/ 17 мая 2018

это моя ситуация.

У меня есть приложение, написанное на Xamarin, которое поддерживает Droid и iOS.Каждый из этих проектов требует независимой от платформы Bluetooth API.Итак, я создал интерфейс, который я использую с DependencyService.Поле, которое мне нужно, это список устройств Bluetooth ... это достаточно просто, если я разрабатываю для одной платформы.Но в этом случае моя реализация Bluetooth «обнаруживает» устройства в своем собственном потоке, поэтому я не обязательно могу вернуть имена String []. Мое решение было следующее: я создаю класс, и внутри класса есть String [] и поскольку этот класс является «справочным», я предположил, что позже добавлю его в список кода, изменения будут отражены в моем DependencyService ... но, к сожалению, нет, это не так ..... Вот некоторый коддля ситуации.

Это определение моего класса, в котором я «храню» свой массив предметов.

namespace ThoughtCastRewrite.BluetoothX
{
    public class BluetoothItems
    {
        public string[] ListBTItems = new string[10];


        public BluetoothItems()
        {

            ListBTItems[2] = "TEST";
            ListBTItems[6] = "WtF?";
        }

        public void Set(string stringToAdd)
        {
            ListBTItems[4] = stringToAdd;


        }
    }
}

Этот фрагмент кода находится в кроссплатформенном проекте

BluetoothItems bluetoothItemList = DependencyService.Get<ISlateBluetoothItems>().IBluetoothTest;
listView.ItemsSource = bluetoothItemList.ListBTItems;

Теперь вот код Droid:

 BluetoothItems bluetoothItems = new BluetoothItems();
 public BluetoothItems IBluetoothTest { get => bluetoothItems; }

Хорошо, это может показаться очевидным, но TEST и WtF?добавлены в мой список.Но в моей MainActivity (снова в части Droid) после загрузки всего представления я звоню

 bluetoothItems.Set("TEST");

, и пункт «ТЕСТ» никогда не добавляется в мой список!

Мне ясно, что я пытаюсь сделать?

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 17 мая 2018

Реализация DependencyService всегда создает новый экземпляр . Это либо глобальный экземпляр, либо новый экземпляр для каждого вызова Resolve(). Вы можете настроить поведение, установив DependencyFetchTarget ( см. Документы ).

Независимо от того, как вы его настроите, конкретный экземпляр BluetoothItems, который вы создаете, не тот, который будет возвращен Resolve(). Вот почему добавляемый вами элемент не будет частью того, что вы получаете в своем общем коде.

Если вы хотите получить другое поведение и вернуть предварительно созданные экземпляры, готовое решение не будет работать. Вам нужно будет создать свою собственную логику или использовать один из множества других вариантов внедрения зависимостей. Например, вы можете попробовать SimpleIoC , который я использовал во многих проектах (это часть MvvmLight).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...