flutter 实战 之 ListView 进阶

有哪些好看的壁纸值得推荐? - 知乎

 这一章我们来学习动态构造List

如果要实现上面的效果,我们可以用枚举的形式实现

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:pivot_chat/widgets/button/_PCHomePageButton.dart';

class test extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            leading: IconButton(
              onPressed: (){},
              icon: Icon(ItyingFont.icon1,
              color: Colors.pinkAccent,
              ),
            ),
          ),
          body: ListView(
              children: [
                ListTile(
                  title: Text("这是一个简单话"),
                ),
                ListTile(
                  title: Text("这是一个简单话"),
                ),
                ListTile(
                  title: Text("这是一个简单话"),
                ),
                ListTile(
                  title: Text("这是一个简单话"),
                ),
                ListTile(
                  title: Text("这是一个简单话"),
                ),
                ListTile(
                  title: Text("这是一个简单话"),
                ),
                ListTile(
                  title: Text("这是一个简单话"),
                ),
              ],

          ),
        ),

    );
  }

}

 那有没有什么改进的方法呢?
我们可以利用循环构造出这样的效果呢
看看代码是如何实现的

定义了 _initListData 方法,该方法返回一个包含20个 ListTile 小部件的列表,且我们是利用循环来实现list的构造

如果要利用动态构造实现下面的效果呢

 我们上代码:

import 'package:flutter/material.dart';
// import 'package:hive/hive.dart';
import 'package:pivot_chat/widgets/button/_PCHomePageButton.dart';

class test extends StatelessWidget {
  

  List <Widget> _initListData (){

    List <Widget> listTemp = [];

    for(var i = 0; i< listData.length ;i++)
      {
        listTemp.add(
          ListTile(
            leading: Image.network("${listData[i]["imageUrl"]}"),
            title: Text("${listData[i]["title"]}"),
            subtitle: Text("${listData[i]["author"]}"),
          )
        );
      }

    return listTemp;
  }

  @override
  Widget build(BuildContext context) {

    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            leading: IconButton(
              onPressed: (){},
              icon: Icon(ItyingFont.icon1,
              color: Colors.pinkAccent,
              ),
            ),
          ),
          body: ListView(
              children: _initListData()

          ),
        ),

    );
  }

}

List  listData = [
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://p.qqan.com/up/2021-7/16275387033501829.jpg",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://pic1.zhimg.com/v2-b59b1fe5c979f7cb7cdde7bf788a4f3a_r.jpg?source=1940ef5c",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://pic2.zhimg.com/v2-d6d0c956d30aa63894cc1cc96901ce07_r.jpg?source=1940ef5c",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://ts1.cn.mm.bing.net/th/id/R-C.0382d85bc77f87547a0d263d727ac78a?rik=DeEpYNkFDhNYwQ&riu=http%3a%2f%2f5b0988e595225.cdn.sohucs.com%2fimages%2f20190815%2f2422bae53bbe495eadb8c35e4115f971.JPG&ehk=EXo1y564J33smY0E4iRbb%2b6Uf8x9szvNt480zkQXHyk%3d&risl=&pid=ImgRaw&r=0",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://tse1-mm.cn.bing.net/th/id/OIP-C.aBs3l0c_sS5UmTWOaK7wgAAAAA?pid=ImgDet&rs=1",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://pic2.zhimg.com/v2-8176dbd89ee8edecf5956bae2dd0642d_r.jpg?source=1940ef5c",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://ts1.cn.mm.bing.net/th/id/R-C.7538a1d27d1eb2bdaf4f7fe5171d3bb4?rik=Xo3lEaJdBdyZQQ&riu=http%3a%2f%2fdesk.fd.zol-img.com.cn%2fg5%2fM00%2f02%2f0F%2fChMkJlbK7JeIFhACAArOl2v-eCMAALKjgJtPOEACs6v923.jpg&ehk=o0LZfd%2fE2nk5E2n%2fxNapnr%2fCMkZLHYMbO25hE4LLq60%3d&risl=&pid=ImgRaw&r=0",
  },

  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://ts1.cn.mm.bing.net/th/id/R-C.c316b5a061d2e6f534ea4669efaf4202?rik=CcnSN0WU9U1clA&riu=http%3a%2f%2fpic.bizhi360.com%2fbbpic%2f6%2f1106.jpg&ehk=HKvV9IRto0udrSWZrpOzTssWQ3oJBuwMAbT1T%2bKEWQw%3d&risl=&pid=ImgRaw&r=0",
  },

];

分析一下上面的代码,首先写一个 listData ,里面装载页面里面所需要的数据, 在方法 _initListData 中 再定义一个新的 List 数组来装载ListView
我们可以改进一下代码
对于 _initListData 方法,我们可以升级一下代码

