Flutter ListView实现
请帮助我或给我一个如何实现上述图像的想法。我计划使用ListView。下面是我的示例代码,但这是在水平滚动Flutter ListView实现,flutter,Flutter,请帮助我或给我一个如何实现上述图像的想法。我计划使用ListView。下面是我的示例代码,但这是在水平滚动 Widget build(BuildContext context) { return Container( height: 210, color: Theme.of(context).primaryColor, padding: EdgeInsets.symmetric(vertical: 10), child: ListView.builder(
Widget build(BuildContext context) {
return Container(
height: 210,
color: Theme.of(context).primaryColor,
padding: EdgeInsets.symmetric(vertical: 10),
child: ListView.builder(
itemCount: _foodsList.featuredList.length,
itemBuilder: (context, index) {
double _marginLeft = 0;
(index == 0) ? _marginLeft = 20 : _marginLeft = 0;
return FoodsCarouselItemWidget(
heroTag: 'home_food_carousel',
marginLeft: _marginLeft,
food: _foodsList.featuredList.elementAt(index),
);
},
scrollDirection: Axis.horizontal,
));
}
}您需要在ListView的itemBuilder属性中构建布局。如果您想将文本放置在图像上,最好的布局小部件是Stack 为了获得颤振布局系统,请参见以下内容: 有关所有可用的布局小部件,请参见: 和堆栈: 类似这样的内容:
newstack(
儿童:[
新定位填充(
孩子:新法代尼玛(
占位符:新AssetImage('placeholder.png'),
图像:新的CachedNetworkImageProvider(照片[int].url),
适合:BoxFit.contain,
对齐:对齐.center,
fadeInDuration:新持续时间(毫秒:200),
fadeInCurve:曲线。线性,
),
),
新定位(
排名:10.0,
左:10.0,
子容器:新容器(
子项:新文本(照片[int]。标题)
),
),
],
)
我已经尽了最大努力实现了同样的目标,但由于时间问题,您可能会发现有些不同
使用的软件包:https://pub.dev/packages/cached_network_image#-安装选项卡-
这是完整的代码
import'package:cached_network_image/cached_network_image.dart';
进口“包装:颤振/材料.省道”;
类Demo扩展StatefulWidget{
@凌驾
_演示createState()=>_Demo();
}
类_Demo扩展了状态{
小部件foodsCarouselItemWidget(){
返回列(子项:[
尺寸箱(高度:10),
容器(
填充:边缘设置。全部(12),
装饰:盒子装饰(
boxShadow:[
箱形阴影(
颜色:颜色。黑色,
半径:15.0,
)
],
颜色:颜色,白色,
borderRadius:borderRadius.all(半径.圆形(5.0)),
),
子级:行(crossAxisAlignment:crossAxisAlignment.start,子级:<
小部件>[
容器(
身高:130,
宽度:130,
子:堆栈(
儿童:[
CachedNetworkImage(
宽度:150,
身高:130,
图像URL:
"https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcQt46Q_GYs7kSq21kdBlNcD9pZzHVtl8nwNkY5f9GaR3rTbPOMf",
imageBuilder:(上下文,imageProvider)=>容器(
装饰:盒子装饰(
图像:装饰图像(
图像:imageProvider,尺寸:BoxFit.cover),
borderRadius:borderRadius.all(半径圆形(10.0)),
),
),
),
定位(
右:10,,
底部:5,
子对象:行(子对象:[
图标(Icons.playlist\u add\u check,
颜色:彩色。白色,尺码:18),
尺寸箱(宽度:3),
文本(“190”,
样式:TextStyle(颜色:Colors.white,字体大小:12))
])),
],
),
),
尺寸箱(宽度:15),
扩大(
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
文本(“此处食物名称”,
样式:TextStyle(
颜色:颜色(0xFF4545),
尺码:18,
fontWeight:fontWeight.bold),
尺寸箱(高度:10),
世界其他地区(儿童:[
图标(Icons.location_on,颜色:color(0xff777777),大小:18),
尺寸箱(宽度:5),
扩大(
子项:文本(“在此处添加您的位置”,
样式:TextStyle(
字体大小:13,颜色:颜色(0xff777777)))
]),
尺寸箱(高度:5),
世界其他地区(儿童:[
图标(Icons.local_提供,颜色:颜色(0xFF7777),尺寸:18),
尺寸箱(宽度:5),
扩大(
孩子:文本(“辛辣,美味”,
样式:TextStyle(
字体大小:13,颜色:颜色(0xff777777)))
]),
尺寸箱(高度:15),
世界其他地区(儿童:[
扩大(
弹性:1,
子:容器(
装饰:盒子装饰(
颜色:颜色。红色[900],
边界半径:
边界半径所有(半径圆形(5.0)),
填充:边缘设置。全部(10),
子:文本(
“按钮文本”,
样式:TextStyle(
颜色:颜色,白色,
fontWeight:fontWeight.bold),
textAlign:textAlign.center,
),
)),
尺寸箱(宽度:7),
容器(
装饰:盒子装饰(
边框:border.all(颜色:Colors.red[900]),
borderRadius:borderRadius.all(半径.圆形(5.0)),
填充:边缘设置。全部(5),
儿童:
图标(Icons.bookmark_边框,颜色:Colors.red[900]),
)
])
]))
])),
尺寸箱(高度:10)
]);
}
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
class Demo extends StatefulWidget {
@override
_Demo createState() => _Demo();
}
class _Demo extends State<Demo> {
Widget foodsCarouselItemWidget() {
return Column(children: <Widget>[
SizedBox(height: 10),
Container(
padding: EdgeInsets.all(12),
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
color: Colors.black12,
blurRadius: 15.0,
)
],
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(5.0)),
),
child: Row(crossAxisAlignment: CrossAxisAlignment.start, children: <
Widget>[
Container(
height: 130,
width: 130,
child: Stack(
children: <Widget>[
CachedNetworkImage(
width: 150,
height: 130,
imageUrl:
"https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcQt46Q_GYs7kSq21kdBlNcD9pZzHVtl8nwNkY5f9GaR3rTbPOMf",
imageBuilder: (context, imageProvider) => Container(
decoration: BoxDecoration(
image: DecorationImage(
image: imageProvider, fit: BoxFit.cover),
borderRadius: BorderRadius.all(Radius.circular(10.0)),
),
),
),
Positioned(
right: 10,
bottom: 5,
child: Row(children: <Widget>[
Icon(Icons.playlist_add_check,
color: Colors.white, size: 18),
SizedBox(width: 3),
Text("190",
style: TextStyle(color: Colors.white, fontSize: 12))
])),
],
),
),
SizedBox(width: 15),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("Food title here",
style: TextStyle(
color: Color(0xff454545),
fontSize: 18,
fontWeight: FontWeight.bold)),
SizedBox(height: 10),
Row(children: <Widget>[
Icon(Icons.location_on, color: Color(0xff777777), size: 18),
SizedBox(width: 5),
Expanded(
child: Text("Add your location here",
style: TextStyle(
fontSize: 13, color: Color(0xff777777))))
]),
SizedBox(height: 5),
Row(children: <Widget>[
Icon(Icons.local_offer, color: Color(0xff777777), size: 18),
SizedBox(width: 5),
Expanded(
child: Text("Spicy, Delicious",
style: TextStyle(
fontSize: 13, color: Color(0xff777777))))
]),
SizedBox(height: 15),
Row(children: <Widget>[
Expanded(
flex: 1,
child: Container(
decoration: BoxDecoration(
color: Colors.red[900],
borderRadius:
BorderRadius.all(Radius.circular(5.0))),
padding: EdgeInsets.all(10),
child: Text(
"Button Text",
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold),
textAlign: TextAlign.center,
),
)),
SizedBox(width: 7),
Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.red[900]),
borderRadius: BorderRadius.all(Radius.circular(5.0))),
padding: EdgeInsets.all(5),
child:
Icon(Icons.bookmark_border, color: Colors.red[900]),
)
])
]))
])),
SizedBox(height: 10)
]);
}
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color(0xfff3f3f3),
appBar: AppBar(backgroundColor: Colors.red[900], title: Text("DEMO")),
body: ListView.builder(
padding: EdgeInsets.symmetric(vertical: 20, horizontal: 20),
itemCount: 4,
itemBuilder: (context, index) {
return foodsCarouselItemWidget();
},
));
}
}