基础组件库

team_page.dart 6.3 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:tab_indicator_styler/tab_indicator_styler.dart';
  4. import 'package:zhiying_base_widget/pages/team_page/bloc/team_bloc.dart';
  5. import 'package:zhiying_base_widget/pages/team_page/bloc/team_repository.dart';
  6. import 'package:zhiying_base_widget/pages/team_page/model/team_data_model.dart';
  7. import 'package:zhiying_base_widget/pages/team_page/model/team_style_model.dart';
  8. import 'package:zhiying_base_widget/widgets/team/appbar/team_app_bar_widget.dart';
  9. import 'package:zhiying_base_widget/widgets/team/data/team_data_widet.dart';
  10. import 'package:zhiying_base_widget/widgets/team/fans_list/team_fans_widget.dart';
  11. import 'package:zhiying_base_widget/widgets/team/filter/team_filter_widget.dart';
  12. import 'package:zhiying_base_widget/widgets/team/input/team_input_widget.dart';
  13. import 'package:zhiying_base_widget/widgets/team/recommend/team_recommend_widget.dart';
  14. import 'package:zhiying_comm/util/custom_sliver_persistent_header_delegate.dart';
  15. import 'package:zhiying_comm/zhiying_comm.dart';
  16. import 'dart:ui';
  17. import 'package:flutter_bloc/flutter_bloc.dart';
  18. import 'team_page_sk.dart';
  19. ///
  20. /// 我的团队
  21. ///
  22. class TeamPage extends StatelessWidget {
  23. final Map<String, dynamic> data;
  24. const TeamPage(this.data);
  25. @override
  26. Widget build(BuildContext context) {
  27. return BlocProvider<TeamBloc>(
  28. create: (_) => TeamBloc(repository: TeamRepository())..add(TeamInitEvent(data)),
  29. child: _TeamPageContainer(),
  30. );
  31. }
  32. }
  33. class _TeamPageContainer extends StatefulWidget {
  34. @override
  35. _TeamPageContainerState createState() => _TeamPageContainerState();
  36. }
  37. class _TeamPageContainerState extends State<_TeamPageContainer> {
  38. @override
  39. Widget build(BuildContext context) {
  40. return BlocConsumer<TeamBloc, TeamState>(
  41. listener: (context, state) {},
  42. buildWhen: (prov, current) {
  43. if (current is TeamErrorState) {
  44. return false;
  45. }
  46. return true;
  47. },
  48. builder: (context, state) {
  49. print('TeamPage state === $state');
  50. if (state is TeamLoadedState) {
  51. _initTabController(state?.styleModel);
  52. return _getMainWidget(state.styleModel, state.dataModel);
  53. }
  54. /// 骨架屏幕
  55. return TeamPageSkeleton();
  56. },
  57. );
  58. }
  59. var tabTitle = [
  60. '全部1',
  61. '达人1',
  62. '超级达人',
  63. '运营商1',
  64. ];
  65. TabController _controller;
  66. @override
  67. void initState() {
  68. // _controller = TabController(length: tabTitle.length, vsync: ScrollableState());
  69. super.initState();
  70. }
  71. void _initTabController(TeamStyleModel styleModel) {
  72. if (null == _controller) {
  73. _controller = TabController(length: styleModel?.userLvTabs?.length ?? 0, vsync: ScrollableState());
  74. }
  75. }
  76. @override
  77. void dispose() {
  78. _controller?.dispose();
  79. super.dispose();
  80. }
  81. /// 主体视图
  82. Widget _getMainWidget(TeamStyleModel styleModel, TeamDataModel dataModel) {
  83. return Scaffold(
  84. resizeToAvoidBottomPadding: false,
  85. resizeToAvoidBottomInset: false,
  86. backgroundColor: HexColor.fromHex(styleModel?.bgColor ?? '#F9F9F9'),
  87. body: NestedScrollView(
  88. headerSliverBuilder: (context, bool) {
  89. return [
  90. /// 头部Bar
  91. TeamAppBarWidget(styleModel),
  92. /// 我的推荐人
  93. SliverToBoxAdapter(child: TeamRecommendWidget(styleModel, dataModel)),
  94. /// 数据
  95. SliverToBoxAdapter(child: TeamDataWidget(styleModel, dataModel)),
  96. /// 间距
  97. SliverToBoxAdapter(child: SizedBox(height: 8)),
  98. /// 输入框
  99. SliverPersistentHeader(delegate: CustomSliverPersistentHeaderDelegate(min: 34, max: 34, child: TeamInputWidget(styleModel)), pinned: true),
  100. /// 悬停TabBar
  101. SliverPersistentHeader(
  102. delegate: new _SliverTabBarDelegate(
  103. tabBar: TabBar(
  104. isScrollable: false,
  105. labelStyle: TextStyle(fontWeight: FontWeight.bold, fontSize: 13),
  106. unselectedLabelStyle: TextStyle(fontSize: 13),
  107. indicator: MaterialIndicator(
  108. height: 2,
  109. topLeftRadius: 8,
  110. topRightRadius: 8,
  111. bottomLeftRadius: 8,
  112. bottomRightRadius: 8,
  113. color: HexColor.fromHex(styleModel?.userLvTabsLineColor ?? '#F94B47'),
  114. horizontalPadding: 30,
  115. ),
  116. controller: _controller,
  117. // tabs: tabTitle.map((f) => Tab(text: f)).toList(),
  118. tabs: styleModel.userLvTabs
  119. .map((item) => Tab(
  120. text: item.name,
  121. ))
  122. .toList(),
  123. indicatorColor: Colors.red,
  124. unselectedLabelColor: HexColor.fromHex(styleModel?.userLvTabsNameColor ?? '#999999'),
  125. labelColor: HexColor.fromHex(styleModel?.userLvTabsNameSelectedColor ?? '#000000'),
  126. ),
  127. ),
  128. pinned: true,
  129. ),
  130. /// 筛选条件
  131. SliverPersistentHeader(delegate: CustomSliverPersistentHeaderDelegate(max: 32.5, min: 32.5, child: TeamFilterWidget(styleModel)), pinned: true),
  132. ];
  133. },
  134. body: MediaQuery.removePadding(
  135. removeTop: true,
  136. context: context,
  137. // child: TabBarView(controller: _controller, children: tabTitle.map((s) => TeamFansWidget(styleModel)).toList()),
  138. child: TabBarView(
  139. controller: _controller,
  140. children: styleModel.userLvTabs.map((item) => TeamFansWidget(styleModel, item.type)).toList(),
  141. ),
  142. ),
  143. ),
  144. );
  145. }
  146. }
  147. class _SliverTabBarDelegate extends SliverPersistentHeaderDelegate {
  148. final TabBar tabBar;
  149. const _SliverTabBarDelegate({this.tabBar}) : assert(tabBar != null);
  150. @override
  151. Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
  152. return Container(
  153. color: Colors.white,
  154. child: tabBar,
  155. );
  156. }
  157. @override
  158. bool shouldRebuild(_SliverTabBarDelegate oldDelegate) {
  159. return false;
  160. }
  161. @override
  162. double get maxExtent => tabBar.preferredSize.height;
  163. @override
  164. double get minExtent => tabBar.preferredSize.height;
  165. }