【问题标题】:Place widgets correctly inside a Card将小部件正确放置在卡片内
【发布时间】:2020-01-17 12:55:37
【问题描述】:

我正在尝试使用 Card 小部件创建 ListView。

我有 ListView 和 Card,但我不知道如何在 Card 本身内正确放置小部件。这是现在的样子:

我希望收藏夹图标和图像保留其位置,但将文本移动到图像附近,并让“Jean-Paul-Gaultier”文本更靠近“Le Male”并拥有它左对齐。

这是我目前所拥有的:

Widget _myListView(BuildContext context) { 
return ListView.builder(
  itemBuilder: (context, index){
    return Card(

      child: Row(
        mainAxisSize: MainAxisSize.max,
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          Column(
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Image.network('${decoded[index]['image']}'),
              ),
            ],
          ),
          SizedBox(width: 8,),
          Column(
            children: <Widget>[
              Text(
                '${decoded[index]['name']}',
                style: TextStyle(
                  color: Colors.black87,
                  fontWeight: FontWeight.bold,
                  fontSize: 14,
                ),
              ),
              Row(
                children: <Widget>[
                  Text(
                    '${decoded[index]['brand']}',
                    style: TextStyle(
                      color: Colors.blueGrey,
                      fontWeight: FontWeight.normal,
                      fontSize: 12,
                    ),
                  ),
                ],
              ),
            ],
          ),
          Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              IconButton(
                icon: Icon(Icons.favorite_border),
              ),
            ],
          ),
        ],
      ),
    );
  },
);
}

如果没有mainAxisAlignment: MainAxisAlignment.space-between,文本确实更靠近图像,但收藏夹图标会靠近文本,这是我不想要的。

我试图搜索答案,但由于我是 Flutter 新手,我真的不知道正确的关键字,所以我找不到任何东西。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    更简单的方法是使用ListTile

      Widget _myListView(BuildContext context) {
        return ListView.builder(
          itemBuilder: (context, index) {
            return Card(
              child: ListTile(
                title: Text("title"),
                subtitle: Text("subtitle"),
                leading: Container(
                  width: 48, height: 48,
                  child: Placeholder(), //place image here replacing the Placeholder widget
                ),
                trailing: IconButton(
                  icon: Icon(Icons.favorite_border),
                  onPressed: () {},
                ),
              ),
            );
          },
        );
      }
    

    这给了我们


    但如果你想要你的代码,那么这里就是

      Widget _myListView(BuildContext context) {
        return ListView.builder(
          itemBuilder: (context, index) {
            return Card(
              child: Row(
                children: <Widget>[
                  Container(
                    margin: const EdgeInsets.all(8.0),
                    child: Placeholder(),
                    width: 48,
                    height: 48,
                  ),
                  SizedBox(
                    width: 8,
                  ),
                  Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Text(
                        'title',
                        style: TextStyle(
                          color: Colors.black87,
                          fontWeight: FontWeight.bold,
                          fontSize: 14,
                        ),
                      ),
                      Text(
                        'subtitle',
                        style: TextStyle(
                          color: Colors.blueGrey,
                          fontWeight: FontWeight.normal,
                          fontSize: 12,
                        ),
                      ),
                    ],
                  ),
                  Spacer(),
                  IconButton(
                    icon: Icon(Icons.favorite_border),
                    onPressed: () {},
                  ),
                ],
              ),
            );
          },
        );
      }
    

    编辑

    为了减少标题和副标题之间的空间,用下面的代码替换标题

     title: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Text("title",style: Theme.of(context).textTheme.body2,),
                     Text("subtitle",style: Theme.of(context).textTheme.caption,),
                  ],
                ),
    

    【讨论】:

    • 哇,谢谢!副标题离标题还很远,但除此之外,这很好用。
    • 您可以在答案中尝试清理后的代码版本
    • 您的解决方案更简单、更干净,我只做了我的解决方案,因为我不知道您的解决方案可行,我很乐意使用它。我只是想弄清楚为什么它会在标题和副标题之间留出这个空间。
    • 这是材料规格;请参阅答案中的编辑
    • 谢谢!它仍然有差距,但我稍后会尝试弄清楚,现在它不那么重要了。再次感谢您的出色回答,并感谢您抽出宝贵时间提供帮助。我真的很感激。
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 2020-01-22
    • 2020-08-29
    • 2019-07-21
    相关资源
    最近更新 更多