StreamBuilder arrayContains и RangeError (index): недопустимое значение: диапазон допустимых значений пуст: 0 - PullRequest
0 голосов
/ 12 марта 2020

Потихоньку осваиваю Флаттера и Дартса в качестве моего нового хобби. Любой совет или помощь, которую вы можете дать, всегда приветствуется! Я пытаюсь внедрить простую систему друзей, где вы можете искать другого пользователя и добавлять его в друзья.

Ожидаемый результат:

  1. Зарегистрированный пользователь переходит в профиль друга и нажимает кнопку «Добавить друга».
  2. Firestore имеет коллекцию пользователей. В этой коллекции есть документ для каждого пользователя с информацией профиля, включая массив «друзья». Нажав кнопку «Добавить друга», вы добавите UID зарегистрированных пользователей в массив «друзей» этого второго человека.
  3. Затем на экране «Друзья» я использую StreamBuilder и Listview.builder, чтобы показать всех пользователей как карточки. , которые имеют UID зарегистрированного пользователя в массиве своих друзей.

Для этого я хочу использовать .where ('friends', arrayContains: 'user.uid') в потоке StreamBuilder, чтобы отображать только те пользовательские карты в списке на экране.

Вот код, который я написал:

class friendsList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);

    return 
      StreamBuilder(
      stream: Firestore.instance
              .collection('users')
              .where('friends', arrayContains: user.uid).snapshots(),
               builder: (context, documents) {

               if (documents.hasData) {
               return 

               Container(
                    height: 180,
                        child:

                            ListView.builder(
                               scrollDirection: Axis.horizontal,
                               itemCount: 1,
                               itemBuilder: (context, index) {

                               DocumentSnapshot friends = documents.data.documents[index]; 

Однако, когда я go для запуска моего приложения отображается сообщение об ошибке:

`The following RangeError was thrown building:
      RangeError (index): Invalid value: Valid value range is empty: 0

      When the exception was thrown, this was the stack 
        List.[](dart:core-patch/growable_array.dart:149:60)
        friendsList.build.<anonymous closure>.<anonymous closure> 

Примечания:

  1. itemCount жестко запрограммирован на 1 прямо сейчас. Я ожидаю, что во время тестирования вернется только 1 пользователь. Я заполнил Firestore большим количеством пользователей, как только все это заработало.
  2. Когда я поменяю массивом, содержит что-то более простое, например .where ('displayName', isEqualTo: 'My Name'). Snapshots (), , приложение работает без ошибок
  3. user.uid был протестирован и содержит намеченную строку
  4. Массивы присутствуют со значениями в Firestore (см. Ссылку внизу поста)
  5. Я настроил индекс для значений, которые я использую в 'users'

Кто-нибудь знает, что я могу сделать с этой ошибкой, и получаю документы, которые имеют массив друзей с UID вошедшего в систему пользователя?

Опять любые советы и помощь приветствуется. Снимок экрана Cloud Firestore здесь

1 Ответ

1 голос
/ 14 марта 2020

Я оставил свой проект на два дня и перестроил приложение за последний час. К моему удивлению, '.where (' friends ', arrayContains: user.uid)' теперь работает!

Когда приложение запускается, у меня теперь есть ListView всех пользователей, которые являются друзьями вошедшего в систему пользователя. user.

Как работает вся система:

  1. На странице профиля каждого пользователя есть кнопка с плавающим действием, которая при нажатии добавляет текущий зарегистрированный UID пользователя в массив 'friends' в документе этого друга.

  2. С StreamBuilder и ListView, когда вошедший в систему пользователь затем переходит на страницу своих друзей, он видит каждого пользователя, вошедшего в систему. UID пользователя в массиве "друзей"

...