LifeInfoContext.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_habit/common/BaseArchitectural.dart';
  3. import 'package:flutter_habit/common/I18N.dart';
  4. import 'package:flutter_habit/provider/DataProvider.dart';
  5. import 'package:flutter_habit/common/utils/ConvertUtils.dart';
  6. import 'package:flutter_habit/view/context/widget/BaseCard.dart';
  7. import 'package:flutter_habit/view/context/widget/DateTimeMultiLineChart.dart';
  8. import 'package:flutter_habit/view/context/widget/DateValueSingleLineChart.dart';
  9. import 'package:provider/provider.dart';
  10. class LifeInfoContext extends StatelessWidget {
  11. @override
  12. Widget build(BuildContext context) {
  13. return MultiProvider(
  14. providers: [
  15. ChangeNotifierProvider<LifeInfoContextService>(
  16. create: (_) => LifeInfoContextService(context)),
  17. ],
  18. child: _LifeInfoContextView(),
  19. );
  20. }
  21. }
  22. // service
  23. class LifeInfoContextService extends BaseProvider {
  24. LifeInfoContextService(BuildContext context) : super(context);
  25. void changeSizeOfSleepTimeChartCard(BuildContext context) {
  26. DataProvider dataProvider =
  27. Provider.of<DataProvider>(context, listen: false);
  28. switch (dataProvider.sleepTimeChartSize) {
  29. case 7:
  30. dataProvider.sleepTimeChartSize = 30;
  31. break;
  32. case 30:
  33. dataProvider.sleepTimeChartSize = 90;
  34. break;
  35. case 90:
  36. dataProvider.sleepTimeChartSize = 7;
  37. break;
  38. }
  39. dataProvider.notifyListeners();
  40. }
  41. changeSizeOfInjectKCalChartSize(BuildContext context) {
  42. DataProvider dataProvider =
  43. Provider.of<DataProvider>(context, listen: false);
  44. switch (dataProvider.injectKCalChartSize) {
  45. case 7:
  46. dataProvider.injectKCalChartSize = 30;
  47. break;
  48. case 30:
  49. dataProvider.injectKCalChartSize = 90;
  50. break;
  51. case 90:
  52. dataProvider.injectKCalChartSize = 7;
  53. break;
  54. }
  55. dataProvider.notifyListeners();
  56. }
  57. changeSizeOfProgressChartSize(BuildContext context) {
  58. DataProvider dataProvider =
  59. Provider.of<DataProvider>(context, listen: false);
  60. switch (dataProvider.progressChartSize) {
  61. case 7:
  62. dataProvider.progressChartSize = 30;
  63. break;
  64. case 30:
  65. dataProvider.progressChartSize = 90;
  66. break;
  67. case 90:
  68. dataProvider.progressChartSize = 7;
  69. break;
  70. }
  71. dataProvider.notifyListeners();
  72. }
  73. void changeSizeOfTimeChartCard(BuildContext context) {
  74. DataProvider dataProvider =
  75. Provider.of<DataProvider>(context, listen: false);
  76. switch (dataProvider.timeChartSize) {
  77. case 7:
  78. dataProvider.timeChartSize = 30;
  79. break;
  80. case 30:
  81. dataProvider.timeChartSize = 90;
  82. break;
  83. case 90:
  84. dataProvider.timeChartSize = 7;
  85. break;
  86. }
  87. dataProvider.notifyListeners();
  88. }
  89. void changeSizeOfMoneyChartSize(BuildContext context) {
  90. DataProvider dataProvider =
  91. Provider.of<DataProvider>(context, listen: false);
  92. switch (dataProvider.moneyChartSize) {
  93. case 7:
  94. dataProvider.moneyChartSize = 30;
  95. break;
  96. case 30:
  97. dataProvider.moneyChartSize = 90;
  98. break;
  99. case 90:
  100. dataProvider.moneyChartSize = 7;
  101. break;
  102. }
  103. dataProvider.notifyListeners();
  104. }
  105. void changeSizeOfEatTimeChartCard(BuildContext context) {
  106. DataProvider dataProvider =
  107. Provider.of<DataProvider>(context, listen: false);
  108. switch (dataProvider.eatTimeChartSize) {
  109. case 7:
  110. dataProvider.eatTimeChartSize = 30;
  111. break;
  112. case 30:
  113. dataProvider.eatTimeChartSize = 90;
  114. break;
  115. case 90:
  116. dataProvider.eatTimeChartSize = 7;
  117. break;
  118. }
  119. dataProvider.notifyListeners();}
  120. }
  121. // view
  122. class _LifeInfoContextView extends StatelessWidget {
  123. @override
  124. Widget build(BuildContext context) {
  125. // LifeInfoContextService service =
  126. Provider.of<LifeInfoContextService>(context, listen: false);
  127. return ListView(
  128. children: <Widget>[
  129. overviewCard(context),
  130. sleepTimeChartCard(context),
  131. injectKCalChartCard(context),
  132. moneyChartCard(context),
  133. timeChartCard(context),
  134. eatTimeChartCard(context),
  135. progressChartCard(context),
  136. ],
  137. );
  138. }
  139. Widget overviewCard(BuildContext context) {
  140. DataProvider dataProvider =
  141. Provider.of<DataProvider>(context, listen: true);
  142. return BaseCard(
  143. title: Text(
  144. I18N.of("今日"),
  145. style: Theme.of(context).textTheme.titleLarge,
  146. ),
  147. subtitle: Text(I18N.of("概览")),
  148. child: Row(
  149. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  150. children: <Widget>[
  151. Container(),
  152. Icon(
  153. Icons.wb_sunny,
  154. size: 100,
  155. color: Theme.of(context).colorScheme.secondary,
  156. ),
  157. Column(
  158. crossAxisAlignment: CrossAxisAlignment.start,
  159. children: <Widget>[
  160. Text(
  161. "${I18N.of("昨夜睡眠时长")}: ${dataProvider.lastNightSleepTime == null ? I18N.of("无数据") : ConvertUtils.fixedDouble(ConvertUtils.hourFormMilliseconds(dataProvider.lastNightSleepTime!), 2)} h",
  162. ),
  163. Text(
  164. "${I18N.of("摄入卡路里总量")}: ${dataProvider.todayInjectKCal.toStringAsFixed(2)} kcal",
  165. ),
  166. Text(
  167. "${I18N.of("消费")}: ${ConvertUtils.fixedDouble(dataProvider.todayMoney, 2)}",
  168. ),
  169. Text(
  170. "${I18N.of("打卡完成度")}: ${ConvertUtils.fixedDouble(dataProvider.todayProgress / 12, 2)}",
  171. ),
  172. ],
  173. ),
  174. Container(),
  175. ],
  176. ),
  177. );
  178. }
  179. Widget sleepTimeChartCard(BuildContext context) {
  180. LifeInfoContextService service =
  181. Provider.of<LifeInfoContextService>(context, listen: false);
  182. DataProvider dataProvider =
  183. Provider.of<DataProvider>(context, listen: true);
  184. return BaseCard(
  185. title: Text(
  186. "${I18N.of("睡眠时长")} (h)",
  187. style: Theme.of(context).textTheme.titleLarge,
  188. ),
  189. subtitle: Container(
  190. height: 25,
  191. child: TextButton(
  192. child: Text("< ${dataProvider.sleepTimeChartSize} >"),
  193. onPressed: () => service.changeSizeOfSleepTimeChartCard(context),
  194. ),
  195. ),
  196. child: DateValueSingleLineChart(
  197. size: dataProvider.sleepTimeChartSize,
  198. sports: dataProvider.sleepTimeFlSpots,
  199. isEndYesterday: true,
  200. ),
  201. );
  202. }
  203. Widget injectKCalChartCard(BuildContext context) {
  204. LifeInfoContextService service =
  205. Provider.of<LifeInfoContextService>(context, listen: false);
  206. DataProvider dataProvider =
  207. Provider.of<DataProvider>(context, listen: true);
  208. return BaseCard(
  209. title: Text(
  210. "${I18N.of("摄入卡路里")} (kcal)",
  211. style: Theme.of(context).textTheme.titleLarge,
  212. ),
  213. subtitle: Container(
  214. height: 25,
  215. child: TextButton(
  216. child: Text("< ${dataProvider.injectKCalChartSize} >"),
  217. onPressed: () => service.changeSizeOfInjectKCalChartSize(context),
  218. ),
  219. ),
  220. child: DateValueSingleLineChart(
  221. size: dataProvider.injectKCalChartSize,
  222. sports: dataProvider.injectKCalFlSpots,
  223. ),
  224. );
  225. }
  226. Widget moneyChartCard(BuildContext context) {
  227. LifeInfoContextService service =
  228. Provider.of<LifeInfoContextService>(context, listen: false);
  229. DataProvider dataProvider =
  230. Provider.of<DataProvider>(context, listen: true);
  231. return BaseCard(
  232. title: Text(
  233. "${I18N.of("花费记录")}",
  234. style: Theme.of(context).textTheme.titleLarge,
  235. ),
  236. subtitle: Container(
  237. height: 25,
  238. child: TextButton(
  239. child: Text("< ${dataProvider.moneyChartSize} >"),
  240. onPressed: () => service.changeSizeOfMoneyChartSize(context),
  241. ),
  242. ),
  243. child: DateValueSingleLineChart(
  244. size: dataProvider.moneyChartSize,
  245. sports: dataProvider.moneyFlSpots,
  246. ),
  247. );
  248. }
  249. Widget progressChartCard(BuildContext context) {
  250. LifeInfoContextService service =
  251. Provider.of<LifeInfoContextService>(context, listen: false);
  252. DataProvider dataProvider =
  253. Provider.of<DataProvider>(context, listen: true);
  254. return BaseCard(
  255. title: Text(
  256. "${I18N.of("每日打卡完成度")}",
  257. style: Theme.of(context).textTheme.titleLarge,
  258. ),
  259. subtitle: Container(
  260. height: 25,
  261. child: TextButton(
  262. child: Text("< ${dataProvider.progressChartSize} >"),
  263. onPressed: () => service.changeSizeOfProgressChartSize(context),
  264. ),
  265. ),
  266. child: DateValueSingleLineChart(
  267. size: dataProvider.progressChartSize,
  268. sports: dataProvider.progressFlSpots,
  269. ),
  270. );
  271. }
  272. Widget timeChartCard(BuildContext context) {
  273. LifeInfoContextService service =
  274. Provider.of<LifeInfoContextService>(context, listen: false);
  275. DataProvider dataProvider =
  276. Provider.of<DataProvider>(context, listen: true);
  277. return BaseCard(
  278. title: Text(
  279. "${I18N.of("睡眠时间")}",
  280. style: Theme.of(context).textTheme.titleLarge,
  281. ),
  282. subtitle: Container(
  283. height: 25,
  284. child: TextButton(
  285. child: Text("< ${dataProvider.timeChartSize} >"),
  286. onPressed: () => service.changeSizeOfTimeChartCard(context),
  287. ),
  288. ),
  289. child: DateTimeMultiLineChart(
  290. size: dataProvider.timeChartSize,
  291. lineNameSportsMap: {
  292. I18N.of("起床时间"): dataProvider.getUpTimeFlSpots,
  293. I18N.of("午休时间"): dataProvider.midRestTimeFlSpots,
  294. I18N.of("睡觉时间"): dataProvider.restTimeFlSpots
  295. },
  296. ),
  297. );
  298. }
  299. Widget eatTimeChartCard(BuildContext context) {
  300. LifeInfoContextService service =
  301. Provider.of<LifeInfoContextService>(context, listen: false);
  302. DataProvider dataProvider =
  303. Provider.of<DataProvider>(context, listen: true);
  304. return BaseCard(
  305. title: Text(
  306. "${I18N.of("吃饭时间")}",
  307. style: Theme.of(context).textTheme.titleLarge,
  308. ),
  309. subtitle: Container(
  310. height: 25,
  311. child: TextButton(
  312. child: Text("< ${dataProvider.eatTimeChartSize} >"),
  313. onPressed: () => service.changeSizeOfEatTimeChartCard(context),
  314. ),
  315. ),
  316. child: DateTimeMultiLineChart(
  317. size: dataProvider.eatTimeChartSize,
  318. lineNameSportsMap: {
  319. I18N.of("早饭时间"): dataProvider.eatBreakfastTimeFlSpots,
  320. I18N.of("午饭时间"): dataProvider.eatLunchTimeFlSpots,
  321. I18N.of("晚饭时间"): dataProvider.eatDinnerTimeFlSpots
  322. },
  323. ),
  324. );
  325. }
  326. }