Flutter 填充柱中的垂直空间-颤振
我想把“价格”放在“商品名称”的正下方,“添加按钮”应该在图片的底部中间 我使用Stack小部件将“添加按钮”和图片放在彼此的顶部。有没有办法定位这个 我尝试使用mainAxisAlignment.start将“price”放在我列中的“item name”下面,但似乎不起作用Flutter 填充柱中的垂直空间-颤振,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我想把“价格”放在“商品名称”的正下方,“添加按钮”应该在图片的底部中间 我使用Stack小部件将“添加按钮”和图片放在彼此的顶部。有没有办法定位这个 我尝试使用mainAxisAlignment.start将“price”放在我列中的“item name”下面,但似乎不起作用 ListView.builder( scrollDirection: Axis.vertical, shrinkWrap: true,
ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemBuilder: (ctx, i) => restaurantItems[i].quantity <= 0
? Center()
: Padding(
padding: const EdgeInsets.only(left: 15, bottom: 8, top: 1),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.start,
children: [
// ITEM NAME
Padding(
padding: const EdgeInsets.only(left: 10, top: 10),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'${restaurantItems[i].name}',
style: TextStyle(
fontSize: 17,
color: kTextColor,
fontWeight: FontWeight.w700),
),
//Spacer(),
// 'ADD' BUTTON CONTAINER
Padding(
padding: const EdgeInsets.only(right: 20),
child: Stack(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.network(
restaurantItems[i].imageUrl,
height: size.width * 0.28,
width: size.width * 0.26,
fit: BoxFit.cover,
),
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Colors.black87,
),
child: Padding(
padding: const EdgeInsets.only(
left: 9,
top: 3,
right: 5,
bottom: 3),
child: InkWell(
splashColor: Colors.white,
onTap: () {
print(restaurantItems[i].name);
cart.addItem(
restaurantItems[i].id,
restaurantItems[i].name,
restaurantItems[i].price,
restaurant,
);
},
child: Row(
children: [
Text(
'ADD',
style: TextStyle(
color: Colors.white,
),
),
Icon(
Icons.add,
color: Colors.white,
size: 17,
),
],
),
),
),
),
],
),
),
],
),
),
Padding(
padding: const EdgeInsets.only(left: 10, bottom: 11),
child: Text(
'₹${restaurantItems[i].price}',
style: TextStyle(
fontSize: 15,
color: kTextColor,
fontWeight: FontWeight.w400),
),
),
],
),
),
itemCount: restaurantItems.length,
);
ListView.builder(
滚动方向:轴垂直,
收缩膜:对,
itemBuilder:(ctx,i)=>restaurantItems[i].quantity您可以使用以下内容:
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
children: [
Text('Title'),
Text('Price'),
],
),
Stack(
children: [
ImageWiget(
),
Positioned.fill(
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text('Add Button'),
],
))
],
)
],
),
您可以使用以下内容:
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
children: [
Text('Title'),
Text('Price'),
],
),
Stack(
children: [
ImageWiget(
),
Positioned.fill(
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text('Add Button'),
],
))
],
)
],
),
在列中打断行的第一部分
添加列属性,然后在第二列中将文本小部件放在中间。在列中断开第一行
添加列属性,然后在第二列中将文本小部件放在中间。我测试了以下代码,根据需要对其进行调整:
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// control the split ratio here
Expanded(
flex: 2,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'restaurant name',
style: TextStyle(
fontSize: 17,
color: Colors.black,
fontWeight: FontWeight.w700),
),
Padding(
padding: const EdgeInsets.only(left: 10, bottom: 11),
child: Text(
'₹ 5',
style: TextStyle(
fontSize: 15,
color: Colors.black,
fontWeight: FontWeight.w400),
),
),
],
),
),
SizedBox(width: 10.0),
Expanded(
// control the split ratio here
flex: 2,
child: Column(
children: [
// 'ADD' BUTTON CONTAINER
Padding(
padding: const EdgeInsets.only(right: 20),
child: Stack(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.network(
'https://picsum.photos/id/1/200/300',
height:
MediaQuery.of(context).size.width * 0.28,
width:
MediaQuery.of(context).size.height * 0.26,
fit: BoxFit.cover,
),
),
Positioned.fill(
bottom: 0.0,
child: Align(
alignment: Alignment.bottomCenter,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Colors.black87,
),
//try to use ElevatedButton.icon instead
child: Padding(
padding: const EdgeInsets.only(
left: 9, top: 3, right: 5, bottom: 3),
child: InkWell(
splashColor: Colors.white,
onTap: () {},
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Text(
'ADD',
style: TextStyle(
color: Colors.white,
),
),
Icon(
Icons.add,
color: Colors.white,
size: 17,
),
],
),
),
),
),
),
),
],
),
),
],
),
),
],
),
我测试了以下代码,根据需要对其进行调整:
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// control the split ratio here
Expanded(
flex: 2,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'restaurant name',
style: TextStyle(
fontSize: 17,
color: Colors.black,
fontWeight: FontWeight.w700),
),
Padding(
padding: const EdgeInsets.only(left: 10, bottom: 11),
child: Text(
'₹ 5',
style: TextStyle(
fontSize: 15,
color: Colors.black,
fontWeight: FontWeight.w400),
),
),
],
),
),
SizedBox(width: 10.0),
Expanded(
// control the split ratio here
flex: 2,
child: Column(
children: [
// 'ADD' BUTTON CONTAINER
Padding(
padding: const EdgeInsets.only(right: 20),
child: Stack(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.network(
'https://picsum.photos/id/1/200/300',
height:
MediaQuery.of(context).size.width * 0.28,
width:
MediaQuery.of(context).size.height * 0.26,
fit: BoxFit.cover,
),
),
Positioned.fill(
bottom: 0.0,
child: Align(
alignment: Alignment.bottomCenter,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Colors.black87,
),
//try to use ElevatedButton.icon instead
child: Padding(
padding: const EdgeInsets.only(
left: 9, top: 3, right: 5, bottom: 3),
child: InkWell(
splashColor: Colors.white,
onTap: () {},
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Text(
'ADD',
style: TextStyle(
color: Colors.white,
),
),
Icon(
Icons.add,
color: Colors.white,
size: 17,
),
],
),
),
),
),
),
),
],
),
),
],
),
),
],
),
您只需要在行内创建列小部件,并在该列内添加文本小部件和填充价格小部件
ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemBuilder: (ctx, i) => restaurantItems[i].quantity <= 0
? Center()
: Padding(
padding: const EdgeInsets.only(left: 15, bottom: 8, top: 1),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.start,
children: [
// ITEM NAME
Padding(
padding: const EdgeInsets.only(left: 10, top: 10),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
children:[
Text(
'${restaurantItems[i].name}',
style: TextStyle(
fontSize: 17,
color: kTextColor,
fontWeight: FontWeight.w700),
),
Padding(
padding: const EdgeInsets.only(left: 10, bottom: 11),
child: Text(
'₹${restaurantItems[i].price}',
style: TextStyle(
fontSize: 15,
color: kTextColor,
fontWeight: FontWeight.w400),
),
),
],
),
//Spacer(),
// 'ADD' BUTTON CONTAINER
Padding(
padding: const EdgeInsets.only(right: 20),
child: Stack(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.network(
restaurantItems[i].imageUrl,
height: size.width * 0.28,
width: size.width * 0.26,
fit: BoxFit.cover,
),
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Colors.black87,
),
child: Padding(
padding: const EdgeInsets.only(
left: 9,
top: 3,
right: 5,
bottom: 3),
child: InkWell(
splashColor: Colors.white,
onTap: () {
print(restaurantItems[i].name);
cart.addItem(
restaurantItems[i].id,
restaurantItems[i].name,
restaurantItems[i].price,
restaurant,
);
},
child: Row(
children: [
Text(
'ADD',
style: TextStyle(
color: Colors.white,
),
),
Icon(
Icons.add,
color: Colors.white,
size: 17,
),
],
),
),
),
),
],
),
),
],
),
),
],
),
),
itemCount: restaurantItems.length,
);
ListView.builder(
滚动方向:轴垂直,
收缩膜:对,
itemBuilder:(ctx,i)=>restaurantItems[i].quantity您所需要的只是在行中创建列小部件,并在该列中添加文本小部件和填充价格小部件。这是您修改的代码
ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemBuilder: (ctx, i) => restaurantItems[i].quantity <= 0
? Center()
: Padding(
padding: const EdgeInsets.only(left: 15, bottom: 8, top: 1),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.start,
children: [
// ITEM NAME
Padding(
padding: const EdgeInsets.only(left: 10, top: 10),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
children:[
Text(
'${restaurantItems[i].name}',
style: TextStyle(
fontSize: 17,
color: kTextColor,
fontWeight: FontWeight.w700),
),
Padding(
padding: const EdgeInsets.only(left: 10, bottom: 11),
child: Text(
'₹${restaurantItems[i].price}',
style: TextStyle(
fontSize: 15,
color: kTextColor,
fontWeight: FontWeight.w400),
),
),
],
),
//Spacer(),
// 'ADD' BUTTON CONTAINER
Padding(
padding: const EdgeInsets.only(right: 20),
child: Stack(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.network(
restaurantItems[i].imageUrl,
height: size.width * 0.28,
width: size.width * 0.26,
fit: BoxFit.cover,
),
),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Colors.black87,
),
child: Padding(
padding: const EdgeInsets.only(
left: 9,
top: 3,
right: 5,
bottom: 3),
child: InkWell(
splashColor: Colors.white,
onTap: () {
print(restaurantItems[i].name);
cart.addItem(
restaurantItems[i].id,
restaurantItems[i].name,
restaurantItems[i].price,
restaurant,
);
},
child: Row(
children: [
Text(
'ADD',
style: TextStyle(
color: Colors.white,
),
),
Icon(
Icons.add,
color: Colors.white,
size: 17,
),
],
),
),
),
),
],
),
),
],
),
),
],
),
),
itemCount: restaurantItems.length,
);
ListView.builder(
滚动方向:轴垂直,
收缩膜:对,
itemBuilder:(ctx,i)=>restaurantItems[i].quantity的效果非常好!谢谢我在屏幕右侧看到了很多空白。我如何才能将堆栈推到那里?我尝试将正确的填充减少到0,但它不起作用。即使在行中添加mainAxisAlignment.spaceBetween也无助于NVM。我在列小部件中添加了crossAxisAlignment.end,它现在的工作方式如下魅力!谢谢!我在屏幕右侧看到了很多空白。我如何才能将堆栈推到那里?我尝试将正确的填充减少到0,但它不起作用。即使在行中添加mainAxisAlignment.spaceBetween也无助于NVM。我在列小部件中添加了crossAxisAlignment.end,它现在起作用了