флаттер объединяет два потока, где второй зависит от первого?

avatar
Gbenga B Ayannuga
8 августа 2021 в 20:15
103
1
0

у меня две коллекции,

  1. коллекция пользователей
  2. как коллекция.

в моем лайке у меня есть список лайков с id, теперь я использую поток для получения списка, как пользователь, но. поэтому, если пользователь изменит изображение своего профиля, его нельзя будет обновить в аналогичной коллекции, поэтому после получения списка я передаю идентификатор в другой поток, чтобы получить обновление из коллекции пользователей. это много кода биолер пластины. я ищу способ объединить этот поток вместе.

вот пример кода

StreamBuilder(
stream: firestore
.collection('Matches')
.doc(auth.currentUser.uid)
.collection('Match')
.orderBy('chatTimeStamp').snapshots(),
 builder: (context, snapshot) {
                        if (!snapshot.hasData) {
                          return Container();
                        }
                        if (snapshot.connectionState ==
                            ConnectionState.waiting) {
                          return Center(child: CircularProgressIndicator());
                        }
                        if (snapshot.data.docs.isEmpty) {
                          return Align(
                            alignment: Alignment.center,
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: [
                                RippleAnimation(
                                  repeat: true,
                                  color: Colors.white,
                                  minRadius: 100,
                                  ripplesCount: 6,
                                  child: Material(
                                    elevation: 8.0,
                                    shape: CircleBorder(),
                                    child: CircleAvatar(
                                      backgroundColor: themedata.darkTheme
                                          ? Colors.black
                                          : Colors.white,
                                      child: Image.asset(
                                        'assets/1.png',
                                      ),
                                      radius: 80.0,
                                    ),
                                  ),
                                ),
                                Flexible(
                                  child: Padding(
                                    padding: const EdgeInsets.all(8.0),
                                    child: Text(
                                      'No Message Yet!',
                                      textAlign: TextAlign.center,
                                      style: GoogleFonts.raleway(
                                        textStyle: TextStyle(
                                          color: Colors.white,
                                          fontWeight: FontWeight.bold,
                                          fontSize: 20,
                                        ),
                                      ),
                                    ),
                                  ),
                                ),
                              ],
                            ),
                          );
                        }
                        return ListView.separated(
                            separatorBuilder: (_, index) => Padding(
                                  padding:
                                      EdgeInsets.only(left: 120.0, right: 40),
                                  child: Divider(
                                    color: Colors.white,
                                    thickness: 1.0,
                                  ),
                                ),
                            shrinkWrap: true,
                            itemCount: snapshot.data.docs.length,
                            itemBuilder: (context, index) {
                              final data =
                                  snapshot.data.docs[index].data()['Match'];
                           
                              //here is where it depend on the value 
                              return StreamBuilder(
                                  stream: firestore
                                      .collection('users')
                                      .doc(data['id'])
                                      .snapshots(),
                                  builder: (context, snapshotid) {
                                    final active = snapshotid.data.data();
                                    if (snapshotid.hasError) {
                                      return Container();
                                    }
                                    if (snapshotid.connectionState ==
                                        ConnectionState.waiting) {
                                      return Center(
                                          child: CircularProgressIndicator());
                                    }
                                    if (snapshotid.connectionState ==
                                        ConnectionState.none) {
                                      return Container();
                                    }
                                    if (!snapshotid.hasData) {
                                      return Container();
                                    }
Источник
pskink
9 августа 2021 в 03:18
0

проверьте документацию по методу Stream.asyncExpand

Ответы (1)

avatar
Benyamin
8 августа 2021 в 20:38
0

Для объединения двух потоков вы можете использовать метод Combine2 из библиотеки rxdart. эта библиотека имеет все функции потокового класса + некоторые дополнительные функции, которые действительно полезны. более подробно вы можете посмотреть официальную документацию здесь.

примечание: для использования методов и функций этой библиотеки вы также должны определить потоки с помощью классов этой библиотеки. Например: Поток потока, может быть потоком PublishSubject.

Gbenga B Ayannuga
9 августа 2021 в 05:41
0

можете ли вы показать мне примеры того, как этот поток Stream объявляется в коде

Benyamin
9 августа 2021 в 06:01
0

окончательный firestore= PublishSubject(); то в своем потоке вы можете использовать вот этот поток. firestore.stream

Benyamin
9 августа 2021 в 19:15
0

это документация об этом с некоторыми примерами/ pub.dev/documentation/rxdart/latest/rx/…