flutter常见报错 hasSize 为什么出现 解决办法

flutter常见报错 hasSize 为什么出现 解决办法_第1张图片
出现这个hasSize的报错的原因:

  • 当父Widget需要子Widget给出大小的时候
  • 子Widget需要占据尽可能多的地方

什么叫 子Widget需要尽可能多的占据空间?

  • 像Column ListView这些Wiget它如果没有专门设置对应的属性 那么它默认的情况就是会尽可能多的占据 空间
  • 对于父Widget如果是一个需要知道子Widget的高度的情况 就会无法计算排布

这个时候 父Widget就会不知道怎么排布而报错

比如一个Container套一个ListView这样就会报错

或者是一个ListView套一个ListView

  Widget buildMakeMaterial() {
    return Container(
      child: ListView.builder(
        itemCount: _meal.ingredients.length,
        itemBuilder: (ctx, index) {
          return Card(
            child: Text(_meal.ingredients[index]),
          );
        }
      ),
    );
  }
  • 解决办法
  1. 当然我们可以给它一个高度来解决这个问题
  2. 同时我们可以根据子Widget的不同来设置对应的属性来让他可以 有一个固定的高度
  • 设置高度

我们给外层定一个高度 这样是可以的

但是这个会出现要一个问题 它会有一个部分滚动 作用

当然如果你就是想做这个效果 那就不用管 这样写就可以了

//  2. 制作材料
  Widget buildMakeMaterial() {
    return Container(
      height: 300,
      child: ListView.builder(
        itemCount: _meal.ingredients.length,
        itemBuilder: (ctx, index) {
          return Card(
            child: Text(_meal.ingredients[index]),
          );
        }
      ),
    );
  }

flutter常见报错 hasSize 为什么出现 解决办法_第2张图片

  • 设置属性

如果是ListView我们可以设置这几个属性让它可以 普通的显示

这里我们设置他们三个样式

  1. shrinkWrap: 是否包裹 true就是要包裹 默认是false
  2. physics: 是否滚动 这样滚动条都看不见了
  3. padding: 以前的flutter版本里面 ListView是有默认的内边距的 所以需要设置这个来减少内边距
//  2. 制作材料
  Widget buildMakeMaterial() {
    return Container(
      color: Colors.orange,
      child: ListView.builder(
        shrinkWrap: true,
        padding: EdgeInsets.zero,
        physics: NeverScrollableScrollPhysics(),
        itemCount: _meal.ingredients.length,
        itemBuilder: (ctx, index) {
          return Card(
            child: Padding(
              padding: const EdgeInsets.all(30.0),
              child: Text(_meal.ingredients[index]),
            ),
          );
        }
      ),
    );
  }

flutter常见报错 hasSize 为什么出现 解决办法_第3张图片

Column这个东西做为子Widget也是同理 所以我们需要设置属性来解决这个问题

如果是Column 的话我们可以给它设置

	Column {
		mainAxisSize: MainAxisSize.min
	}

你可能感兴趣的:(flutter)