Flutter 卡片内容不显示
Flutter Card Contents Not Displaying
美好的一天!
所以我对 flutter 还很陌生,所以我几乎不知道如何布局多个小部件,更不用说卡片中的多个小部件了。
所以我想想出这种输出[1]:https://i.stack.imgur.com/EpquW.png
但是当我尝试 运行 我的代码时,它 returns 为空白(参考图片)
[2]: https://i.stack.imgur.com/GFtgY.png
这是我的代码:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import 'package:flutter/cupertino.dart';
class SetAppointmentPage extends StatefulWidget {
static const String routeName = '/setappointment';
@override
_SetAppointmentPageState createState() => new _SetAppointmentPageState();
}
class _SetAppointmentPageState extends State<SetAppointmentPage> {
bool isSelected = false;
double height = Get.height;
double width = Get.width;
final itemPositionsListener = ItemPositionsListener.create();
int topItem = 0;
@override
void initState() {
super.initState();
itemPositionsListener.itemPositions.addListener(() {
final positions = itemPositionsListener.itemPositions.value;
setState(() {
topItem = positions.isNotEmpty ? positions.first.index : null;
});
});
}
Widget buildhomePageAppBar() {
double profileDimension = 35;
return AppBar(
backgroundColor: Colors.white,
titleSpacing: 0,
title: Padding(
padding: EdgeInsets.only(
left: 20,
),
child: Row(
children: [
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Image(
image: AssetImage('assets/images/plain_logo.png'),
height: 30,
),
),
SizedBox(width: 5),
Text(
'Virtex',
style: TextStyle(
color: Colors.black87,
fontFamily: 'Poppins',
fontSize: 16,
fontWeight: FontWeight.bold,
),
)
],
),
),
actions: [
Padding(
padding: EdgeInsets.only(
top: 10,
bottom: 10,
),
child: Container(
height: profileDimension,
width: profileDimension,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: Colors.black54,
width: 2,
),
borderRadius: BorderRadius.circular(50),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(50),
child: Image(
width: profileDimension,
height: profileDimension,
image: AssetImage(
'assets/images/profile-image.jpeg',
),
fit: BoxFit.cover,
),
),
),
),
SizedBox(width: 20),
],
);
}
Widget buildAppointmentText =
Row(mainAxisAlignment: MainAxisAlignment.start, children: [
Container(
padding: EdgeInsets.all(10.0),
child: Text(
"AVAILABLE APPOINTMENT SLOTS",
style: TextStyle(
fontSize: 15.0,
color: Colors.white,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
),
]);
Widget buildDateText = Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'May 18, 2021',
style: TextStyle(
color: Colors.grey,
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
);
Widget buildShowCalendar = Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'Show Calendar',
style: TextStyle(
color: Colors.blue,
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
);
Widget buildTimeButton = Padding(
padding: EdgeInsets.only(left: 20, top: 90, right: 40),
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("11 AM"),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.black, width: 1)),
color: Colors.white,
textColor: Colors.blue,
),
),
),
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("2 PM"),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.black, width: 1)),
color: Colors.white,
textColor: Colors.blue,
),
),
),
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("3 PM"),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.black, width: 1)),
color: Colors.white,
textColor: Colors.black,
),
),
),
],
),
);
Widget buildAppointmentEndText = Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'*Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum' +
'Dolor Lorem Ipsum Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum Dolor'));
Widget buildGoButton = Padding(
padding: EdgeInsets.only(left: 20, top: 90, right: 40),
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("Cancel"),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.blue, width: 1)),
color: Colors.white,
textColor: Colors.blue,
),
),
),
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("Next"),
color: Colors.blue,
textColor: Colors.white,
),
),
),
],
),
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: buildhomePageAppBar(),
body: Container(
margin: EdgeInsets.only(top: 0),
width: MediaQuery.of(context).size.width,
child: Column(
children: [
Card(
elevation: 1.0,
color: Colors.white,
child: Padding(
padding: EdgeInsets.all(5.0),
child: Column(
children: <Widget>[
buildAppointmentText,
Expanded(
child: Column(
children: <Widget>[
buildDateText,
buildTimeButton,
buildShowCalendar,
],
))
],
),
),
),
Column(
children: [
buildGoButton,
],
)
],
),
),
);
}
}
此外,是否有更有效的方法或其他方法可以让我及时创建这些按钮?
如果有任何帮助或建议,我将不胜感激。
好吧,对于你的第一个问题,它显示了一个空白页面,因为你需要为卡片中的列设置大小,如下所示:
Card(
elevation: 1.0,
color: Colors.white,
child: Padding(
padding: EdgeInsets.all(5.0),
child: Container(
width: Get.width,
height: 500,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
buildAppointmentText,
Expanded(
child: Column(
children: <Widget>[
buildDateText,
buildTimeButton,
buildShowCalendar,
],
))
],
),
),
),
)
关于你的第二个问题,如果你将从 API 获得可用的约会,你可以这样做:
class SetAppointmentPage extends StatefulWidget {
static const String routeName = '/setappointment';
@override
_SetAppointmentPageState createState() => new _SetAppointmentPageState();
}
class _SetAppointmentPageState extends State<SetAppointmentPage> {
List time = [
{
"Day": "May 18, 2021",
"times": ["11 AM", "1 PM", "3 PM", "4 PM", "11 PM"]
},
{
"Day": "May 19, 2021",
"times": ["10 AM", "11 AM"]
},
{
"Day": "May 20, 2021",
"times": ["9 AM", "11 PM", "1 PM"]
}
];
bool isSelected = false;
double height = Get.height;
double width = Get.width;
int topItem = 0;
@override
void initState() {
super.initState();
}
Widget buildhomePageAppBar() {
double profileDimension = 35;
return AppBar(
backgroundColor: Colors.white,
titleSpacing: 0,
title: Padding(
padding: EdgeInsets.only(
left: 20,
),
child: Row(
children: [
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Image(
image: AssetImage('assets/images/plain_logo.png'),
height: 30,
),
),
SizedBox(width: 5),
Text(
'Virtex',
style: TextStyle(
color: Colors.black87,
fontFamily: 'Poppins',
fontSize: 16,
fontWeight: FontWeight.bold,
),
)
],
),
),
actions: [
Padding(
padding: EdgeInsets.only(
top: 10,
bottom: 10,
),
child: Container(
height: profileDimension,
width: profileDimension,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: Colors.black54,
width: 2,
),
borderRadius: BorderRadius.circular(50),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(50),
child: Image(
width: profileDimension,
height: profileDimension,
image: AssetImage(
'assets/images/profile-image.jpeg',
),
fit: BoxFit.cover,
),
),
),
),
SizedBox(width: 20),
],
);
}
Widget buildAppointmentText =
Row(mainAxisAlignment: MainAxisAlignment.start, children: [
Container(
padding: EdgeInsets.all(10.0),
child: Text(
"AVAILABLE APPOINTMENT SLOTS",
style: TextStyle(
fontSize: 15.0,
color: Colors.white,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
),
]);
Widget buildShowCalendar = Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'Show Calendar',
style: TextStyle(
color: Colors.blue,
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
);
Widget buildAppointmentEndText = Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'*Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum' +
'Dolor Lorem Ipsum Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum Dolor'));
Widget buildGoButton = Padding(
padding: EdgeInsets.only(left: 20, top: 90, right: 40),
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("Cancel"),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.blue, width: 1)),
color: Colors.white,
textColor: Colors.blue,
),
),
),
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("Next"),
color: Colors.blue,
textColor: Colors.white,
),
),
),
],
),
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: buildhomePageAppBar(),
body: Container(
margin: EdgeInsets.only(top: 0),
width: MediaQuery.of(context).size.width,
child: Column(
children: [
Card(
elevation: 1.0,
color: Colors.white,
child: Padding(
padding: EdgeInsets.all(5.0),
child: Column(
children: [
Text(
"AVAILABLE APPOINTMENT SLOTS",
style: TextStyle(
fontSize: 15.0,
color: Colors.black26,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
Container(
width: width / 1.2,
height: height / 1.8,
child: ListView.builder(
itemCount: time.length,
itemBuilder: (context, slots){
return Column(
children: [
buildAppointmentText,
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'${time[slots]['Day']}',
style: TextStyle(
color: Colors.grey,
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
Container(
width: width / 1.2,
height: time[slots]['times'].length > 3 ? 120: 60,
child: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3, childAspectRatio: 2.0),
itemCount: time[slots]['times'].length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: RaisedButton(
onPressed: () {},
child: Text(time[slots]['times'][index], textAlign: TextAlign.start,),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
side: BorderSide(
color: Colors.black26, width: 1)),
color: Colors.white,
textColor: Colors.blue,
),
);
}),
)
],
);
},
),
),
buildShowCalendar,
],
),
),
),
Column(
children: [
buildGoButton,
],
)
],
),
),
);
}
}
当然你可以进一步简化这个。
美好的一天! 所以我对 flutter 还很陌生,所以我几乎不知道如何布局多个小部件,更不用说卡片中的多个小部件了。
所以我想想出这种输出[1]:https://i.stack.imgur.com/EpquW.png
但是当我尝试 运行 我的代码时,它 returns 为空白(参考图片) [2]: https://i.stack.imgur.com/GFtgY.png
这是我的代码:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import 'package:flutter/cupertino.dart';
class SetAppointmentPage extends StatefulWidget {
static const String routeName = '/setappointment';
@override
_SetAppointmentPageState createState() => new _SetAppointmentPageState();
}
class _SetAppointmentPageState extends State<SetAppointmentPage> {
bool isSelected = false;
double height = Get.height;
double width = Get.width;
final itemPositionsListener = ItemPositionsListener.create();
int topItem = 0;
@override
void initState() {
super.initState();
itemPositionsListener.itemPositions.addListener(() {
final positions = itemPositionsListener.itemPositions.value;
setState(() {
topItem = positions.isNotEmpty ? positions.first.index : null;
});
});
}
Widget buildhomePageAppBar() {
double profileDimension = 35;
return AppBar(
backgroundColor: Colors.white,
titleSpacing: 0,
title: Padding(
padding: EdgeInsets.only(
left: 20,
),
child: Row(
children: [
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Image(
image: AssetImage('assets/images/plain_logo.png'),
height: 30,
),
),
SizedBox(width: 5),
Text(
'Virtex',
style: TextStyle(
color: Colors.black87,
fontFamily: 'Poppins',
fontSize: 16,
fontWeight: FontWeight.bold,
),
)
],
),
),
actions: [
Padding(
padding: EdgeInsets.only(
top: 10,
bottom: 10,
),
child: Container(
height: profileDimension,
width: profileDimension,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: Colors.black54,
width: 2,
),
borderRadius: BorderRadius.circular(50),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(50),
child: Image(
width: profileDimension,
height: profileDimension,
image: AssetImage(
'assets/images/profile-image.jpeg',
),
fit: BoxFit.cover,
),
),
),
),
SizedBox(width: 20),
],
);
}
Widget buildAppointmentText =
Row(mainAxisAlignment: MainAxisAlignment.start, children: [
Container(
padding: EdgeInsets.all(10.0),
child: Text(
"AVAILABLE APPOINTMENT SLOTS",
style: TextStyle(
fontSize: 15.0,
color: Colors.white,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
),
]);
Widget buildDateText = Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'May 18, 2021',
style: TextStyle(
color: Colors.grey,
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
);
Widget buildShowCalendar = Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'Show Calendar',
style: TextStyle(
color: Colors.blue,
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
);
Widget buildTimeButton = Padding(
padding: EdgeInsets.only(left: 20, top: 90, right: 40),
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("11 AM"),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.black, width: 1)),
color: Colors.white,
textColor: Colors.blue,
),
),
),
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("2 PM"),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.black, width: 1)),
color: Colors.white,
textColor: Colors.blue,
),
),
),
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("3 PM"),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.black, width: 1)),
color: Colors.white,
textColor: Colors.black,
),
),
),
],
),
);
Widget buildAppointmentEndText = Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'*Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum' +
'Dolor Lorem Ipsum Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum Dolor'));
Widget buildGoButton = Padding(
padding: EdgeInsets.only(left: 20, top: 90, right: 40),
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("Cancel"),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.blue, width: 1)),
color: Colors.white,
textColor: Colors.blue,
),
),
),
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("Next"),
color: Colors.blue,
textColor: Colors.white,
),
),
),
],
),
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: buildhomePageAppBar(),
body: Container(
margin: EdgeInsets.only(top: 0),
width: MediaQuery.of(context).size.width,
child: Column(
children: [
Card(
elevation: 1.0,
color: Colors.white,
child: Padding(
padding: EdgeInsets.all(5.0),
child: Column(
children: <Widget>[
buildAppointmentText,
Expanded(
child: Column(
children: <Widget>[
buildDateText,
buildTimeButton,
buildShowCalendar,
],
))
],
),
),
),
Column(
children: [
buildGoButton,
],
)
],
),
),
);
} }
此外,是否有更有效的方法或其他方法可以让我及时创建这些按钮? 如果有任何帮助或建议,我将不胜感激。
好吧,对于你的第一个问题,它显示了一个空白页面,因为你需要为卡片中的列设置大小,如下所示:
Card(
elevation: 1.0,
color: Colors.white,
child: Padding(
padding: EdgeInsets.all(5.0),
child: Container(
width: Get.width,
height: 500,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
buildAppointmentText,
Expanded(
child: Column(
children: <Widget>[
buildDateText,
buildTimeButton,
buildShowCalendar,
],
))
],
),
),
),
)
关于你的第二个问题,如果你将从 API 获得可用的约会,你可以这样做:
class SetAppointmentPage extends StatefulWidget {
static const String routeName = '/setappointment';
@override
_SetAppointmentPageState createState() => new _SetAppointmentPageState();
}
class _SetAppointmentPageState extends State<SetAppointmentPage> {
List time = [
{
"Day": "May 18, 2021",
"times": ["11 AM", "1 PM", "3 PM", "4 PM", "11 PM"]
},
{
"Day": "May 19, 2021",
"times": ["10 AM", "11 AM"]
},
{
"Day": "May 20, 2021",
"times": ["9 AM", "11 PM", "1 PM"]
}
];
bool isSelected = false;
double height = Get.height;
double width = Get.width;
int topItem = 0;
@override
void initState() {
super.initState();
}
Widget buildhomePageAppBar() {
double profileDimension = 35;
return AppBar(
backgroundColor: Colors.white,
titleSpacing: 0,
title: Padding(
padding: EdgeInsets.only(
left: 20,
),
child: Row(
children: [
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Image(
image: AssetImage('assets/images/plain_logo.png'),
height: 30,
),
),
SizedBox(width: 5),
Text(
'Virtex',
style: TextStyle(
color: Colors.black87,
fontFamily: 'Poppins',
fontSize: 16,
fontWeight: FontWeight.bold,
),
)
],
),
),
actions: [
Padding(
padding: EdgeInsets.only(
top: 10,
bottom: 10,
),
child: Container(
height: profileDimension,
width: profileDimension,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: Colors.black54,
width: 2,
),
borderRadius: BorderRadius.circular(50),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(50),
child: Image(
width: profileDimension,
height: profileDimension,
image: AssetImage(
'assets/images/profile-image.jpeg',
),
fit: BoxFit.cover,
),
),
),
),
SizedBox(width: 20),
],
);
}
Widget buildAppointmentText =
Row(mainAxisAlignment: MainAxisAlignment.start, children: [
Container(
padding: EdgeInsets.all(10.0),
child: Text(
"AVAILABLE APPOINTMENT SLOTS",
style: TextStyle(
fontSize: 15.0,
color: Colors.white,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
),
]);
Widget buildShowCalendar = Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'Show Calendar',
style: TextStyle(
color: Colors.blue,
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
);
Widget buildAppointmentEndText = Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'*Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum' +
'Dolor Lorem Ipsum Lorem Ipsum Dolor Lorem Ipsum Dolor Lorem Ipsum Dolor'));
Widget buildGoButton = Padding(
padding: EdgeInsets.only(left: 20, top: 90, right: 40),
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("Cancel"),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.blue, width: 1)),
color: Colors.white,
textColor: Colors.blue,
),
),
),
Container(
child: SizedBox(
height: 50.0,
width: 150.0,
child: RaisedButton(
onPressed: () {},
child: Text("Next"),
color: Colors.blue,
textColor: Colors.white,
),
),
),
],
),
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: buildhomePageAppBar(),
body: Container(
margin: EdgeInsets.only(top: 0),
width: MediaQuery.of(context).size.width,
child: Column(
children: [
Card(
elevation: 1.0,
color: Colors.white,
child: Padding(
padding: EdgeInsets.all(5.0),
child: Column(
children: [
Text(
"AVAILABLE APPOINTMENT SLOTS",
style: TextStyle(
fontSize: 15.0,
color: Colors.black26,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
Container(
width: width / 1.2,
height: height / 1.8,
child: ListView.builder(
itemCount: time.length,
itemBuilder: (context, slots){
return Column(
children: [
buildAppointmentText,
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
),
child: Text(
'${time[slots]['Day']}',
style: TextStyle(
color: Colors.grey,
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
Container(
width: width / 1.2,
height: time[slots]['times'].length > 3 ? 120: 60,
child: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3, childAspectRatio: 2.0),
itemCount: time[slots]['times'].length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: RaisedButton(
onPressed: () {},
child: Text(time[slots]['times'][index], textAlign: TextAlign.start,),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
side: BorderSide(
color: Colors.black26, width: 1)),
color: Colors.white,
textColor: Colors.blue,
),
);
}),
)
],
);
},
),
),
buildShowCalendar,
],
),
),
),
Column(
children: [
buildGoButton,
],
)
],
),
),
);
}
}
当然你可以进一步简化这个。