Flutter(五):ListView、Card

本文介绍了在Flutter中使用ListView和Card布局组件的示例,包括ListView的基本用法、水平滚动和分隔线,以及Card组件的结构与功能展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ListView

在这里插入图片描述

import 'package:flutter/material.dart';

class Item<T, K> {
  final Icon icon;
  final T title;
  final K secondary;

  const Item({required this.icon, required this.title, required this.secondary});
}

class ListViewPage extends StatefulWidget {
  const ListViewPage({super.key});

  
  State<ListViewPage> createState() => _ListViewPageState();
}

class _ListViewPageState extends State<ListViewPage> {
  List<Item<String, String>> items = const [
    Item(icon: Icon(Icons.face), title: "赵", secondary: "Zhao"),
    Item(icon: Icon(Icons.face_2), title: "钱", secondary: "Qian"),
    Item(icon: Icon(Icons.face_3), title: "孙", secondary: "Sun"),
    Item(icon: Icon(Icons.face_4), title: "李", secondary: "Li"),
    Item(icon: Icon(Icons.face_5), title: "周", secondary: "Zhou"),
    Item(icon: Icon(Icons.face_6), title: "吴", secondary: "Wu"),
  ];

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('ListView 布局')),
      body: SingleChildScrollView(
        child: Wrap(
          children: [
            const Text('ListView'),
            SizedBox(
              height: 100,
              child: ListView(
                scrollDirection: Axis.horizontal,
                children: [
                  Container(width: 100, color: Colors.red),
                  const VerticalDivider(),
                  Container(width: 200, color: Colors.orange),
                  const VerticalDivider(),
                  Container(width: 150, color: Colors.yellow),
                  const VerticalDivider(),
                  Container(width: 300, color: Colors.green),
                  const VerticalDivider(),
                  Container(width: 250, color: Colors.cyan),
                ],
              ),
            ),
            const Text('ListView.separated'),
            ListView.separated(
              shrinkWrap: true,
              physics: const NeverScrollableScrollPhysics(),
              itemBuilder: (BuildContext context, int index) {
                return ListTile(
                  leading: Container(
                    width: 40,
                    height: 40,
                    decoration: BoxDecoration(
                      color: Colors.black12,
                      borderRadius: const BorderRadius.all(Radius.circular(20)),
                      border: Border.all(color: Colors.cyan, width: 1),
                    ),
                    child: items[index].icon,
                  ),
                  title: Text(items[index].title),
                  subtitle: Text(items[index].secondary),
                  trailing: const Icon(Icons.chevron_right),
                  iconColor: Colors.blue,
                );
              },
              separatorBuilder: (BuildContext context, int index) {
                return const Divider(color: Colors.grey);
              },
              itemCount: items.length,
            ),
          ],
        ),
      ),
    );
  }
}

Card

在这里插入图片描述

import 'package:flutter/material.dart';

class CardPage extends StatefulWidget {
  const CardPage({super.key});

  
  State<CardPage> createState() => _CardPageState();
}

class _CardPageState extends State<CardPage> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Card 布局')),
      body: Wrap(
        children: [
          Card(
            margin: const EdgeInsets.all(10),
            child: Column(
              children: [
                Container(
                  height: 50,
                  padding: const EdgeInsets.only(left: 10, right: 10),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      const Text('Card Title', style: TextStyle(fontSize: 18)),
                      TextButton(
                        onPressed: () => print('more...'),
                        style: TextButton.styleFrom(minimumSize: Size.zero),
                        child: const Text('more'),
                      ),
                    ],
                  ),
                ),
                const Divider(height: 0),
                Image.network(
                  'https://gw.alipayobjects.com/zos/rmsportal/JiqGstEfoWAOHiTxclqi.png',
                  width: double.infinity,
                  fit: BoxFit.cover,
                ),
                const Divider(height: 0),
                ListTile(
                  leading: Container(
                    width: 40,
                    height: 40,
                    decoration: const BoxDecoration(
                      color: Colors.lightBlue,
                      borderRadius: BorderRadius.all(Radius.circular(20)),
                    ),
                    child: const Icon(Icons.face, color: Colors.white),
                  ),
                  title: const Text('Card Title'),
                  subtitle: const Text('This is the description ...'),
                ),
                const Divider(height: 0),
                SizedBox(
                  height: 50,
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      IconButton(onPressed: () => print('设置'), icon: const Icon(Icons.settings), color: Colors.grey),
                      const VerticalDivider(),
                      IconButton(onPressed: () => print('编辑'), icon: const Icon(Icons.edit), color: Colors.grey),
                      const VerticalDivider(),
                      IconButton(onPressed: () => print('更多'), icon: const Icon(Icons.more), color: Colors.grey),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prosper Lee

您的赏赐将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值