React native - добавить обнаруженные устройства для установки и добавить опцию для выбора - PullRequest
1 голос
/ 07 марта 2019

Я использую Picker в реагировать родной Пока экран открыт, устройство сканирует все устройства и добавляет их в массив devices в состоянии. Средство выбора должно иметь опцию для каждого из значений в массиве devices.

Обычно я бы сделал это:

Конструктор:

this.state = { devices: [] };

Когда устройство найдено:

let devices = this.state.devices;
devices.push(device.id);
this.setState({ devices: devices });

А затем сделайте сборщик следующим образом:

<Picker>
  {(this.state.devices).map((item, index) => {
    return <Picker.item key={index} label={item} value={item} />;
  })}
</Picker>

Это прекрасно работает, за исключением того, что, поскольку устройства постоянно повторно обнаруживаются, они заканчивают массив несколько раз. Мало того, что это бесполезно, но длина массива увеличивается, пока приложение не исчерпает память.

Чтобы это исправить, я попытался использовать набор, поскольку он не должен автоматически содержать дубликаты:

Конструктор:

this.state = { devices: new Set() };

Когда устройство найдено:

let devices = this.state.devices;
devices.add(device.id);
this.setState({ devices: devices });

Выбор:

Поскольку в наборе нет функции отображения, я взял записи (итератор), превратил их в массив и затем отобразил:

<Picker>
  {Array.from(this.state.devices.entries).map((item, index) => {
    return <Picker.item key={index} label={item} value={item} />;
  })}
</Picker>

Это не работает. Инструменты отладки предполагают, что набор в состоянии никогда не добавляется, поэтому я думаю, что это проблема (а не с помощью средства выбора), но я не понимаю, почему это так.

Нет ошибок.

1 Ответ

0 голосов
/ 07 марта 2019

Возможно, вы захотите сначала проверить, а затем вставить свой массив, чтобы избежать дублирования записей,

let devices = this.state.devices;
if(devices.indexOf(device.id) == -1){
  devices.push(device.id);
  this.setState({ devices: devices });
}

Это, безусловно, не приведет к отправке идентификатора устройства, который уже находится в состоянии.

...