SignTimeSetPage.dart 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_habit/common/I18N.dart';
  3. import 'package:flutter_habit/common/components/PopMenus.dart';
  4. import 'package:flutter_habit/provider/ConfigProvider.dart';
  5. import 'package:flutter_habit/provider/DataProvider.dart';
  6. import 'package:flutter_habit/provider/NotificationProvider.dart';
  7. import 'package:flutter_habit/common/utils/ConvertUtils.dart';
  8. import 'package:provider/provider.dart';
  9. class SignTimeSetPage extends StatefulWidget {
  10. @override
  11. _SignTimeSetPageState createState() => _SignTimeSetPageState();
  12. }
  13. class _SignTimeSetPageState extends State<SignTimeSetPage> {
  14. @override
  15. Widget build(BuildContext context) {
  16. ConfigProvider configProvider =
  17. Provider.of<ConfigProvider>(context, listen: true);
  18. ConfigProvider configProviderUnListen =
  19. Provider.of<ConfigProvider>(context, listen: false);
  20. DataProvider dataProvider =
  21. Provider.of<DataProvider>(context, listen: false);
  22. return Scaffold(
  23. appBar: AppBar(
  24. title: Text(I18N.of("打卡时段")),
  25. ),
  26. body: Padding(
  27. padding: EdgeInsets.all(16),
  28. child: ListView(
  29. children: <Widget>[
  30. ListTile(
  31. leading: Icon(Icons.wb_sunny),
  32. title: Text(I18N.of("起床打卡")),
  33. subtitle: Text(
  34. "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.getUpTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.getUpTimeEnd!)}"),
  35. trailing: Icon(Icons.chevron_right),
  36. onTap: () async {
  37. await PopMenus.baseMenu(
  38. context: context,
  39. title: Text(I18N.of("起床打卡时间")),
  40. contentPadding: EdgeInsets.all(16),
  41. children: [
  42. TextButton(
  43. child: Text(I18N.of("起始时间")),
  44. onPressed: () async {
  45. TimeOfDay? res = await showTimePicker(
  46. context: context,
  47. initialTime: TimeOfDay.fromDateTime(
  48. DateTime.fromMillisecondsSinceEpoch(
  49. configProvider.getUpTimeStart)),
  50. );
  51. if (res != null) {
  52. Navigator.of(context).pop();
  53. configProviderUnListen.getUpTimeStart =
  54. DateTime(1, 1, 1, res.hour, res.minute)
  55. .millisecondsSinceEpoch;
  56. configProviderUnListen.store();
  57. configProviderUnListen.refresh();
  58. await dataProvider.loadLifeInfoData();
  59. await dataProvider.evaluateToday();
  60. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  61. }
  62. },
  63. ),
  64. TextButton(
  65. child: Text(I18N.of("结束时间")),
  66. onPressed: () async {
  67. TimeOfDay? res = await showTimePicker(
  68. context: context,
  69. initialTime: TimeOfDay.fromDateTime(
  70. DateTime.fromMillisecondsSinceEpoch(
  71. configProvider.getUpTimeEnd!)),
  72. );
  73. if (res != null) {
  74. Navigator.of(context).pop();
  75. configProviderUnListen.getUpTimeEnd =
  76. DateTime(1, 1, 1, res.hour, res.minute)
  77. .millisecondsSinceEpoch;
  78. configProviderUnListen.store();
  79. configProviderUnListen.refresh();
  80. await dataProvider.loadLifeInfoData();
  81. await dataProvider.evaluateToday();
  82. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  83. }
  84. },
  85. ),
  86. ],
  87. );
  88. },
  89. ),
  90. ListTile(
  91. leading: Icon(Icons.free_breakfast),
  92. title: Text(I18N.of("早饭打卡")),
  93. subtitle: Text(
  94. "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.breakfastTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.breakfastTimeEnd!)}"),
  95. trailing: Icon(Icons.chevron_right),
  96. onTap: () async {
  97. await PopMenus.baseMenu(
  98. context: context,
  99. title: Text(I18N.of("早饭打卡时间")),
  100. contentPadding: EdgeInsets.all(16),
  101. children: [
  102. TextButton(
  103. child: Text(I18N.of("起始时间")),
  104. onPressed: () async {
  105. TimeOfDay? res = await showTimePicker(
  106. context: context,
  107. initialTime: TimeOfDay.fromDateTime(
  108. DateTime.fromMillisecondsSinceEpoch(
  109. configProvider.breakfastTimeStart)),
  110. );
  111. if (res != null) {
  112. Navigator.of(context).pop();
  113. configProviderUnListen.breakfastTimeStart =
  114. DateTime(1, 1, 1, res.hour, res.minute)
  115. .millisecondsSinceEpoch;
  116. configProviderUnListen.store();
  117. configProviderUnListen.refresh();
  118. await dataProvider.loadLifeInfoData();
  119. await dataProvider.evaluateToday();
  120. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  121. }
  122. },
  123. ),
  124. TextButton(
  125. child: Text(I18N.of("结束时间")),
  126. onPressed: () async {
  127. TimeOfDay? res = await showTimePicker(
  128. context: context,
  129. initialTime: TimeOfDay.fromDateTime(
  130. DateTime.fromMillisecondsSinceEpoch(
  131. configProvider.breakfastTimeEnd!)),
  132. );
  133. if (res != null) {
  134. Navigator.of(context).pop();
  135. configProviderUnListen.breakfastTimeEnd =
  136. DateTime(1, 1, 1, res.hour, res.minute)
  137. .millisecondsSinceEpoch;
  138. configProviderUnListen.store();
  139. configProviderUnListen.refresh();
  140. await dataProvider.loadLifeInfoData();
  141. await dataProvider.evaluateToday();
  142. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  143. }
  144. },
  145. ),
  146. ],
  147. );
  148. },
  149. ),
  150. ListTile(
  151. leading: Icon(Icons.local_dining),
  152. title: Text(I18N.of("午饭打卡")),
  153. subtitle: Text(
  154. "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.lunchTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.lunchTimeEnd!)}"),
  155. trailing: Icon(Icons.chevron_right),
  156. onTap: () async {
  157. await PopMenus.baseMenu(
  158. context: context,
  159. title: Text(I18N.of("午饭打卡时间")),
  160. contentPadding: EdgeInsets.all(16),
  161. children: [
  162. TextButton(
  163. child: Text(I18N.of("起始时间")),
  164. onPressed: () async {
  165. TimeOfDay? res = await showTimePicker(
  166. context: context,
  167. initialTime: TimeOfDay.fromDateTime(
  168. DateTime.fromMillisecondsSinceEpoch(
  169. configProvider.lunchTimeStart)),
  170. );
  171. if (res != null) {
  172. Navigator.of(context).pop();
  173. configProviderUnListen.lunchTimeStart =
  174. DateTime(1, 1, 1, res.hour, res.minute)
  175. .millisecondsSinceEpoch;
  176. configProviderUnListen.store();
  177. configProviderUnListen.refresh();
  178. await dataProvider.loadLifeInfoData();
  179. await dataProvider.evaluateToday();
  180. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  181. }
  182. },
  183. ),
  184. TextButton(
  185. child: Text(I18N.of("结束时间")),
  186. onPressed: () async {
  187. TimeOfDay? res = await showTimePicker(
  188. context: context,
  189. initialTime: TimeOfDay.fromDateTime(
  190. DateTime.fromMillisecondsSinceEpoch(
  191. configProvider.lunchTimeEnd!)),
  192. );
  193. if (res != null) {
  194. Navigator.of(context).pop();
  195. configProviderUnListen.lunchTimeEnd =
  196. DateTime(1, 1, 1, res.hour, res.minute)
  197. .millisecondsSinceEpoch;
  198. configProviderUnListen.store();
  199. configProviderUnListen.refresh();
  200. await dataProvider.loadLifeInfoData();
  201. await dataProvider.evaluateToday();
  202. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  203. }
  204. },
  205. ),
  206. ],
  207. );
  208. },
  209. ),
  210. ListTile(
  211. leading: Icon(Icons.local_hotel),
  212. title: Text(I18N.of("午休打卡")),
  213. subtitle: Text(
  214. "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.midRestTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.midRestTimeEnd!)}"),
  215. trailing: Icon(Icons.chevron_right),
  216. onTap: () async {
  217. await PopMenus.baseMenu(
  218. context: context,
  219. title: Text(I18N.of("午休打卡时间")),
  220. contentPadding: EdgeInsets.all(16),
  221. children: [
  222. TextButton(
  223. child: Text(I18N.of("起始时间")),
  224. onPressed: () async {
  225. TimeOfDay? res = await showTimePicker(
  226. context: context,
  227. initialTime: TimeOfDay.fromDateTime(
  228. DateTime.fromMillisecondsSinceEpoch(
  229. configProvider.midRestTimeStart)),
  230. );
  231. if (res != null) {
  232. Navigator.of(context).pop();
  233. configProviderUnListen.midRestTimeStart =
  234. DateTime(1, 1, 1, res.hour, res.minute)
  235. .millisecondsSinceEpoch;
  236. configProviderUnListen.store();
  237. configProviderUnListen.refresh();
  238. await dataProvider.loadLifeInfoData();
  239. await dataProvider.evaluateToday();
  240. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  241. }
  242. },
  243. ),
  244. TextButton(
  245. child: Text(I18N.of("结束时间")),
  246. onPressed: () async {
  247. TimeOfDay? res = await showTimePicker(
  248. context: context,
  249. initialTime: TimeOfDay.fromDateTime(
  250. DateTime.fromMillisecondsSinceEpoch(
  251. configProvider.midRestTimeEnd!)),
  252. );
  253. if (res != null) {
  254. Navigator.of(context).pop();
  255. configProviderUnListen.midRestTimeEnd =
  256. DateTime(1, 1, 1, res.hour, res.minute)
  257. .millisecondsSinceEpoch;
  258. configProviderUnListen.store();
  259. configProviderUnListen.refresh();
  260. await dataProvider.loadLifeInfoData();
  261. await dataProvider.evaluateToday();
  262. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  263. }
  264. },
  265. ),
  266. ],
  267. );
  268. },
  269. ),
  270. ListTile(
  271. leading: Icon(Icons.restaurant),
  272. title: Text(I18N.of("晚饭打卡")),
  273. subtitle: Text(
  274. "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.dinnerTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.dinnerTimeEnd!)}"),
  275. trailing: Icon(Icons.chevron_right),
  276. onTap: () async {
  277. await PopMenus.baseMenu(
  278. context: context,
  279. title: Text(I18N.of("起床打卡时间")),
  280. contentPadding: EdgeInsets.all(16),
  281. children: [
  282. TextButton(
  283. child: Text(I18N.of("起始时间")),
  284. onPressed: () async {
  285. TimeOfDay? res = await showTimePicker(
  286. context: context,
  287. initialTime: TimeOfDay.fromDateTime(
  288. DateTime.fromMillisecondsSinceEpoch(
  289. configProvider.dinnerTimeStart)),
  290. );
  291. if (res != null) {
  292. Navigator.of(context).pop();
  293. configProviderUnListen.dinnerTimeStart =
  294. DateTime(1, 1, 1, res.hour, res.minute)
  295. .millisecondsSinceEpoch;
  296. configProviderUnListen.store();
  297. configProviderUnListen.refresh();
  298. await dataProvider.loadLifeInfoData();
  299. await dataProvider.evaluateToday();
  300. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  301. }
  302. },
  303. ),
  304. TextButton(
  305. child: Text(I18N.of("结束时间")),
  306. onPressed: () async {
  307. TimeOfDay? res = await showTimePicker(
  308. context: context,
  309. initialTime: TimeOfDay.fromDateTime(
  310. DateTime.fromMillisecondsSinceEpoch(
  311. configProvider.dinnerTimeEnd!)),
  312. );
  313. if (res != null) {
  314. Navigator.of(context).pop();
  315. configProviderUnListen.dinnerTimeEnd =
  316. DateTime(1, 1, 1, res.hour, res.minute)
  317. .millisecondsSinceEpoch;
  318. configProviderUnListen.store();
  319. configProviderUnListen.refresh();
  320. await dataProvider.loadLifeInfoData();
  321. await dataProvider.evaluateToday();
  322. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  323. }
  324. },
  325. ),
  326. ],
  327. );
  328. },
  329. ),
  330. ListTile(
  331. leading: Icon(Icons.brightness_4),
  332. title: Text(I18N.of("晚安打卡")),
  333. subtitle: Text(
  334. "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.restTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.restTimeEnd!)}"),
  335. trailing: Icon(Icons.chevron_right),
  336. onTap: () async {
  337. await PopMenus.baseMenu(
  338. context: context,
  339. title: Text(I18N.of("起床打卡时间")),
  340. contentPadding: EdgeInsets.all(16),
  341. children: [
  342. TextButton(
  343. child: Text(I18N.of("起始时间")),
  344. onPressed: () async {
  345. TimeOfDay? res = await showTimePicker(
  346. context: context,
  347. initialTime: TimeOfDay.fromDateTime(
  348. DateTime.fromMillisecondsSinceEpoch(
  349. configProvider.restTimeStart)),
  350. );
  351. if (res != null) {
  352. Navigator.of(context).pop();
  353. configProviderUnListen.restTimeStart =
  354. DateTime(1, 1, 1, res.hour, res.minute)
  355. .millisecondsSinceEpoch;
  356. configProviderUnListen.store();
  357. configProviderUnListen.refresh();
  358. await dataProvider.loadLifeInfoData();
  359. await dataProvider.evaluateToday();
  360. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  361. }
  362. },
  363. ),
  364. TextButton(
  365. child: Text(I18N.of("结束时间")),
  366. onPressed: () async {
  367. TimeOfDay? res = await showTimePicker(
  368. context: context,
  369. initialTime: TimeOfDay.fromDateTime(
  370. DateTime.fromMillisecondsSinceEpoch(
  371. configProvider.restTimeEnd!)),
  372. );
  373. if (res != null) {
  374. Navigator.of(context).pop();
  375. configProviderUnListen.restTimeEnd =
  376. DateTime(1, 1, 1, res.hour, res.minute)
  377. .millisecondsSinceEpoch;
  378. configProviderUnListen.store();
  379. configProviderUnListen.refresh();
  380. await dataProvider.loadLifeInfoData();
  381. await dataProvider.evaluateToday();
  382. await Provider.of<NotificationProvider>(context, listen: false).refresh();
  383. }
  384. },
  385. ),
  386. ],
  387. );
  388. },
  389. ),
  390. ],
  391. ),
  392. ),
  393. );
  394. }
  395. }