簡體   English   中英

Flutter - 具有無限高度錯誤的水平 ListView

[英]Flutter - Horizontal ListView with Unbounded height error

當 scrollDirection 設置為垂直時,它按預期工作。 問題是當我將 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);
            }
          },
        ),
      ],
    );
  }
}

這是因為 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的更多信息

編輯:

我認為使用 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(),
                ],
              );
            },
          ),
        ),
      ],
    );
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM