Рандомизировать/перетасовать порядок потока Firestore во Flutter/Dart?

Я создаю приложение, которое использует построитель потоков, извлекая данные из облака Firestore. Вот код:

return Scaffold(
  backgroundColor: Colors.black,
  appBar: appBar,
  drawer: Sidebar(),
  body: Center(
    child: StreamBuilder(
      stream: stream,
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return Text(
            "Loading...",
            style: TextStyle(
              color: Colors.white,
            ),
          );
        } else {
          return GridView.builder(
            itemCount: snapshot.data.documents.length,
            shrinkWrap: true,
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: globals.gridCountValue != null ? globals.gridCountValue : 2,
            ),
            itemBuilder: (context, index) {
              return _buildList(context, snapshot.data.documents[index]);
            },
          );
        }
      },
    ),
  ),
  floatingActionButton: FloatingActionButton(
    // onPressed: () => shuffleAlbums(),
    onPressed: () {},
    child: Icon(Icons.shuffle),
    elevation: 2,
    backgroundColor: Colors.black,
  ),
  floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
);

_билдлист:

  Widget _buildList(BuildContext context, DocumentSnapshot document) {
    if (document.data != null) {
      return new AlbumTile(data: document.data);
    }
  }

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

Спасибо за чтение!


person tvl    schedule 25.11.2019    source источник


Ответы (1)


Существует несколько способов добиться функциональности перетасовки для списка, поступающего из потока.

Один из них будет использовать шаблон bloc (который в основном отделяет пользовательский интерфейс от бизнес-логики), где вы добавляете еще один поток (назовем его list stream), который прослушивает поток Firestore (потому что, насколько я знаю, данные из потока Firestore неизменяем), и когда пользователь нажимает кнопку, вы просто получаете данные из list stream, перемешиваете их и отправляете обратно в list stream. Таким образом, вы все еще можете использовать StreamBuilder для отображения данных. Если вы хотите узнать больше о шаблоне bloc, вы можете прочитать больше здесь: https://www.raywenderlich.com/4074597-getting-started-with-the-bloc-pattern (не мой сайт)

Или у вас может быть переменная (по сути, массив) внутри вашего Widget, которая прослушивает изменения, поступающие из потока Firestore, и обновляет пользовательский интерфейс на основе этой переменной. И при нажатии кнопки перемешайте переменную и снова сбросьте состояние.

person Andrei    schedule 25.11.2019