Flutter Streambuilder используется дважды в построителе сетки и просмотре страниц

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

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

Вот некоторые из моего кода:

    StreamBuilder(
                            stream: Firestore.instance
                                .collection("videos")
                                .where("userKey", isEqualTo: userKey)
                                .where("isActive", isEqualTo: true)
                                .snapshots(),
                            builder:
                                (context, AsyncSnapshot<QuerySnapshot> snapshot) {
                              if (snapshot.hasData) {
                                videos = snapshot.data.documents
                                    .map((doc) =>
                                        Video.fromMap(doc.data, doc.documentID))
                                    .toList();
                                return videos != null && videos.length > 0
                                    ? Stack(
                                        children: <Widget>[
                                          GridView.builder(
                                            gridDelegate:
                                                SliverGridDelegateWithFixedCrossAxisCount(
                                                    childAspectRatio:
                                                        MediaQuery.of(context)
                                                                .size
                                                                .width /
                                                            (MediaQuery.of(context)
                                                                    .size
                                                                    .height /
                                                                1.4),
                                                    crossAxisCount: 3),
                                            itemCount: videos.length,
    //                                    padding: EdgeInsets.all(8.0),
                                            itemBuilder:
                                                (BuildContext context, int index) {
                                              return Padding(
                                                  padding:
                                                      const EdgeInsets.all(1.0),
                                                  child: GestureDetector(
                                                    onLongPress: () {
                                                      Get.defaultDialog(
                                                          title: "Delete Video ?",
                                                          onConfirm: () async {
                                                            await DeleteVideo(
                                                                videos[index].id);
                                                            Get.back();
                                                          },
                                                          textConfirm: "Yes",
                                                          textCancel: "No",
                                                          confirmTextColor:
                                                              Colors.white,
                                                          cancelTextColor:
                                                              Colors.black,
                                                          buttonColor: Colors.red
                                                              .withOpacity(0.7),
                                                          backgroundColor:
                                                              Colors.white,
                                                          middleText:
                                                              "Do you want to delete this video ?");
                                                    },
                                                    onTap: () {
_pageController =
                                                      PageController(
                                                          initialPage: index);
                                                  currentlyPlayingVideoKey =
                                                      videos[index].id;
                                                  Get.dialog(
                                                      setupAlertDialoadContainer());

// opens a complete new window for each video
                                                      //Get.to(ProfileSingleVideo(
                                                          //videoKey:
                                                              //videos[index].id,
                                                          //goBackForMusic: true));
                                                    },



  Widget setupAlertDialoadContainer(String page) {
    showModalBottomSheet(
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.vertical(top: Radius.circular(25.0)),
        ),
        context: context,
        isScrollControlled: true,
        builder: (context) => Container(
              child: new PageView.builder(
                  controller: _pageController,
                  itemCount: videos.length,
                  scrollDirection: Axis.vertical,
                  pageSnapping: true,
                  reverse: false,
                  onPageChanged: (page) {
                    setState(() {
                      currentlyPlayingVideoKey = videos[page].id;
                    });
                  },
                  itemBuilder: (context, position) {
                    return pageViewContent(video: videos[position]);
                  }),
            ));
  }
}

Опять же, я могу открывать видео в просмотре страницы и переходить к видео, которое я хочу, по нажатию. Но видео не слушает изменения, которые я делаю, когда видео открывается при просмотре страницы. Например. лайк этого видео не увеличивает его счетчик, хотя лайк работает на других экранах, где просмотр страницы размещается непосредственно внутри Streambuilder. Однако в этом случае я не хочу размещать просмотр страницы внутри streambuider.

Скриншот ниже, чтобы представить это лучше.

введите здесь описание изображения


person rohan koshti    schedule 30.06.2020    source источник


Ответы (1)


Я думаю, что вам нужно использовать StreamProvider. И поместите его над своим MaterialApp в main, чтобы вы могли получить доступ к его потоку, даже когда используете навигатор.

Затем вы можете установить PageView в качестве потребителя StreamProvider. завернув его в потребительский виджет.

Я надеюсь, что это решит вашу проблему, связанную с тем, что ваш просмотр страницы не может прослушивать изменения.

person Tonny Baw    schedule 30.06.2020