IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter ListView使用方法 -> 正文阅读

[移动开发]Flutter ListView使用方法

ListView使用方法

ListView 内部组合了 Scrollable、Viewport 和 Sliver,需要注意:

  • ListView 中的列表项组件都是 RenderBox,并不是 Sliver, 这个一定要注意。
  • 一个 ListView 中只有一个Sliver,对列表项进行按需加载的逻辑是 Sliver 中实现的。
  • ListView 的 Sliver 默认是 SliverList,如果指定了 itemExtent ,则会使用 SliverFixedExtentList;如果 - prototypeItem 属性不为空,则会使用 SliverPrototypeExtentList,无论是是哪个,都实现了子组件的按需加载模型。
///
/// ListView 线性列表

class ListViewApp extends StatelessWidget {
  const ListViewApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) => _ListViewPage();
}

class _ListViewPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _ListViewState();
}

class _ListViewState extends State<_ListViewPage> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  @override
  Widget build(BuildContext context) => MaterialApp(
        home: PageView(
          children: [
            Scaffold(
              appBar: AppBar(
                title: const Text('这是用构造函数创建的'),
                centerTitle: true,
              ),
              body: ListView(
                //控件高度
                itemExtent: 200,
                //横向滚动
                scrollDirection: Axis.horizontal,
                //分割线包裹
                children: ListTile.divideTiles(
                    color: Colors.black,
                    context: context,
                    tiles: [

                      Container(
                        margin: const EdgeInsets.only(
                            left: 10, right: 10, top: 100, bottom: 100),
                        decoration: ShapeDecoration(
                            image: const DecorationImage(
                                image: NetworkImage(
                                    'https://th.bing.com/th/id/OIP.1_lUKm-qhDMmh_zz3fw7EwHaE7?w=284&h=189&c=7&r=0&o=5&dpr=2&pid=1.7'),
                                fit: BoxFit.cover),
                            shape: RoundedRectangleBorder(
                                borderRadius:
                                    BorderRadiusDirectional.circular(20))),
                        child: const Align(
                          child: Padding(
                            padding: EdgeInsets.all(8.0),
                            child: Text(
                              "Container decoration实现圆角(radius = 20)",
                              style: TextStyle(color: Colors.blueAccent),
                            ),
                          ),
                          alignment: Alignment.bottomCenter,
                        ),
                      ),
                      Container(
                        alignment: Alignment.center,
                        margin: const EdgeInsets.only(
                            left: 10, right: 10, top: 100, bottom: 100),
                        decoration: const BoxDecoration(
                            borderRadius: BorderRadius.all(Radius.circular(20)),
                            color: Colors.blueAccent),
                        padding: const EdgeInsets.all(20),
                        child: const Text(
                          '这是文本item',
                          style: TextStyle(fontSize: 30, color: Colors.white),
                        ),
                      ),
                      Container(
                        margin: const EdgeInsets.only(
                            left: 10, right: 10, top: 100, bottom: 100),
                        decoration: ShapeDecoration(
                            image: const DecorationImage(
                                image: NetworkImage(
                                    'https://th.bing.com/th/id/OIP.1_lUKm-qhDMmh_zz3fw7EwHaE7?w=284&h=189&c=7&r=0&o=5&dpr=2&pid=1.7'),
                                fit: BoxFit.cover),
                            shape: RoundedRectangleBorder(
                                borderRadius:
                                BorderRadiusDirectional.circular(20))),
                        width: double.maxFinite,
                        child: const Align(
                          child: Padding(
                            padding: EdgeInsets.all(8.0),
                            child: Text(
                              "Container decoration实现圆角(radius = 20)",
                              style: TextStyle(color: Colors.blueAccent),
                            ),
                          ),
                          alignment: Alignment.bottomCenter,
                        ),
                      ),
                      Container(
                        margin: const EdgeInsets.only(
                            left: 10, right: 10, top: 100, bottom: 100),
                        decoration: const BoxDecoration(
                            borderRadius: BorderRadius.all(Radius.circular(20)),
                            color: Colors.blueAccent),
                        alignment: Alignment.center,
                        padding: const EdgeInsets.all(20),
                        child: const Text(
                          '这是文本item',
                          style: TextStyle(fontSize: 30, color: Colors.white),
                        ),
                      ),
                    ]).toList(),
              ),
            ),
            //使用builder函数创建的
            Scaffold(
              appBar: AppBar(
                title: const Text('这是build函数创建的'),
                centerTitle: true,
              ),
              body: ListView.builder(
                  //item总条数,如果不设置就是无限多条
                  itemCount: 20,
                  //item高度
                  itemExtent: 80,
                  itemBuilder: (BuildContext context, int index) {
                    return ListTile(
                      //文本内容上面添加个图标
                      leading: const CircleAvatar(
                        backgroundImage: NetworkImage(
                            'https://th.bing.com/th/id/OIP.cocZ4jgMxBCJLexP8JaKoAHaE7?w=246&h=180&c=7&r=0&o=5&dpr=2&pid=1.7'),
                      ),
                      //最右边添加图片或者其他控件都行
                      trailing: const Icon(Icons.navigate_next_outlined),
                      //上面的文本内容
                      title: Text('这是Title$index'),
                      //下面的文本内容
                      subtitle: Text('这是SubTitle$index'),
                      dense: true,
                      //文本颜色
                      textColor: Colors.lightBlue[100 * (index + 1)],
                      //背景色
                      tileColor: Colors.white54,
                      style: ListTileStyle.drawer,
                      //设置内边距默认是16
                      contentPadding: const EdgeInsets.all(14),
                      //选中状态
                      selected: index % 7 == 0,
                      //选中的文本颜色
                      selectedColor: Colors.deepOrange,
                      //选中的背景色
                      selectedTileColor: Colors.deepPurple,
                      //点击事件
                      onTap: () {},
                      //长安点击
                      onLongPress: () {},
                      //是否禁用,禁用后就不能点击了
                      enabled: index % 3 != 0,
                    );
                  }),
            ),
            //使用separated创建的可以创建分割组件
            Scaffold(
              appBar: AppBar(
                title: const Text('这是build函数创建的'),
                centerTitle: true,
              ),
              body: ListView.separated(
                  //翻转从下往上滚动
                  reverse: true,
                  //item总条数,如果不设置就是无限多条
                  itemCount: 20,
                  //item之间的分割自定义组件,也可使用ListTile.divideTiles包裹
                  separatorBuilder: (BuildContext context, int index) {
                    return Container(
                      child: const Text('我是分割线'),
                      color: Colors.amber,
                      alignment: Alignment.center,
                    );
                  },
                  itemBuilder: (BuildContext context, int index) {
                    return ListTile(
                      //文本内容上面添加个图标
                      leading: const CircleAvatar(
                        backgroundImage: NetworkImage(
                            'https://th.bing.com/th/id/OIP.cocZ4jgMxBCJLexP8JaKoAHaE7?w=246&h=180&c=7&r=0&o=5&dpr=2&pid=1.7'),
                      ),
                      //最右边添加图片或者其他控件都行
                      trailing: const Icon(Icons.navigate_next_outlined),
                      //上面的文本内容
                      title: Text('这是Title$index'),
                      //下面的文本内容
                      subtitle: Text('这是SubTitle$index'),
                      dense: true,
                      //文本颜色
                      textColor: Colors.lightBlue[100 * (index + 1)],
                      //背景色
                      tileColor: Colors.white54,
                      style: ListTileStyle.drawer,
                      //设置内边距默认是16
                      contentPadding: const EdgeInsets.all(14),
                      //选中状态
                      selected: index % 7 == 0,
                      //选中的文本颜色
                      selectedColor: Colors.deepOrange,
                      //选中的背景色
                      selectedTileColor: Colors.deepPurple,
                      //点击事件
                      onTap: () {},
                      //长安点击
                      onLongPress: () {},
                      //是否禁用,禁用后就不能点击了
                      enabled: index % 3 != 0,
                    );
                  }),
            )
          ],
        ),
      );
}

