Flutter的教程四:ListView

本文聚焦于Flutter中列表widget的学习。介绍了用ListView显示列表项,可通过属性控制垂直或水平方向展示,还提及了水平列表、垂直列表、大数据量列表及内置的ListTile。当前主要关注列表项展示,后续将单独学习相关组合widget及点击事件等。

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

本文学习一下列表widget,是最常见的需求 
在Flutter中,用ListView来显示列表项,支持垂直和水平方向展示,通过一个属性我们就可以控制其方向 
1.水平的列表 
2.垂直的列表 
3.数据量非常大的列表 
4.内置的ListTile(挺好用的)

4.内置的ListTile(挺好用的),先看下这个widget,在下面的listView中将直接使用

/**
 * ListTile
 */
import 'package:flutter/material.dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: "ListTile",
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("ListTile"),
        ),
        body: new MyCard(),
      ),
    );
  }
}

class MyCard extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyCardState();
  }
}

class MyCardState extends State<MyCard> {
  var _throwShotAway = false;

  @override
  Widget build(BuildContext context) {
    return new Card(
      child: new ListTile(
          title: new Text("duo_shine"),
          subtitle: new Text("duo_shine@163.com"),
          //之前显示icon
          leading: new Icon(Icons.email, color: Colors.blueAccent),
          //之后显示checkBox
          trailing: new Checkbox(
              value: _throwShotAway,
              onChanged: (bool newValue) {
                setState(() {
                  _throwShotAway = newValue;
                });
              })),
    );
  }
}

我们只关注ListTile即可,虽然组合了Card(Android的cardView)还有checkBox等widget,包括列表的点击事件等(ps:ListTile中有点击的监听onTap),这些后续我们将单独学习,当前我们在学习列表项展示 
运行: 
这里写图片描述


2.垂直的列表

import 'package:flutter/material.dart';
import 'package:meta/meta.dart';

void main() {
  runApp(new MyApp());
}

/**
 * 垂直listView
 */
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final title = 'list';
    return new MaterialApp(
      title: title,
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text(title),
        ),
        body: new Center(
          child: new ListView(
            //控制方向 默认是垂直的
//           scrollDirection: Axis.horizontal,
            children: <Widget>[
              _getContainer('Maps', Icons.map),
              _getContainer('phone', Icons.phone),
              _getContainer('Maps', Icons.map),
            ],
          ),
        ),
      ),
    );
  }

  /**
   * 抽取item项
   */
  Widget _getContainer(String test, IconData icon) {
    return new Container(
      width: 160.0,
//      ListTile
      child: new ListTile(
//       显示在title之前
        leading: new Icon(icon),
//        显示在title之后
        trailing: new Icon(icon),
        title: new Text(test),
        subtitle:new Text("我是subtitle") ,
      ),
    );
  }
}

运行: 
这里写图片描述


1.水平的列表

void main() {
  runApp(new MyApp());
}

/**
 * 垂直listView
 */
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final title = 'list';
    return new MaterialApp(
      title: title,
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text(title),
        ),
        body: new Center(
          child: new ListView(
            //控制方向 默认是垂直的
           scrollDirection: Axis.horizontal,
            children: <Widget>[
              _getContainer('Maps', Icons.map),
              _getContainer('phone', Icons.phone),
              _getContainer('Maps', Icons.map),
            ],
          ),
        ),
      ),
    );
  }

  /**
   * 抽取item项
   */
  Widget _getContainer(String test, IconData icon) {
    return new Container(
      width: 160.0,
//      ListTile
      child: new ListTile(
//       显示在title之前
        leading: new Icon(icon),
        title: new Text(test),
      ),
    );
  }
}

运行: 
这里写图片描述


3.数据量非常大的列表

import 'package:flutter/material.dart';
import 'package:meta/meta.dart';

void main() {
  runApp(new MyApp( items: new List<String>.generate(10000, (i) => "Item $i"),));
}

/**
 *大量的item 比如上万个
 */
class MyApp extends StatelessWidget {
  final List<String> items;

  MyApp({Key key, @required this.items}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final title = 'Long List';

    return new MaterialApp(
      title: title,
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text(title),
        ),
        body: new ListView.builder(
          itemCount: items.length,
          itemBuilder: (context, index) {
            return new ListTile(
              title: new Text('${items[index]}'),
            );
          },
        ),
      ),
    );
  }
}

运行: 
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值