Flutter - горизонтальный ListView с ошибкой неограниченной высоты - PullRequest
0 голосов
/ 11 июля 2020

Когда для scrollDirection установлено значение vertical, он работает должным образом. Проблема в том, что я устанавливаю section.axis на Axis.horizontal, чтобы ListView отображал виджеты по горизонтали.

Эта проблема не решается с помощью гибкого или расширенного виджета, потому что необходимо определить высоту ListView виджетами в списке.

Как видите, shrinkWrap также включен. Так что я не знаю, что здесь происходит, спасибо за помощь.

Консоль говорит: «constraints.hasBoundedHeight»: неверно. Соответствующий виджет, вызывающий ошибку: ListView

class SectionWidget extends StatelessWidget {
  final Section section;

  const SectionWidget({@required this.section});

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        Text(section.title),
        ListView.separated(
          shrinkWrap: true,
          scrollDirection: section.axis,
          physics: section.axis == Axis.vertical
              ? NeverScrollableScrollPhysics()
              : null,
          itemCount: section.itemList.length,
          itemBuilder: (BuildContext context, int index) {
            return Container(
              height: 100,
              width: 100,
              color: Colors.red,
            ); // Just to test if it works
          },
          separatorBuilder: (BuildContext context, int index) {
            double paddingBetween = 10;
            if (section.axis == Axis.horizontal) {
              return SizedBox(width: paddingBetween);
            } else {
              return SizedBox(height: paddingBetween);
            }
          },
        ),
      ],
    );
  }
}

1 Ответ

1 голос
/ 11 июля 2020

Это потому, что Column или Row дает столько высоты / ширины, сколько нужно их дочерним элементам, а ListView берет столько высоты / ширины, сколько доступно от его родителя.

Чтобы исправить это, просто оберните ListView в контейнер. Вот так:

import 'package:flutter/material.dart';

class SectionWidget extends StatelessWidget {
  final Section section;

  const SectionWidget({@required this.section});

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        Text(section.title),
        Container(
          height: section.axis == Axis.horizontal ? 100 : 700,  // I just set these values
          width: section.axis == Axis.horizontal ? 350 : 100,   // to fit with my device.
          child: ListView.separated(                            // If you want to fit for 
            shrinkWrap: true,                                   // all devices, use MediaQuery
            scrollDirection: section.axis,
            physics: section.axis == Axis.vertical
                ? NeverScrollableScrollPhysics()
                : null,
            itemCount: section.itemList.length,
            itemBuilder: (BuildContext context, int index) {
              return Container(
                height: 100,
                width: 100,
                color: Colors.red,
              ); // Just to test if it works
            },
            separatorBuilder: (BuildContext context, int index) {
              double paddingBetween = 10;
              if (section.axis == Axis.horizontal) {
                return SizedBox(width: paddingBetween);
              } else {
                return SizedBox(height: paddingBetween);
              }
            },
          ),
        ),
      ],
    );
  }
}

Для получения дополнительной информации о MediaQuery

Edit:

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

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Expanded(
          child: Text(section.title),
        ),
        SizedBox(
          width: MediaQuery.of(context).size.width,
          height: MediaQuery.of(context).size.height,
          child: GridView.builder(
            gridDelegate:
                SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 1),
            shrinkWrap: true,
            scrollDirection: section.axis,
            physics: section.axis == Axis.vertical
                ? NeverScrollableScrollPhysics()
                : null,
            itemCount: section.itemList.length,
            itemBuilder: (context, index) {
              return Column(
                mainAxisSize: MainAxisSize.min,
                mainAxisAlignment: MainAxisAlignment.start,
                children: <Widget>[
                  // Spacer(),
                  Container(
                    margin: EdgeInsets.all(10),
                    height: 100,
                    width: 100,
                    color: Colors.red,
                  ),
                  // Spacer(),
                ],
              );
            },
          ),
        ),
      ],
    );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...