Как решить проблему с выдвижным ящиком, показывающим вертикальную область просмотра с неограниченной высотой - PullRequest
2 голосов
/ 20 февраля 2020

Следует отметить, что я новичок в Flutter и Stackoverflow.

В своем приложении для чтения новостей я добавил боковой ящик, который извлекает категории новостей из API с помощью FutureBuilder. Существует DrawerHeader, который содержит категорию с названием Popular News, которая не извлекается из API, то есть stati c.

Каждый раз, когда я открываю API, категория «Популярные новости» отображается и работает нормально, но другие категории не отображаются, а в консоли отображаются ошибки, как показано ниже.

I/flutter ( 4486): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter ( 4486): The following assertion was thrown during performResize():
I/flutter ( 4486): Vertical viewport was given unbounded height.
I/flutter ( 4486): Viewports expand in the scrolling direction to fill their container.In this case, a vertical
I/flutter ( 4486): viewport was given an unlimited amount of vertical space in which to expand. This situation
I/flutter ( 4486): typically happens when a scrollable widget is nested inside another scrollable widget.
I/flutter ( 4486): If this widget is always nested in a scrollable widget there is no need to use a viewport because
I/flutter ( 4486): there will always be enough vertical space for the children. In this case, consider using a Column
I/flutter ( 4486): instead. Otherwise, consider using the "shrinkWrap" property (or a ShrinkWrappingViewport) to size
I/flutter ( 4486): the height of the viewport to the sum of the heights of its children.

Мои коды приведены ниже

Виджет, который возвращает Drawer

@override
  Widget build(BuildContext context) {
    SizeConfig().init(context);

    return SizedBox(
      width: SizeConfig.safeBlockHorizontal*50,
      child: Theme(
        data: Theme.of(context).copyWith(canvasColor: const Color(0xFF2b4849)),
        child: Drawer(
          child: ListView(
            padding: EdgeInsets.zero,
            children: <Widget>[
              DrawerHeader(
                child:  ListTile(
                  title: Text(
                    "Popular News",
                    style: TextStyle(
                        color: Colors.white,
                        fontSize: 25
                    ),
                  ),
                  onTap: (){
                    Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (BuildContext context) => MostPopularNewsfeed(),
                        )
                    );
                  },
                ),
              ),
          FutureBuilder(
            future: category,
            builder: (BuildContext context, AsyncSnapshot snapshot) {
              if(snapshot.data == null) {
                return Container(
                  child: Center(
                    child: Text(
                      "Loading",
                      style: TextStyle(
                          color: Colors.white
                      ),
                    ),
                  ),
                );
              } else {
                return ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (BuildContext context, int index) {
                    return _getDrawer(snapshot, index);
                  },
                );
              }
            },
          ),
            ],
          ),
        ),
      ),
    );
  }

initState () : Этот category является Future<List>

void initState() {
    super.initState();

    setState(() {
       category = fetchCategory();
    });
  }

fetchCategory () : эта функция выбирает категории из API.

Future<List<Category>> fetchCategory() async {
    //try {
    String url = "https://tbsnews.net/json/category/news/list";
    dio.interceptors.add(DioCacheManager(CacheConfig(baseUrl: url)).interceptor);
    Response response = await Dio().get(url);
    print(response);

    List<Category> categoryList = [];
    final Future<Database> dbFuture = categoryDatabaseHelper.initDb();

    if(response.statusCode == 200) {
      var decode = response.data;
      print(decode);
      for (var c in decode) {
        Category category = Category(c['tid'], c['name']);
        await categoryDatabaseHelper.insertCategory(category);
        categoryList.add(category);
      }
      return categoryList;
      //categoryDatabaseHelper.insertCategory(categoryList);
    } else {
      throw Exception("Failed to fetch category");
    }
  }

Что я пробовал до сих пор

Я попытался поместить DrawerHeader и FutureBuilder в виджет Expanded вместо ListView. Не работает.

В ListView я добавил shrinkWrap: true, а также scrollDirection: Axis.vertical. Это также бесполезно.

Пытался поместить их также в виджеты SizeBox и Column. Это тоже не сработало.

Вышесказанное я нашел, выполнив поиск по предыдущим вопросам, связанным с этой проблемой, в StackOverflow. Наконец, я отправляю вопрос сам.

Следует отметить, что когда я убираю это DrawerHeader, все начинает работать нормально, больше никаких проблем. Но это должно быть DrawerHeader.

Большое спасибо за ваше время и искреннюю помощь.

1 Ответ

1 голос
/ 20 февраля 2020

Если проблема связана только с DrawerHeader, попробуйте обернуть его SizedBox или ConstrainedBox и задать ему определенную высоту и ширину. Проблема в том, что DrawerHeader не является контрастренным, поэтому ListView во время сборки не узнает его размеры или ограничения и выдает эту ошибку.

Это мое обоснованное предположение и дайте мне знать, сработало или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...