home_page.dart 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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/UserProvider.dart';
  5. import 'package:flutter_habit/view/context/ExerciseInfoContext.dart';
  6. import 'package:flutter_habit/view/context/LifeInfoContext.dart';
  7. import 'package:flutter_habit/view/context/BasicInfoContext.dart';
  8. import 'package:flutter_habit/view/context/StudyInfoContext.dart';
  9. import 'package:flutter_habit/view/drawer/HomePageDrawer.dart';
  10. import 'package:flutter_habit/view/record/BasicInfoRecordingPage.dart';
  11. import 'package:flutter_habit/view/record/ExerciseInfoRecordingPage.dart';
  12. import 'package:flutter_habit/view/record/LifeInfoRecordingPage.dart';
  13. import 'package:flutter_habit/view/record/StudyInfoRecordingPage.dart';
  14. import 'package:provider/provider.dart';
  15. /// Description: Home Page
  16. /// Time : 08/18/2023 Friday
  17. /// Author : liuyuqi.gov@msn.cn
  18. class HomePage extends StatelessWidget {
  19. @override
  20. Widget build(BuildContext context) {
  21. return MultiProvider(
  22. providers: [
  23. ChangeNotifierProvider<HomePageService>(
  24. create: (_) => HomePageService(context)),
  25. ChangeNotifierProvider<HomePageModel>(
  26. create: (_) => HomePageModel(context)),
  27. ],
  28. child: _HomePageView(),
  29. );
  30. }
  31. }
  32. // model
  33. class HomePageModel extends BaseModel {
  34. HomePageModel(BuildContext context) : super(context);
  35. int currentIndex;
  36. PageController pageViewController;
  37. @override
  38. void init(BuildContext context) {
  39. super.init(context);
  40. currentIndex = 0;
  41. pageViewController = PageController(initialPage: 0);
  42. }
  43. }
  44. // service
  45. class HomePageService extends BaseProvider {
  46. HomePageService(BuildContext context) : super(context);
  47. void changeNavigation(BuildContext context, int index) {
  48. HomePageModel model = Provider.of<HomePageModel>(context, listen: false);
  49. model.currentIndex = index;
  50. model.pageViewController.animateToPage(index,
  51. duration: Duration(milliseconds: 300), curve: Curves.ease);
  52. model.refresh();
  53. }
  54. void onPageChanged(BuildContext context, int index) {
  55. HomePageModel model = Provider.of<HomePageModel>(context, listen: false);
  56. model.currentIndex = index;
  57. model.refresh();
  58. }
  59. Future<void> toBasicInfoRecordingPage(BuildContext context) async {
  60. await Navigator.of(context)
  61. .push(MaterialPageRoute(builder: (_) => BasicInfoRecordingPage()));
  62. }
  63. Future<void> toLifeInfoRecordingPage(BuildContext context) async {
  64. await Navigator.of(context)
  65. .push(MaterialPageRoute(builder: (_) => LifeInfoRecordingPage()));
  66. }
  67. Future<void> toExerciseInfoRecordingPage(BuildContext context) async {
  68. await Navigator.of(context)
  69. .push(MaterialPageRoute(builder: (_) => ExerciseInfoRecordingPage()));
  70. }
  71. Future<void> toStudyInfoRecordingPage(BuildContext context) async {
  72. await Navigator.of(context)
  73. .push(MaterialPageRoute(builder: (_) => StudyInfoRecordingPage()));
  74. }
  75. }
  76. // view
  77. class _HomePageView extends StatelessWidget {
  78. @override
  79. Widget build(BuildContext context) {
  80. HomePageService service =
  81. Provider.of<HomePageService>(context, listen: false);
  82. HomePageModel model = Provider.of<HomePageModel>(context, listen: true);
  83. UserProvider userProvider =
  84. Provider.of<UserProvider>(context, listen: true);
  85. return Scaffold(
  86. appBar: AppBar(
  87. title: Text("Home"),
  88. actions: userProvider.token == null
  89. ? []
  90. : <Widget>[
  91. Row(
  92. children: <Widget>[
  93. Text(
  94. "${userProvider.coins} x ",
  95. style: TextStyle(fontSize: 16),
  96. ),
  97. Icon(Icons.monetization_on),
  98. Text(" "),
  99. ],
  100. ),
  101. ],
  102. ),
  103. drawer: HomePageDrawer(),
  104. body: PageView(
  105. controller: model.pageViewController,
  106. onPageChanged: (index) => service.onPageChanged(context, index),
  107. physics: NeverScrollableScrollPhysics(),
  108. children: <Widget>[
  109. BasicInfoContext(),
  110. LifeInfoContext(),
  111. ExerciseInfoContext(),
  112. StudyInfoContext(),
  113. ],
  114. ),
  115. floatingActionButton: <Widget>[
  116. FloatingActionButton(
  117. child: Icon(Icons.playlist_add),
  118. onPressed: () => service.toBasicInfoRecordingPage(context),
  119. ),
  120. FloatingActionButton(
  121. child: Icon(Icons.playlist_add),
  122. onPressed: () => service.toLifeInfoRecordingPage(context),
  123. ),
  124. FloatingActionButton(
  125. child: Icon(Icons.playlist_add),
  126. onPressed: () => service.toExerciseInfoRecordingPage(context),
  127. ),
  128. FloatingActionButton(
  129. child: Icon(Icons.playlist_add),
  130. onPressed: () => service.toStudyInfoRecordingPage(context),
  131. ),
  132. ][model.currentIndex],
  133. bottomNavigationBar: BottomNavigationBar(
  134. currentIndex: model.currentIndex,
  135. onTap: (index) => service.changeNavigation(context, index),
  136. showUnselectedLabels: true,
  137. fixedColor: Theme.of(context).colorScheme.secondary,
  138. unselectedItemColor: Theme.of(context).unselectedWidgetColor,
  139. items: <BottomNavigationBarItem>[
  140. BottomNavigationBarItem(
  141. icon: Icon(Icons.accessibility), label: "基本信息"),
  142. BottomNavigationBarItem(icon: Icon(Icons.wb_sunny), label: "日常生活"),
  143. BottomNavigationBarItem(
  144. icon: Icon(Icons.directions_bike), label: "体育锻炼"),
  145. BottomNavigationBarItem(icon: Icon(Icons.school), label: "课程学习"),
  146. ],
  147. ),
  148. );
  149. }
  150. }