You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

308 lines
11 KiB

2 years ago
  1. import 'package:flutter/material.dart';
  2. class AnimatedGrid extends StatefulWidget {
  3. const AnimatedGrid({
  4. Key? key,
  5. required this.number,
  6. required this.offsetList,
  7. required this.onTap,
  8. required this.color,
  9. required this.puzzleSize,
  10. }) : super(key: key);
  11. final Function onTap;
  12. final List<int> number;
  13. final List<FractionalOffset> offsetList;
  14. final Color color;
  15. final int puzzleSize;
  16. @override
  17. State<AnimatedGrid> createState() => _AnimatedGridState();
  18. }
  19. class _AnimatedGridState extends State<AnimatedGrid> {
  20. late List<FractionalOffset> _offsetList;
  21. @override
  22. void initState() {
  23. _offsetList = widget.offsetList;
  24. super.initState();
  25. }
  26. @override
  27. Widget build(BuildContext context) {
  28. var screenSize = MediaQuery.of(context).size;
  29. var boardSize = screenSize.width * 0.4;
  30. var spacing = 4;
  31. var eachBoxSize =
  32. (boardSize / widget.puzzleSize) - (spacing * (widget.puzzleSize - 1));
  33. return SizedBox(
  34. height: boardSize,
  35. width: boardSize,
  36. child: Stack(
  37. children: [
  38. for (int i = 0; i < widget.offsetList.length; i++)
  39. widget.number[i] != 0
  40. ? AnimatedAlign(
  41. alignment: widget.offsetList[i],
  42. duration: const Duration(seconds: 1),
  43. curve: Curves.easeInOut,
  44. child: GestureDetector(
  45. onTap: () => widget.onTap(i),
  46. child: Card(
  47. elevation: 4,
  48. color: widget.color,
  49. shape: RoundedRectangleBorder(
  50. borderRadius: BorderRadius.circular(20),
  51. ),
  52. child: SizedBox(
  53. height: eachBoxSize,
  54. width: eachBoxSize,
  55. child: Center(
  56. child: Text(
  57. widget.number[i].toString(),
  58. style: const TextStyle(
  59. fontSize: 60,
  60. fontWeight: FontWeight.bold,
  61. color: Colors.white,
  62. ),
  63. ),
  64. ),
  65. ),
  66. ),
  67. ),
  68. )
  69. : const SizedBox(),
  70. ],
  71. ),
  72. );
  73. // -----------------------------
  74. // Working implementation:
  75. // -----------------------------
  76. // return SizedBox(
  77. // height: screenSize.height * 0.7,
  78. // width: screenSize.width * 0.4,
  79. // child: GridView.builder(
  80. // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
  81. // crossAxisCount: puzzleSize,
  82. // ),
  83. // itemCount: number.length,
  84. // itemBuilder: (context, index) {
  85. // return number[index] != 0
  86. // ? Padding(
  87. // padding: const EdgeInsets.all(2.0),
  88. // child: GestureDetector(
  89. // onTap: () => onTap(index),
  90. // child: AnimatedPositioned(
  91. // duration: Duration(milliseconds: 600),
  92. // child: Container(
  93. // height: 20,
  94. // width: 20,
  95. // color: Colors.orange,
  96. // ),
  97. // ),
  98. // ),
  99. // )
  100. // // ? MouseRegion(
  101. // // child: Padding(
  102. // // padding: const EdgeInsets.all(2.0),
  103. // // child: GestureDetector(
  104. // // onTap: () => onTap(index),
  105. // // child: Card(
  106. // // elevation: 4,
  107. // // color: color,
  108. // // // dark -> 0xFF14407a
  109. // // // light -> 0xFF43b9fd
  110. // // shape: RoundedRectangleBorder(
  111. // // borderRadius: BorderRadius.circular(20),
  112. // // ),
  113. // // child: SizedBox(
  114. // // height: 20,
  115. // // width: 20,
  116. // // child: Center(
  117. // // child: Text(
  118. // // number[index].toString(),
  119. // // style: const TextStyle(
  120. // // fontSize: 60,
  121. // // fontWeight: FontWeight.bold,
  122. // // color: Colors.white,
  123. // // ),
  124. // // ),
  125. // // ),
  126. // // ),
  127. // // ),
  128. // // ),
  129. // // ),
  130. // // )
  131. // : const SizedBox();
  132. // // },
  133. // // ),
  134. // // );
  135. // }
  136. }
  137. }
  138. // class AnimatedGrid extends StatefulWidget {
  139. // const AnimatedGrid({
  140. // Key? key,
  141. // required this.number,
  142. // required this.offsetList,
  143. // required this.onTap,
  144. // required this.color,
  145. // required this.puzzleSize,
  146. // }) : super(key: key);
  147. // final Function onTap;
  148. // final List<int> number;
  149. // final List<FractionalOffset> offsetList;
  150. // final Color color;
  151. // final int puzzleSize;
  152. // @override
  153. // State<AnimatedGrid> createState() => _AnimatedGridState();
  154. // }
  155. // class _AnimatedGridState extends State<AnimatedGrid> {
  156. // // FractionalOffset offset = FractionalOffset(0, 0);
  157. // late final List<int> _numberList;
  158. // // late final int _puzzleSize;
  159. // @override
  160. // void initState() {
  161. // _numberList = widget.number;
  162. // // _puzzleSize = widget.puzzleSize;
  163. // // print(_numberList);
  164. // // print(widget.offsetList);
  165. // super.initState();
  166. // }
  167. // // calculateOffset() {
  168. // // List<FractionalOffset> offsetList = [];
  169. // // for (int i = 0; i < _puzzleSize; i++) {
  170. // // int yMod = i % _puzzleSize;
  171. // // double y = yMod / (_puzzleSize - 1);
  172. // // for (int j = 0; j < _puzzleSize; j++) {
  173. // // final xMod = _numberList[i][j] % _puzzleSize;
  174. // // double x = xMod / (_puzzleSize - 1);
  175. // // offsetList.add(FractionalOffset(x, y));
  176. // // }
  177. // // }
  178. // // }
  179. // @override
  180. // Widget build(BuildContext context) {
  181. // var screenSize = MediaQuery.of(context).size;
  182. // var boardSize = screenSize.width * 0.4;
  183. // var spacing = 4;
  184. // var eachBoxSize =
  185. // (boardSize / widget.puzzleSize) - (spacing * (widget.puzzleSize - 1));
  186. // return SizedBox(
  187. // height: boardSize,
  188. // width: boardSize,
  189. // child: Stack(
  190. // children: [
  191. // for (var offset in widget.offsetList)
  192. // AnimatedAlign(
  193. // alignment: offset,
  194. // duration: const Duration(seconds: 1),
  195. // curve: Curves.easeInOut,
  196. // child: Container(
  197. // height: eachBoxSize,
  198. // width: eachBoxSize,
  199. // color: Colors.black,
  200. // ),
  201. // ),
  202. // // AnimatedAlign(
  203. // // alignment: FractionalOffset(1, 0),
  204. // // duration: Duration(seconds: 1),
  205. // // curve: Curves.easeInOut,
  206. // // child: Container(
  207. // // height: eachBoxSize,
  208. // // width: eachBoxSize,
  209. // // color: Colors.black,
  210. // // ),
  211. // // ),
  212. // // AnimatedAlign(
  213. // // alignment: FractionalOffset(0.5, 1),
  214. // // duration: Duration(seconds: 1),
  215. // // curve: Curves.easeInOut,
  216. // // child: Container(
  217. // // height: eachBoxSize,
  218. // // width: eachBoxSize,
  219. // // color: Colors.black,
  220. // // ),
  221. // // ),
  222. // ],
  223. // ),
  224. // );
  225. // // -----------------------------
  226. // // Working implementation:
  227. // // -----------------------------
  228. // // return SizedBox(
  229. // // height: screenSize.height * 0.7,
  230. // // width: screenSize.width * 0.4,
  231. // // child: GridView.builder(
  232. // // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
  233. // // crossAxisCount: puzzleSize,
  234. // // ),
  235. // // itemCount: number.length,
  236. // // itemBuilder: (context, index) {
  237. // // return number[index] != 0
  238. // // ? Padding(
  239. // // padding: const EdgeInsets.all(2.0),
  240. // // child: GestureDetector(
  241. // // onTap: () => onTap(index),
  242. // // child: AnimatedPositioned(
  243. // // duration: Duration(milliseconds: 600),
  244. // // child: Container(
  245. // // height: 20,
  246. // // width: 20,
  247. // // color: Colors.orange,
  248. // // ),
  249. // // ),
  250. // // ),
  251. // // )
  252. // // // ? MouseRegion(
  253. // // // child: Padding(
  254. // // // padding: const EdgeInsets.all(2.0),
  255. // // // child: GestureDetector(
  256. // // // onTap: () => onTap(index),
  257. // // // child: Card(
  258. // // // elevation: 4,
  259. // // // color: color,
  260. // // // // dark -> 0xFF14407a
  261. // // // // light -> 0xFF43b9fd
  262. // // // shape: RoundedRectangleBorder(
  263. // // // borderRadius: BorderRadius.circular(20),
  264. // // // ),
  265. // // // child: SizedBox(
  266. // // // height: 20,
  267. // // // width: 20,
  268. // // // child: Center(
  269. // // // child: Text(
  270. // // // number[index].toString(),
  271. // // // style: const TextStyle(
  272. // // // fontSize: 60,
  273. // // // fontWeight: FontWeight.bold,
  274. // // // color: Colors.white,
  275. // // // ),
  276. // // // ),
  277. // // // ),
  278. // // // ),
  279. // // // ),
  280. // // // ),
  281. // // // ),
  282. // // // )
  283. // // : const SizedBox();
  284. // // },
  285. // // ),
  286. // // );
  287. // }
  288. // }