如何在 Flutter 中制作两行的水平 ListView?
How to make a horizontal ListView with two row in Flutter?
我正在尝试在水平 GridView 或 ListView 中以两行显示目录列表
而不是单行列表数据来自服务器
水平 ListView 在一行中工作正常
我怎样才能实现下面的 GIF 效果?
下面是我的图片
下面是我需要的gif
[
下面是完整代码 水平 ListView 可以在一行中正常工作,我需要将它转换为 GridView 以便它可以显示两行和水平滚动
_catList() {
return Container(
height: 150,
child: ListView.builder(
itemCount: catList.length < 10 ? catList.length : 10,
scrollDirection: Axis.horizontal,
shrinkWrap: true,
physics: AlwaysScrollableScrollPhysics(),
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsetsDirectional.only(end: 10),
child: GestureDetector(
onTap: () async {
if (catList[index].subList == null ||
catList[index].subList.length == 0) {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ProductList(
name: catList[index].name,
id: catList[index].id,
tag: false,
updateHome: widget.updateHome),
));
if (mounted) setState(() {});
} else {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SubCat(
title: catList[index].name,
subList: catList[index].subList,
updateHome: widget.updateHome),
));
if (mounted) setState(() {});
}
},
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: const EdgeInsetsDirectional.only(bottom: 5.0),
child: new ClipRRect(
borderRadius: BorderRadius.circular(25.0),
child: new FadeInImage(
fadeInDuration: Duration(milliseconds: 50),
image: NetworkImage(
catList[index].image,
),
height: 100.0,
width: 100.0,
fit: BoxFit.cover,
imageErrorBuilder: (context, error, stackTrace) =>
erroWidget(100),
// errorWidget: (context, url, e) => placeHolder(50),
placeholder: placeHolder(100),
),
),
),
Container(
child: Text(
catList[index].name,
style: Theme.of(context).textTheme.caption.copyWith(
color: colors.fontColor,
fontWeight: FontWeight.w600,
fontSize: 15),
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
),
width: 100,
),
],
),
),
);
},
),
);
}
您可以使用网格视图来归档这个东西。这是配置的一个片段。
GridView.count(
shrinkWrap: true,
crossAxisCount: 2,
physics: const ClampingScrollPhysics(),
scrollDirection: Axis.horizontal,
crossAxisSpacing: 10,
mainAxisSpacing: 20,
children: ...)
这里 crossAxisCount: 2,scrollDirection: Axis.horizontal
就是你需要的。
您可以将 ListView.builder
与 itemCount: catList.length/2
和 return 一起使用 Column
与两个项目(索引和索引+1)
或使用GridView.count
:
Container(
height: 150,
child: GridView.count(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
crossAxisCount: 2,
children: catList.isEmpty ? [Container()] : catList.map((cat) {
return Padding(
padding: const EdgeInsetsDirectional.only(end: 10),
child: GestureDetector(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: const EdgeInsetsDirectional.only(bottom: 5.0),
child: new ClipRRect(
borderRadius: BorderRadius.circular(25.0),
child: new FadeInImage(
fadeInDuration: Duration(milliseconds: 50),
image: NetworkImage(
cat.image,
),
height: 100.0,
width: 100.0,
fit: BoxFit.cover,
imageErrorBuilder: (context, error, stackTrace) =>
erroWidget(100),
placeholder: placeHolder(100),
),
),
),
Container(
child: Text(
cat.name,
style: Theme.of(context).textTheme.caption.copyWith(
color: colors.fontColor,
fontWeight: FontWeight.w600,
fontSize: 15),
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
),
width: 100,
),
],
),
),
);
}).toList(),
),
);
我正在尝试在水平 GridView 或 ListView 中以两行显示目录列表
而不是单行列表数据来自服务器
水平 ListView 在一行中工作正常
我怎样才能实现下面的 GIF 效果?
下面是我的图片
下面是我需要的gif
下面是完整代码 水平 ListView 可以在一行中正常工作,我需要将它转换为 GridView 以便它可以显示两行和水平滚动
_catList() {
return Container(
height: 150,
child: ListView.builder(
itemCount: catList.length < 10 ? catList.length : 10,
scrollDirection: Axis.horizontal,
shrinkWrap: true,
physics: AlwaysScrollableScrollPhysics(),
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsetsDirectional.only(end: 10),
child: GestureDetector(
onTap: () async {
if (catList[index].subList == null ||
catList[index].subList.length == 0) {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ProductList(
name: catList[index].name,
id: catList[index].id,
tag: false,
updateHome: widget.updateHome),
));
if (mounted) setState(() {});
} else {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SubCat(
title: catList[index].name,
subList: catList[index].subList,
updateHome: widget.updateHome),
));
if (mounted) setState(() {});
}
},
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: const EdgeInsetsDirectional.only(bottom: 5.0),
child: new ClipRRect(
borderRadius: BorderRadius.circular(25.0),
child: new FadeInImage(
fadeInDuration: Duration(milliseconds: 50),
image: NetworkImage(
catList[index].image,
),
height: 100.0,
width: 100.0,
fit: BoxFit.cover,
imageErrorBuilder: (context, error, stackTrace) =>
erroWidget(100),
// errorWidget: (context, url, e) => placeHolder(50),
placeholder: placeHolder(100),
),
),
),
Container(
child: Text(
catList[index].name,
style: Theme.of(context).textTheme.caption.copyWith(
color: colors.fontColor,
fontWeight: FontWeight.w600,
fontSize: 15),
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
),
width: 100,
),
],
),
),
);
},
),
);
}
您可以使用网格视图来归档这个东西。这是配置的一个片段。
GridView.count(
shrinkWrap: true,
crossAxisCount: 2,
physics: const ClampingScrollPhysics(),
scrollDirection: Axis.horizontal,
crossAxisSpacing: 10,
mainAxisSpacing: 20,
children: ...)
这里 crossAxisCount: 2,scrollDirection: Axis.horizontal
就是你需要的。
您可以将 ListView.builder
与 itemCount: catList.length/2
和 return 一起使用 Column
与两个项目(索引和索引+1)
或使用GridView.count
:
Container(
height: 150,
child: GridView.count(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
crossAxisCount: 2,
children: catList.isEmpty ? [Container()] : catList.map((cat) {
return Padding(
padding: const EdgeInsetsDirectional.only(end: 10),
child: GestureDetector(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: const EdgeInsetsDirectional.only(bottom: 5.0),
child: new ClipRRect(
borderRadius: BorderRadius.circular(25.0),
child: new FadeInImage(
fadeInDuration: Duration(milliseconds: 50),
image: NetworkImage(
cat.image,
),
height: 100.0,
width: 100.0,
fit: BoxFit.cover,
imageErrorBuilder: (context, error, stackTrace) =>
erroWidget(100),
placeholder: placeHolder(100),
),
),
),
Container(
child: Text(
cat.name,
style: Theme.of(context).textTheme.caption.copyWith(
color: colors.fontColor,
fontWeight: FontWeight.w600,
fontSize: 15),
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
),
width: 100,
),
],
),
),
);
}).toList(),
),
);