Я использую 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>
Это не работает. Инструменты отладки предполагают, что набор в состоянии никогда не добавляется, поэтому я думаю, что это проблема (а не с помощью средства выбора), но я не понимаю, почему это так.
Нет ошибок.