如何使Flutter卡片根据内容自动调整高度

31
在这个项目中,我正在使用flutter卡片中的图片和文本,但是卡片返回了固定的高度。我也尝试仅使用一个空值的卡片,但它仍然返回固定的高度。我该怎么做才能使卡片的高度根据内容自适应呢?
    @override
    Widget build(BuildContext context) {
    final title = '美食菜单';
    return MaterialApp(
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: Text(title),
        ),
        body: GridView.builder(
            itemCount: _listViewData.length,
            gridDelegate:
                SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
            itemBuilder: (context, index) {
              return Card(
                margin: const EdgeInsets.all(10.0),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Flexible(
                      flex: 1,
                      child: Image.network(
                        _listViewDataImage[index],
                        fit: BoxFit.fill,
                      ),
                    ),
                    Padding(
                      padding: EdgeInsets.fromLTRB(16.0, 12.0, 16.0, 8.0),
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Text(
                            _listViewData[index],
                            textAlign: TextAlign.center,
                          ),
                        ],
                      ),
                    ),
                  ],
                ),
              );
            }),
      ),
    );
  }

enter image description here

3个回答

23
问题来自于SliverGridDelegateWithFixedCrossAxisCount: 创建具有固定交叉轴上瓷砖数量的网格布局
此委托创建具有大小相等且间隔相等的瓷砖的网格。
我建议您使用flutter_staggered_grid_view:并放弃AspectRatio小部件。有关平铺的更多信息在这里
body: StaggeredGridView.countBuilder(
   crossAxisCount: 2,
   itemCount: 6,
   itemBuilder: (BuildContext context, int index) => 
     Card(
       margin: const EdgeInsets.all(10.0),
       child: Container(
         child: Column(
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
            Image.network('https://upload.wikimedia.org/wikipedia/commons/6/66/An_up-close_picture_of_a_curious_male_domestic_shorthair_tabby_cat.jpg',
              fit: BoxFit.fill,
            ),
            Padding(
              padding: EdgeInsets.fromLTRB(16.0, 12.0, 16.0, 8.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text("Cat",textAlign: TextAlign.center),
                ],
            ),
         )],
       ),
     )
   ),
   staggeredTileBuilder: (int index) =>
     StaggeredTile.fit(1),
)

它很好地解决了我的问题,第一个是关于卡片的,第二个是由于固定大小而导致的底部溢出,非常感谢... - Fatoni

16

您想使用Column将卡片包裹起来,因为内部的列会占满整个高度。

 Column(children: <Widget>[
      Card(
        margin: const EdgeInsets.all(10.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            AspectRatio(
              aspectRatio: 18.0 / 13.0,
              child: Image.network(
               "https://picsum.photos/200",
                fit: BoxFit.fill,
              ),
            ),
            Padding(
              padding: EdgeInsets.fromLTRB(16.0, 12.0, 16.0, 8.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text(
                    "Just add your desired image size (width & height) after our URL, and you'll get a random image.",
                    textAlign: TextAlign.center,
                  ),
                ],
              ),
            ),
          ],
        ),
      )
])

填写图像描述


7

尝试使用flutter_staggered_grid_view包。

在pubspec.yaml中添加以下依赖项:

dependencies:
  flutter_staggered_grid_view: any

在您的代码库中,添加以下导入:

import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';

例子:

  StaggeredGridView.countBuilder(
  crossAxisCount: 4,
  itemCount: 8,
  itemBuilder: (BuildContext context, int index) => new Container(
      color: Colors.green,
      child: new Center(
        child: new CircleAvatar(
          backgroundColor: Colors.white,
          child: new Text('$index'),
        ),
      )),
  staggeredTileBuilder: (int index) =>
      new StaggeredTile.count(2, index.isEven ? 2 : 1),
  mainAxisSpacing: 4.0,
  crossAxisSpacing: 4.0,
),

使用方式与 GridView 相同。

输出:

enter image description here


构造函数:

StaggeredGridView 遵循与GridView相同的构造函数约定。 另外还有两个构造函数: countBuilderextentBuilder。这些构造函数允许您定义一个用于布局的builder和一个用于子节点的builder。

瓷砖 :

StaggeredGridView 需要知道如何显示每个tile以及哪个widget与tile相关联。

Tile 需要在跨轴中占用固定数量的单元格。对于主轴中的extent,您有03个选项:

  1. 您想要固定数量的单元格 => 使用 StaggeredTile.count
  2. 您想要固定 extent => 使用 StaggeredTile.extent
  3. 您想要一个变量extent,由tile本身的内容定义 => 使用 StaggeredTile.fit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接