me_page.dart 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. import 'package:cs_resources/generated/assets.dart';
  2. import 'package:cs_resources/generated/l10n.dart';
  3. import 'package:cs_resources/theme/app_colors_theme.dart';
  4. import 'package:cs_resources/theme/theme_config.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:auto_route/auto_route.dart';
  7. import 'package:hooks_riverpod/hooks_riverpod.dart';
  8. import 'package:plugin_basic/provider/user_config/user_config_service.dart';
  9. import 'package:widgets/ext/ex_widget.dart';
  10. import 'package:widgets/my_appbar.dart';
  11. import 'package:widgets/my_load_image.dart';
  12. import 'package:widgets/my_text_view.dart';
  13. import 'package:widgets/shatter/setting_item_container.dart';
  14. import 'package:widgets/widget_export.dart';
  15. import 'me_view_model.dart';
  16. @RoutePage()
  17. class MePage extends HookConsumerWidget {
  18. const MePage({Key? key}) : super(key: key);
  19. @override
  20. Widget build(BuildContext context, WidgetRef ref) {
  21. final viewModel = ref.watch(meViewModelProvider.notifier);
  22. final userConfig = UserConfigService.getState(ref: ref);
  23. String totalAccountsCount = userConfig.user?.estates?.fold(0, (sum, estate) {
  24. return sum + (estate.accounts?.length ?? 0);
  25. }).toString() ?? "0";
  26. return Scaffold(
  27. appBar: MyAppBar.appBar(
  28. context,
  29. "",
  30. showBackButton: false,
  31. backgroundColor: context.appColors.btnBgDefault,
  32. systemUiOverlayStyle: MediaQuery.of(context).platformBrightness == Brightness.dark
  33. ? ThemeConfig.systemUiOverlayStyleDarkTheme
  34. : ThemeConfig.systemUiOverlayStyleLightThemeWhite,
  35. ),
  36. backgroundColor: context.appColors.backgroundDark,
  37. body: EasyRefresh(
  38. controller: viewModel.refreshController,
  39. header: const MaterialHeader(),
  40. onRefresh: viewModel.onRefresh,
  41. child: SingleChildScrollView(
  42. scrollDirection: Axis.vertical,
  43. child: SizedBox(
  44. width: double.infinity,
  45. child: Column(
  46. mainAxisSize: MainAxisSize.max,
  47. crossAxisAlignment: CrossAxisAlignment.center,
  48. children: [
  49. //顶部信息
  50. _buildTopProfile(context, ref),
  51. //关注与粉丝
  52. _buildFollower(context, ref),
  53. //我的发布
  54. SettingItemContainer(
  55. title: S.current.my_post,
  56. iconPath: Assets.mainMeMyPostIcon,
  57. isShowMoreIcon: true,
  58. rightWidget: MyTextView(
  59. userConfig.user?.postsCount ?? "0",
  60. textColor: context.appColors.textPrimary,
  61. fontSize: 20,
  62. isFontMedium: true,
  63. ),
  64. ).onTap(viewModel.gotoMyPostPage).marginOnly(top: 10),
  65. //家庭
  66. SettingItemContainer(
  67. title: S.current.household,
  68. iconPath: Assets.mainMeHouseholdIcon,
  69. isShowMoreIcon: true,
  70. rightWidget: MyTextView(
  71. userConfig.user?.households?.length.toString() ?? "0",
  72. textColor: context.appColors.textPrimary,
  73. fontSize: 20,
  74. isFontMedium: true,
  75. ),
  76. ).onTap(viewModel.gotoMyHouseholdPage),
  77. //房产
  78. SettingItemContainer(
  79. title: S.current.estate,
  80. iconPath: Assets.mainMeEstateIcon,
  81. isShowMoreIcon: true,
  82. rightWidget: MyTextView(
  83. userConfig.user?.estates?.fold(0, (sum, estate) {
  84. return sum + (estate.accounts?.length ?? 0);
  85. }).toString() ?? "0",
  86. textColor: context.appColors.textPrimary,
  87. fontSize: 20,
  88. isFontMedium: true,
  89. ),
  90. ).onTap(viewModel.gotoMyEstatePage),
  91. //设置
  92. SettingItemContainer(
  93. title: S.current.settings,
  94. iconPath: Assets.mainMeSettingIcon,
  95. isShowMoreIcon: true,
  96. ).onTap(viewModel.gotoSettingPage),
  97. ],
  98. ),
  99. ),
  100. ),
  101. ),
  102. );
  103. }
  104. //编辑顶部的关注与粉丝数量
  105. Widget _buildFollower(BuildContext context, WidgetRef ref) {
  106. final viewModel = ref.watch(meViewModelProvider.notifier);
  107. final userConfig = UserConfigService.getState(ref: ref);
  108. return Container(
  109. color: context.appColors.whiteSecondBG,
  110. width: double.infinity,
  111. height: 50,
  112. child: Row(
  113. children: [
  114. //关注
  115. Row(
  116. mainAxisSize: MainAxisSize.min,
  117. mainAxisAlignment: MainAxisAlignment.center,
  118. crossAxisAlignment: CrossAxisAlignment.center,
  119. children: [
  120. MyTextView(
  121. S.current.following,
  122. isFontBold: true,
  123. fontSize: 16,
  124. textColor: context.appColors.textBlack,
  125. ),
  126. MyTextView(
  127. "(${userConfig.user?.followsCount ?? "0"})",
  128. isFontBold: true,
  129. fontSize: 16,
  130. textColor: context.appColors.textPrimary,
  131. ),
  132. ],
  133. ).onTap(viewModel.gotoFollowingPage).expanded(),
  134. Container(
  135. width: 0.5,
  136. height: 50,
  137. color: context.appColors.dividerDefault,
  138. ),
  139. //粉丝
  140. Row(
  141. mainAxisSize: MainAxisSize.min,
  142. mainAxisAlignment: MainAxisAlignment.center,
  143. crossAxisAlignment: CrossAxisAlignment.center,
  144. children: [
  145. MyTextView(
  146. S.current.followers,
  147. isFontBold: true,
  148. fontSize: 16,
  149. textColor: context.appColors.textBlack,
  150. ),
  151. MyTextView(
  152. "(${userConfig.user?.flowersCount ?? "0"})",
  153. isFontBold: true,
  154. fontSize: 16,
  155. textColor: context.appColors.textPrimary,
  156. ),
  157. ],
  158. ).onTap(viewModel.gotoFollowerPage).expanded(),
  159. ],
  160. ),
  161. );
  162. }
  163. // 编辑顶部的个人信息
  164. Widget _buildTopProfile(BuildContext context, WidgetRef ref) {
  165. final viewModel = ref.watch(meViewModelProvider.notifier);
  166. final userConfig = UserConfigService.getState(ref: ref);
  167. return Container(
  168. color: context.appColors.btnBgDefault,
  169. width: double.infinity,
  170. padding: const EdgeInsets.only(left: 26, right: 20, top: 5),
  171. height: 120,
  172. child: Row(
  173. mainAxisSize: MainAxisSize.max,
  174. crossAxisAlignment: CrossAxisAlignment.start,
  175. children: [
  176. MyLoadImage(
  177. userConfig.user?.avatar,
  178. width: 80,
  179. height: 80,
  180. isCircle: true,
  181. ),
  182. Column(
  183. mainAxisSize: MainAxisSize.min,
  184. mainAxisAlignment: MainAxisAlignment.start,
  185. crossAxisAlignment: CrossAxisAlignment.start,
  186. children: [
  187. Row(
  188. children: [
  189. MyTextView(
  190. userConfig.user?.name ?? "-",
  191. textColor: Colors.white,
  192. fontSize: 18,
  193. isFontMedium: true,
  194. ).expanded(),
  195. const MyAssetImage(
  196. Assets.mainMeEditIcon,
  197. width: 20.5,
  198. height: 20,
  199. ).onTap(viewModel.gotoEditProfilePage, padding: 5),
  200. ],
  201. ),
  202. //电话
  203. MyTextView(
  204. "+${userConfig.user?.phone ?? "-"}",
  205. textColor: Colors.white,
  206. fontSize: 15,
  207. isFontRegular: true,
  208. ),
  209. //住宅
  210. MyTextView(
  211. userConfig.user?.defaultUnit?.address ?? "-",
  212. marginTop: 12,
  213. textColor: Colors.white,
  214. fontSize: 15,
  215. isFontRegular: true,
  216. ),
  217. ],
  218. ).marginOnly(left: 11).expanded(),
  219. ],
  220. ),
  221. );
  222. }
  223. }