///
/// 分页加载数据
///
class _ListViewMoreState extends State<_ListViewPage> {
  static const tagLastPage = "加载更多...";
  final _data = <String>[tagLastPage];

  ///
  /// 模拟加载数据
  _loadingMoreDate() {
    Future.delayed(const Duration(milliseconds: 3000)).then((value) {
      setState(() {
        for (int i = 0; i < 20; i++) {
          _data.insert(_data.length - 1, "item${_data.length},value=$value");
        }
      });
    });
  }

  @override
  void initState() {
    super.initState();
    _loadingMoreDate();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: ListView.separated(
            itemCount: _data.length,
            separatorBuilder: (context, index) {
              return const Divider(
                height: 1,
                color: Colors.grey,
              );
            },
            itemBuilder: (context, index) {
              if (_data[index] == tagLastPage) {
                if (_data.length > 100) {
                  return const ListTile(
                    title: Center(
                      child: Text('没有更多数据'),),
                    textColor: Colors.grey,
                  );
                } else {
                  _loadingMoreDate(); //加载下一页数据
                  return ListTile(
                    title: Center(
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          const CircularProgressIndicator(),
                          const SizedBox(width: 14,),
                          Text(_data[index])
                        ],
                      ),
                    ),
                    textColor: Colors.grey,
                  );
                }
              } else {
                return ListTile(
                  leading: const CircleAvatar(
                    backgroundImage: NetworkImage(
                        'https://tse1.mm.bing.net/th/id/OET.2762872920ea4e6294085775af35b05f?w=272&h=272&c=7&rs=1&o=5&dpr=2&pid=1.9'),
                  ),
                  title: Text(_data[index]),
                  textColor: Colors.black,
                );
              }
            }),
      ),
    );
  }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 12:02:03  更:2022-01-28 12:04:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:38:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码