table.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import 'package:flutter/material.dart';
  2. import 'package:fooddeliveryapp/order/order.dart';
  3. import 'package:provider/provider.dart';
  4. import 'models/table.dart';
  5. class TablePage extends StatefulWidget {
  6. static const String routeName = '/table';
  7. @override
  8. State<StatefulWidget> createState() {
  9. return _TableState();
  10. }
  11. }
  12. class _TableState extends State<TablePage> {
  13. @override
  14. Widget build(BuildContext context) {
  15. return Consumer<TableStatusList>(
  16. builder: (context, tableStatusList, child) {
  17. return Scaffold(
  18. body: NestedScrollView(
  19. headerSliverBuilder: (context, bool innerBoxIsScrolled) {
  20. return <Widget>[
  21. SliverAppBar(
  22. primary: true,
  23. expandedHeight: 200,
  24. pinned: true,
  25. floating: true,
  26. snap: false,
  27. flexibleSpace: _getFlexBar(tableStatusList),
  28. )
  29. ];
  30. },
  31. body: _getTableItems(tableStatusList, context),
  32. ));
  33. });
  34. }
  35. _getFlexBar(TableStatusList tableStatusList) {
  36. return FlexibleSpaceBar(
  37. title: Column(
  38. mainAxisSize: MainAxisSize.min,
  39. children: <Widget>[
  40. Text('目前开台数:' + tableStatusList.size().toString(),
  41. style: TextStyle(fontSize: 12)),
  42. Text(
  43. '剩余空位:' + (30 - tableStatusList.size()).toString(),
  44. style: TextStyle(fontSize: 10),
  45. ),
  46. ],
  47. ),
  48. background: Image.network(
  49. 'https://picsum.photos/200/300/?blur',
  50. fit: BoxFit.fill,
  51. ),
  52. );
  53. }
  54. _getTableItems(TableStatusList tableStatusList, BuildContext context) {
  55. return GridView.extent(
  56. maxCrossAxisExtent: 150,
  57. padding: EdgeInsets.all(4),
  58. mainAxisSpacing: 4,
  59. crossAxisSpacing: 4,
  60. children: _buildGridTileList(30, tableStatusList, context));
  61. }
  62. /*
  63. * 单写了一个私有方法,创建指定数量的组件
  64. * */
  65. List<Widget> _buildGridTileList(
  66. int count, TableStatusList tableStatusList, BuildContext context) {
  67. List<Widget> containers = [];
  68. final statusList = Provider.of<TableStatusList>(context);
  69. for (var i = 0; i < count; i++) {
  70. // var image = Image.network('https://picsum.photos/id/$i/150');
  71. // containers.add(image);
  72. containers.add(GestureDetector(
  73. child: _tableCell(tableStatusList, i),
  74. onTap: () {
  75. if (tableStatusList.isopen(i)) {
  76. print("点击该台已开台,台号为=> " + "$i");
  77. Navigator.push(
  78. context, MaterialPageRoute(builder: (context) => OrderPage(index: i)));
  79. } else {
  80. print("点击该台号为=> " + "$i");
  81. statusList.addtable(TableStatus(i));
  82. Navigator.push(
  83. context, MaterialPageRoute(builder: (context) => OrderPage(index: i)));
  84. }
  85. },
  86. ));
  87. }
  88. return containers;
  89. }
  90. _tableCell(TableStatusList tableStatusList, int index) {
  91. if (tableStatusList.isopen(index)) {
  92. return Container(
  93. padding: EdgeInsets.all(2),
  94. decoration: BoxDecoration(
  95. borderRadius: BorderRadius.all(Radius.circular(10)),
  96. color: Colors.green,
  97. ),
  98. child: Column(
  99. children: <Widget>[
  100. Row(
  101. children: <Widget>[
  102. Icon(
  103. Icons.warning,
  104. color: Colors.white,
  105. size: 30.0,
  106. ),
  107. Text(
  108. index.toString(),
  109. style: TextStyle(fontSize: 15),
  110. )
  111. ],
  112. ),
  113. Icon(Icons.table_chart),
  114. Text("已开台"),
  115. ],
  116. ));
  117. } else {
  118. return Container(
  119. padding: EdgeInsets.all(2),
  120. decoration: BoxDecoration(
  121. borderRadius: BorderRadius.all(Radius.circular(10)),
  122. color: Colors.blue,
  123. ),
  124. child: Column(
  125. children: <Widget>[
  126. Row(
  127. children: <Widget>[
  128. Icon(
  129. Icons.audiotrack,
  130. color: Colors.white,
  131. size: 30.0,
  132. ),
  133. Text(
  134. index.toString(),
  135. style: TextStyle(fontSize: 15),
  136. )
  137. ],
  138. ),
  139. Icon(
  140. Icons.table_chart,
  141. color: Colors.white,
  142. ),
  143. Text("空桌"),
  144. ],
  145. ));
  146. }
  147. }
  148. }