List<Widget> _initListData() {
  var tempList = listData.map((value) {
    return ListTile(
      leading: Image.network("${value["imageUrl"]}"),
      title: Text("${value["title"]}"),
      subtitle: Text("${value["author"]}"),
    );
  });

  return tempList.toList();
}

如何理解上面的代码呢:

  1. listData.map((value) { ... }) 是一个高阶函数(Higher-order function),它将 listData 中的每个元素 value 进行处理并返回一个新的迭代器(Iterable)。

  2. toList() 方法将迭代器 tempList 转换为一个真正的 List<Widget>,这样就得到了包含所有列表项小部件的列表。

下面我们来学习如何利用ListView.Builder
看看代码:

import 'package:flutter/material.dart';
// import 'package:hive/hive.dart';
import 'package:pivot_chat/widgets/button/_PCHomePageButton.dart';

class test extends StatelessWidget {


  List <String> list = [];
  test({Key ? key}) : super(key : key){
    for(var i = 0; i< 20 ;i++)
      {
        list.add("我是第${i+1}条数据");
      }
  }


  @override
  Widget build(BuildContext context) {

    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            leading: IconButton(
              onPressed: (){},
              icon: Icon(ItyingFont.icon1,
              color: Colors.pinkAccent,
              ),
            ),
          ),
          body: ListView.builder(   //类比于循环,itemCount
              itemCount: list.length,
              itemBuilder: (context , index){
                return ListTile(
                  title: Text("${list[index]}"),
                );

              } )
        ),

    );
  }

}

效果如下:

 我们在构造器里面初始化了一个列表,然后在ListView.Builder里面构造

那如何用ListView.Builder 来实现下面这个呢?

import 'package:flutter/material.dart';
// import 'package:hive/hive.dart';
import 'package:pivot_chat/widgets/button/_PCHomePageButton.dart';

class test extends StatelessWidget {


  List <String> list = [];


  @override
  Widget build(BuildContext context) {

    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            leading: IconButton(
              onPressed: (){},
              icon: Icon(ItyingFont.icon1,
              color: Colors.pinkAccent,
              ),
            ),
          ),
          body: ListView.builder(   //类比于循环,itemCount
              itemCount: listData.length,
              itemBuilder: (context , i){
              return ListTile(
                leading: Image.network("${listData[i]["imageUrl"]}"),
                title: Text("${listData[i]["title"]}"),
                subtitle: Text("${listData[i]["author"]}"),
              );

              } )
        ),

    );
  }

}

List  listData = [
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://p.qqan.com/up/2021-7/16275387033501829.jpg",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://pic1.zhimg.com/v2-b59b1fe5c979f7cb7cdde7bf788a4f3a_r.jpg?source=1940ef5c",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://pic2.zhimg.com/v2-d6d0c956d30aa63894cc1cc96901ce07_r.jpg?source=1940ef5c",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://ts1.cn.mm.bing.net/th/id/R-C.0382d85bc77f87547a0d263d727ac78a?rik=DeEpYNkFDhNYwQ&riu=http%3a%2f%2f5b0988e595225.cdn.sohucs.com%2fimages%2f20190815%2f2422bae53bbe495eadb8c35e4115f971.JPG&ehk=EXo1y564J33smY0E4iRbb%2b6Uf8x9szvNt480zkQXHyk%3d&risl=&pid=ImgRaw&r=0",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://tse1-mm.cn.bing.net/th/id/OIP-C.aBs3l0c_sS5UmTWOaK7wgAAAAA?pid=ImgDet&rs=1",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://pic2.zhimg.com/v2-8176dbd89ee8edecf5956bae2dd0642d_r.jpg?source=1940ef5c",
  },
  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://ts1.cn.mm.bing.net/th/id/R-C.7538a1d27d1eb2bdaf4f7fe5171d3bb4?rik=Xo3lEaJdBdyZQQ&riu=http%3a%2f%2fdesk.fd.zol-img.com.cn%2fg5%2fM00%2f02%2f0F%2fChMkJlbK7JeIFhACAArOl2v-eCMAALKjgJtPOEACs6v923.jpg&ehk=o0LZfd%2fE2nk5E2n%2fxNapnr%2fCMkZLHYMbO25hE4LLq60%3d&risl=&pid=ImgRaw&r=0",
  },

  {
    "title" : 'Candy Shop',
    "author":"Mohanmed Chin",
    "imageUrl" :"https://ts1.cn.mm.bing.net/th/id/R-C.c316b5a061d2e6f534ea4669efaf4202?rik=CcnSN0WU9U1clA&riu=http%3a%2f%2fpic.bizhi360.com%2fbbpic%2f6%2f1106.jpg&ehk=HKvV9IRto0udrSWZrpOzTssWQ3oJBuwMAbT1T%2bKEWQw%3d&risl=&pid=ImgRaw&r=0",
  },

];

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wniuniu_

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值