Competition.dart 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. import 'package:intl/intl.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/cupertino.dart';
  4. import 'package:cached_network_image/cached_network_image.dart';
  5. import 'package:gradient_text/gradient_text.dart';
  6. import 'package:wanna_battle/styles/colors.dart';
  7. import '../pages/CompetitionRank.dart';
  8. import '../model/CompetitionInfo.dart';
  9. import '../pages/CompetitionRooms.dart';
  10. class Competition extends StatelessWidget {
  11. final CompetitionInfo competitionInfo;
  12. const Competition(this.competitionInfo, {Key key}) : super(key: key);
  13. @override
  14. Widget build(BuildContext context) {
  15. return GestureDetector(
  16. child: Container(
  17. margin: EdgeInsets.fromLTRB(15, 7, 15, 7),
  18. child: Column(
  19. crossAxisAlignment: CrossAxisAlignment.stretch,
  20. children: <Widget>[
  21. Stack(
  22. overflow: Overflow.visible,
  23. children: <Widget>[
  24. AspectRatio(
  25. aspectRatio: 345 / 150,
  26. child: CachedNetworkImage(
  27. imageUrl: competitionInfo.pic,
  28. fit: BoxFit.cover,
  29. ),
  30. ),
  31. Align(
  32. alignment: Alignment.topLeft,
  33. child: Image.asset('images/home_icon_vip.png'),
  34. ),
  35. Positioned(
  36. right: 10,
  37. top: -2,
  38. width: 52,
  39. height: 35,
  40. child: GestureDetector(
  41. child: Container(
  42. transform: Matrix4.translationValues(0.0, -2.0, 0.0),
  43. child: Builder(
  44. builder: (context) {
  45. var src = 'images/icon_paimingno.png';
  46. if (competitionInfo.participatingInfo != null && competitionInfo.participatingInfo.rank > 0) {
  47. if (competitionInfo.participatingInfo.rank == 1) {
  48. src = 'images/icon_paiming01.png';
  49. } else if (competitionInfo.participatingInfo.rank == 2) {
  50. src = 'images/icon_paiming02.png';
  51. } else if (competitionInfo.participatingInfo.rank == 3) {
  52. src = 'images/icon_paiming03.png';
  53. } else {
  54. return Stack(
  55. children: <Widget>[
  56. Image.asset('images/icon_paiming0000.png'),
  57. Align(
  58. alignment: Alignment.topCenter,
  59. child: Container(
  60. margin: EdgeInsets.only(top: 10),
  61. child: Text(
  62. competitionInfo.participatingInfo.rank.toString(),
  63. style: TextStyle(
  64. fontSize: 16,
  65. fontWeight: FontWeight.bold,
  66. color: Colors.white,
  67. ),
  68. ),
  69. ),
  70. ),
  71. ],
  72. );
  73. }
  74. }
  75. return Image.asset(src);
  76. },
  77. ),
  78. ),
  79. onTap: () {
  80. Navigator.push(context, CupertinoPageRoute(builder: (context) => CompetitionRank(competitionId: competitionInfo.id)));
  81. },
  82. ),
  83. ),
  84. ],
  85. ),
  86. Container(
  87. height: 36,
  88. color: PRIMARY_COLOR,
  89. child: Center(
  90. child: Text(
  91. '进入',
  92. style: TextStyle(color: Colors.white, fontSize: 14),
  93. ),
  94. ),
  95. )
  96. ],
  97. ),
  98. ),
  99. onTap: () {
  100. Navigator.push(context, CupertinoPageRoute(builder: (context) => CompetitionRooms(competitionInfo)));
  101. },
  102. );
  103. }
  104. }
  105. class CompetitionOld extends StatelessWidget {
  106. final CompetitionInfo competitionInfo;
  107. CompetitionOld(this.competitionInfo);
  108. @override
  109. Widget build(BuildContext context) {
  110. return GestureDetector(
  111. child: Container(
  112. color: Color(0xFF293354),
  113. height: 80,
  114. margin: EdgeInsets.fromLTRB(15, 7, 15, 7),
  115. child: Stack(
  116. overflow: Overflow.visible,
  117. children: <Widget>[
  118. Center(
  119. child: Row(
  120. children: <Widget>[
  121. Container(
  122. margin: EdgeInsets.only(left: 8),
  123. child: Image.asset(
  124. 'images/game.png',
  125. width: 64,
  126. height: 64,
  127. ),
  128. ),
  129. Expanded(
  130. child: Container(
  131. margin: EdgeInsets.only(left: 10),
  132. height: 64,
  133. child: Column(
  134. crossAxisAlignment: CrossAxisAlignment.start,
  135. children: <Widget>[
  136. Text(
  137. competitionInfo.competitionName,
  138. style: TextStyle(fontSize: 14, color: Colors.white),
  139. ),
  140. Expanded(
  141. child: GradientText(
  142. '¥' + competitionInfo.bonus.toString().replaceAllMapped(RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (Match m) => '${m[1]},'),
  143. gradient: LinearGradient(
  144. colors: [Color(0xFFFFC84B), Color(0xFFA26A23)],
  145. begin: Alignment.topCenter,
  146. end: Alignment.bottomCenter,
  147. ),
  148. style: TextStyle(fontSize: 20),
  149. textAlign: TextAlign.center),
  150. ),
  151. Text(
  152. '比赛时间' +
  153. DateFormat('yyyy.MM.dd').format(DateTime.fromMicrosecondsSinceEpoch(competitionInfo.startTime * 1000)) +
  154. '-' +
  155. DateFormat('yyyy.MM.dd').format(DateTime.fromMicrosecondsSinceEpoch(competitionInfo.endTime * 1000)),
  156. style: TextStyle(
  157. color: Color(0xFF9A9CA2),
  158. fontSize: 11,
  159. ),
  160. )
  161. ],
  162. ),
  163. ),
  164. )
  165. ],
  166. ),
  167. ),
  168. Positioned(
  169. right: 0,
  170. top: 0,
  171. bottom: 0,
  172. child: Image.asset('images/icon_jinru.png'),
  173. ),
  174. Positioned(
  175. right: 0,
  176. top: 0,
  177. bottom: 0,
  178. child: Container(
  179. width: 50,
  180. height: 80,
  181. child: Center(
  182. child: Text(
  183. '进入',
  184. style: TextStyle(fontSize: 15, color: Colors.white),
  185. ),
  186. ),
  187. ),
  188. ),
  189. Positioned(
  190. right: 60,
  191. top: -2,
  192. width: 52,
  193. height: 35,
  194. child: Container(
  195. transform: Matrix4.translationValues(0.0, -2.0, 0.0),
  196. child: Builder(
  197. builder: (context) {
  198. var src = 'images/icon_paimingno.png';
  199. if (competitionInfo.participatingInfo != null && competitionInfo.participatingInfo.rank > 0) {
  200. if (competitionInfo.participatingInfo.rank == 1) {
  201. src = 'images/icon_paiming01.png';
  202. } else if (competitionInfo.participatingInfo.rank == 2) {
  203. src = 'images/icon_paiming02.png';
  204. } else if (competitionInfo.participatingInfo.rank == 3) {
  205. src = 'images/icon_paiming03.png';
  206. } else {
  207. return Stack(
  208. children: <Widget>[
  209. Image.asset('images/icon_paiming0000.png'),
  210. Align(
  211. alignment: Alignment.topCenter,
  212. child: Container(
  213. margin: EdgeInsets.only(top: 10),
  214. child: Text(
  215. competitionInfo.participatingInfo.rank.toString(),
  216. style: TextStyle(
  217. fontSize: 16,
  218. fontWeight: FontWeight.bold,
  219. color: Colors.white,
  220. ),
  221. ),
  222. ),
  223. ),
  224. ],
  225. );
  226. }
  227. }
  228. return Image.asset(src);
  229. },
  230. ),
  231. ),
  232. ),
  233. Align(
  234. alignment: Alignment.topLeft,
  235. child: Opacity(
  236. opacity: competitionInfo.type == 2 ? 1.0 : 0,
  237. child: Image.asset(
  238. 'images/home_icon_vip.png',
  239. width: 28,
  240. height: 24,
  241. ),
  242. ),
  243. )
  244. ],
  245. ),
  246. ),
  247. onTap: () {
  248. Navigator.push(context, CupertinoPageRoute(builder: (context) => CompetitionRooms(competitionInfo)));
  249. },
  250. );
  251. }
  252. }