首页 > 解决方案 > Flutter Visibility with Condition(如何只隐藏一个有条件的小部件)

问题描述

我在使用 Visibility 小部件时遇到问题。

我想要做的是通过依赖用户点击我的行来隐藏某些列表视图。但是当用户点击行时,所有的 Listview 都会显示出来。再次单击时,所有列表视图小部件都将消失。

我想要做的是图像:
这是我的页面的外观
这是当我点击箭头按钮或“Sezon 1”文本时发生的事情 这是我点击箭头按钮或“Sezon 1”文本
时想要做的事情

我想要做的是当我点击第 2 季时,它会显示第 2 季的剧集。当我单击第 3 季时,它将显示第 3 季剧集等。

这是我的代码(我知道现在有点乱,为此道歉):GestureDetector 每次点击都一样。

bool viewVisible = false;
void hideWidget() {
setState(() {
  viewVisible = !viewVisible;
  print(viewVisible);
});

StreamBuilder<QuerySnapshot>(
                stream: seasons.snapshots(),
                builder:
                    (BuildContext context, AsyncSnapshot asyncSnapshot) {
                  if (asyncSnapshot.hasError) {
                    return Center(
                        child:
                            Text('Error'));
                  } else {
                    if (asyncSnapshot.hasData) {
                      List<DocumentSnapshot> listOfDocumentSnap =
                          asyncSnapshot.data.docs;

                      return Padding(
                        padding: const EdgeInsets.only(top: 0, left: 0),
                        child: Align(
                          alignment: Alignment.topLeft,
                          child: Column(
                            children: [
                              ListView.builder(
                                shrinkWrap: true,
                                itemCount: listOfDocumentSnap.length,
                                itemBuilder: (context, index) {
                                  var episodes = firestore
                                      .collection('shows')
                                      .doc(data.id)
                                      .collection('Seasons')
                                      .doc(listOfDocumentSnap[index].id)
                                      .collection('Episodes');

                                  return Column(
                                    crossAxisAlignment:
                                        CrossAxisAlignment.start,
                                    mainAxisAlignment:
                                        MainAxisAlignment.start,
                                    children: [
                                      Padding(
                                        padding: const EdgeInsets.only(
                                            top: 0, left: 18, right: 18),
                                        child: GestureDetector(
                                          onTap: () {
                                            hideWidget();
                                          },
                                          child: Container(
                                            decoration: BoxDecoration(
                                                borderRadius:
                                                    BorderRadius.circular(
                                                        8),
                                                border: Border.all(
                                                    color: Colors.pink)),
                                            child: Row(
                                              children: [
                                                SizedBox(
                                                  width: 20,
                                                ),
                                                Text(
                                                  listOfDocumentSnap[index]
                                                      .get('name')
                                                      .toString()
                                                      .toUpperCase(),
                                                  style: TextStyle(
                                                      fontSize: 20,
                                                      color:
                                                          Colors.grey[800],
                                                      fontWeight:
                                                          FontWeight.w700),
                                                ),
                                                Spacer(flex: 1),
                                                Icon(
                                                  Icons.arrow_drop_down,
                                                  size: 45,
                                                  color: Colors.pink,
                                                ),
                                              ],
                                            ),
                                          ),
                                        ),
                                      ),
                                      StreamBuilder<QuerySnapshot>(
                                        stream: episodes.snapshots(),
                                        builder: (BuildContext context,
                                            AsyncSnapshot asyncSnapshot) {
                                          if (asyncSnapshot.hasError) {
                                            return Center(
                                                child: Text(
                                                    'Error'));
                                          } else {
                                            if (asyncSnapshot.hasData) {
                                              List<DocumentSnapshot>
                                                  listOfDocumentSnap =
                                                  asyncSnapshot.data.docs;

                                              return Padding(
                                                padding:
                                                    const EdgeInsets.only(
                                                        top: 5, left: 18.0),
                                                child: Visibility(
                                                  visible: viewVisible,
                                                  child: Align(
                                                    alignment:
                                                        Alignment.topLeft,
                                                    child: Column(
                                                      children: [
                                                        ListView.builder(
                                                          shrinkWrap: true,
                                                          itemCount:
                                                              listOfDocumentSnap
                                                                  .length,
                                                          itemBuilder:
                                                              (context,
                                                                  index) {
                                                            return ListTile(
                                                              onTap: () {
                                                                setState(
                                                                    () {
                                                                  selectedIndex =
                                                                      index;
                                                                });
                                                              },
                                                              trailing:
                                                                  Icon(Icons
                                                                      .play_arrow),
                                                              title: Text(listOfDocumentSnap[
                                                                      index]
                                                                  .id
                                                                  .toString()),
                                                            );

                                                            /*   return Text(
                                                                listOfDocumentSnap[
                                                                        index]
                                                                    .get(
                                                                        'name'));*/
                                                          },
                                                        ),
                                                      ],
                                                    ),
                                                  ),
                                                ),
                                              );
                                            } else {
                                              return Center(
                                                  child:
                                                      CircularProgressIndicator());
                                            }
                                          }
                                        },
                                      ),
                                      SizedBox(
                                        height: 30,
                                      )
                                    ],
                                  );
                                },
                              ),
                            ],
                          ),
                        ),
                      );
                    } else {
                      return Center(child: CircularProgressIndicator());
                    }
                  }
                },
              ),

标签: flutterdartvisibility

解决方案


我知道有两种不同的方式来处理小部件的可见性。创建一个 bool 来切换可见性。我正在使用_show.

在内部使用 if 条件 (列或任何小部件)

if (_show) Container(),

使用可见性小部件

  Column(
        children: [
          Visibility(
            visible: _show,
            child: Container(),
          ),
      )


推荐阅读