这一章我们来学习动态构造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();
}
如何理解上面的代码呢:
-
listData.map((value) { ... })
是一个高阶函数(Higher-order function),它将listData
中的每个元素value
进行处理并返回一个新的迭代器(Iterable)。 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",
},
];