StudyInfoContext.dart 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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/database/entity/StudyInfo.dart';
  6. import 'package:flutter_habit/view/context/widget/BaseCard.dart';
  7. import 'package:flutter_habit/view/context/widget/DateValueSingleLineChart.dart';
  8. import 'package:flutter_habit/view/context/widget/StudyInfoDetailsPage.dart';
  9. import 'package:provider/provider.dart';
  10. class StudyInfoContext extends StatelessWidget {
  11. @override
  12. Widget build(BuildContext context) {
  13. return MultiProvider(
  14. providers: [
  15. ChangeNotifierProvider<StudyInfoContextService>(
  16. create: (_) => StudyInfoContextService(context)),
  17. ],
  18. child: _StudyInfoContextView(),
  19. );
  20. }
  21. }
  22. // service
  23. class StudyInfoContextService extends BaseProvider {
  24. StudyInfoContextService(BuildContext context) : super(context);
  25. void changeSizeOfBwhChartCard(BuildContext context) {
  26. DataProvider dataProvider =
  27. Provider.of<DataProvider>(context, listen: false);
  28. switch (dataProvider.dailyStudyCountChartSize) {
  29. case 7:
  30. dataProvider.dailyStudyCountChartSize = 30;
  31. break;
  32. case 30:
  33. dataProvider.dailyStudyCountChartSize = 90;
  34. break;
  35. case 90:
  36. dataProvider.dailyStudyCountChartSize = 7;
  37. break;
  38. }
  39. dataProvider.notifyListeners();
  40. }
  41. Future<void> toStudyInfoDetailsPage(
  42. BuildContext context, StudyInfo studyInfo) async {
  43. await Navigator.of(context).push(
  44. MaterialPageRoute(builder: (_) => StudyInfoDetailsPage(studyInfo)));
  45. }
  46. }
  47. // view
  48. class _StudyInfoContextView extends StatelessWidget {
  49. @override
  50. Widget build(BuildContext context) {
  51. return ListView(
  52. children: <Widget>[
  53. overviewCard(context),
  54. dailyStudyCountChart(context),
  55. Divider(),
  56. unSolveStudyInfoCards(context),
  57. ],
  58. );
  59. }
  60. Widget overviewCard(BuildContext context) {
  61. DataProvider dataProvider =
  62. Provider.of<DataProvider>(context, listen: true);
  63. return BaseCard(
  64. title: Text(
  65. I18N.of("总结"),
  66. style: Theme.of(context).textTheme.titleLarge,
  67. ),
  68. subtitle: Text(I18N.of("概览")),
  69. child: Row(
  70. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  71. children: <Widget>[
  72. Container(),
  73. Icon(
  74. Icons.edit,
  75. size: 100,
  76. color: Theme.of(context).colorScheme.secondary,
  77. ),
  78. Container(),
  79. Column(
  80. crossAxisAlignment: CrossAxisAlignment.start,
  81. children: <Widget>[
  82. Text(
  83. "${I18N.of("迟到次数")}: ${dataProvider.lateTimes}",
  84. ),
  85. Text(
  86. "${I18N.of("缺席次数")}: ${dataProvider.absentTimes}",
  87. ),
  88. Text(
  89. "${I18N.of("未解决的问题数")}: ${dataProvider.unSolveTroubles}",
  90. ),
  91. Text(
  92. "${I18N.of("未完成的作业数")}: ${dataProvider.unDoneHomeWorks}",
  93. ),
  94. ],
  95. ),
  96. Container(),
  97. ],
  98. ),
  99. );
  100. }
  101. Widget dailyStudyCountChart(BuildContext context) {
  102. StudyInfoContextService service =
  103. Provider.of<StudyInfoContextService>(context, listen: false);
  104. DataProvider dataProvider =
  105. Provider.of<DataProvider>(context, listen: true);
  106. return BaseCard(
  107. title: Text(
  108. "${I18N.of("每日课程数")}",
  109. style: Theme.of(context).textTheme.titleLarge,
  110. ),
  111. subtitle: Container(
  112. height: 25,
  113. child: TextButton(
  114. child: Text("< ${dataProvider.dailyStudyCountChartSize} >"),
  115. onPressed: () => service.changeSizeOfBwhChartCard(context),
  116. ),
  117. ),
  118. child: DateValueSingleLineChart(
  119. size: dataProvider.dailyStudyCountChartSize,
  120. sports: dataProvider.dailyStudyCountFlSpots,
  121. ),
  122. );
  123. }
  124. Widget unSolveStudyInfoCards(BuildContext context) {
  125. DataProvider dataProvider =
  126. Provider.of<DataProvider>(context, listen: true);
  127. StudyInfoContextService service =
  128. Provider.of<StudyInfoContextService>(context, listen: false);
  129. return Column(
  130. children: dataProvider.unSolveStudyInfoList.map((i) {
  131. return BaseCard(
  132. title: Text(
  133. i.getCourseName()!,
  134. style: Theme.of(context).textTheme.titleLarge,
  135. ),
  136. subtitle: Text(DateTime.fromMillisecondsSinceEpoch(i.getDate()!)
  137. .toString()
  138. .substring(0, 16)),
  139. child: Row(
  140. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  141. children: <Widget>[
  142. Container(),
  143. Icon(
  144. Icons.info_outline,
  145. size: 100,
  146. color: Theme.of(context).colorScheme.secondary,
  147. ),
  148. Container(),
  149. Column(
  150. crossAxisAlignment: CrossAxisAlignment.center,
  151. children: <Widget>[
  152. i.getIsHomeWorkDone() == 1
  153. ? Container()
  154. : Text(
  155. I18N.of("有未完成的作业"),
  156. style:
  157. TextStyle(
  158. color: Theme.of(context).colorScheme.secondary),
  159. ),
  160. i.getIsTroublesSolved() == 1
  161. ? Container()
  162. : Text(
  163. I18N.of("有未解决的问题"),
  164. style:
  165. TextStyle(
  166. color: Theme.of(context).colorScheme.secondary),
  167. ),
  168. ElevatedButton(
  169. style: ButtonStyle(
  170. backgroundColor: MaterialStateProperty.all(
  171. Theme.of(context).colorScheme.secondary),
  172. foregroundColor: MaterialStateProperty.all(
  173. Theme.of(context).cardColor)),
  174. child: Text(I18N.of("详情")),
  175. onPressed: () => service.toStudyInfoDetailsPage(context, i),
  176. ),
  177. ],
  178. ),
  179. Container(),
  180. ],
  181. ),
  182. );
  183. }).toList(),
  184. );
  185. }
  186. }