基础组件库
 
 
 
 
 

191 lines
5.2 KiB

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/services.dart';
  3. import 'package:zhiying_base_widget/pages/search_page/notifier/search_tag_notifier.dart';
  4. import 'package:zhiying_base_widget/pages/search_think_page/bloc/search_think_bloc.dart';
  5. import 'package:zhiying_base_widget/pages/search_think_page/bloc/search_think_repository.dart';
  6. import 'package:zhiying_comm/zhiying_comm.dart';
  7. import 'package:flutter_bloc/flutter_bloc.dart';
  8. import 'package:provider/provider.dart';
  9. import 'bloc/search_bloc.dart';
  10. import 'bloc/search_repository.dart';
  11. ///
  12. /// 搜索页
  13. ///
  14. class SearchPage extends StatelessWidget {
  15. final Map<String, dynamic> data;
  16. SearchPage(this.data, {Key key}) : super(key: key);
  17. @override
  18. Widget build(BuildContext context) {
  19. Logger.log("数据: "+data.toString());
  20. return MultiProvider(
  21. providers: [
  22. ChangeNotifierProvider.value(value: SearchTagNotifier())
  23. ],
  24. child: MultiProvider(
  25. providers: [
  26. /// 搜索页面的bloc
  27. BlocProvider<SearchBloc>(
  28. create: (_) => SearchBloc(repository: SearchRepository())..add(SearchInitEvent(model: data)),
  29. ),
  30. /// 输入框联想的bloc
  31. BlocProvider<SearchThinkBloc>(
  32. create: (_)=> SearchThinkBloc(SearchThinkRepository()),
  33. ),
  34. ],
  35. child: SearchPageContianer(),
  36. ),
  37. // child: BlocProvider<SearchBloc>(
  38. // create: (_) => SearchBloc(repository: SearchRepository())..add(SearchInitEvent(model: data)),
  39. // child: SearchPageContianer(),
  40. // ),
  41. );
  42. }
  43. }
  44. class SearchPageContianer extends StatefulWidget {
  45. @override
  46. _SearchPageContianerState createState() => _SearchPageContianerState();
  47. }
  48. class _SearchPageContianerState extends State<SearchPageContianer> {
  49. /// tab轮播
  50. TabController _tabController;
  51. @override
  52. void initState() {
  53. _tabController = TabController(length: 6, vsync: ScrollableState());
  54. super.initState();
  55. }
  56. @override
  57. void dispose() {
  58. _tabController?.dispose();
  59. super.dispose();
  60. }
  61. @override
  62. Widget build(BuildContext context) {
  63. return MediaQuery.removePadding(
  64. removeTop: true,
  65. context: context,
  66. child: Container(
  67. width: double.infinity,
  68. child: BlocConsumer<SearchBloc, SearchState>(
  69. listener: (BuildContext context, SearchState state) {
  70. if (state is SearchErrorState) {
  71. print('数据加载出错');
  72. }
  73. },
  74. buildWhen: (previous, current) {
  75. /// 数据加载出错不进行build
  76. if (current is SearchErrorState) {
  77. return false;
  78. }
  79. /// 搜索成功,跳转结果页面
  80. if (current is SearchSubmitSuccessState) {
  81. return false;
  82. }
  83. /// 搜索失败,不进行build
  84. if (current is SearchSubmitErrorState) {
  85. return false;
  86. }
  87. return true;
  88. },
  89. builder: (context, state) {
  90. print('currente state = $state');
  91. if (state is SearchLoadedState) {
  92. return _getMainWidget(state?.model);
  93. }
  94. /// 骨架屏幕
  95. return _getMainWidget(null);
  96. },
  97. ),
  98. ),
  99. );
  100. }
  101. /// 主视图
  102. Widget _getMainWidget(List<Map<String, dynamic>> datas) {
  103. return AnnotatedRegion<SystemUiOverlayStyle>(
  104. value: SystemUiOverlayStyle.dark,
  105. child: Scaffold(
  106. backgroundColor: Colors.white,
  107. body: Listener(
  108. onPointerDown: (down) => RouterUtil.hideKeyboard(context),
  109. child: Column(
  110. children: _createContentWidget(datas),
  111. ),
  112. ),
  113. ),
  114. );
  115. }
  116. List<Widget> _createContentWidget(List<Map<String, dynamic>> datas) {
  117. List<Widget> list = [];
  118. int length = datas?.length ?? 0;
  119. if (length <= 0) {
  120. /// 骨架屏幕?
  121. list.add(Container(
  122. height: 200,
  123. width: double.infinity,
  124. color: Colors.white,
  125. // child: Center(
  126. // child: Text('暂时无数据哦~'),
  127. // ),
  128. ));
  129. } else {
  130. for (int i = 0; i < datas.length; i++) {
  131. WidgetModel item = WidgetModel.fromJson(Map<String, dynamic>.from(datas[i]));
  132. print('item.modName ${item.modName}');
  133. list.addAll(WidgetFactory.create(
  134. item.modName,
  135. isSliver: false,
  136. model: datas[i],
  137. ));
  138. }
  139. }
  140. return list;
  141. }
  142. // List<Widget> _createContent(BuildContext context, List<Map<String, dynamic>> datas) {
  143. // List<Widget> list = List();
  144. //
  145. // int length = datas?.length ?? 0;
  146. //
  147. // if (length <= 0) {
  148. // list.add(SliverToBoxAdapter(
  149. // child: Container(
  150. // height: 200,
  151. // child: Center(
  152. // child: Text('暂时无数据哦~'),
  153. // ),
  154. // ),
  155. // ));
  156. // return list;
  157. // }
  158. //
  159. // for (int i = 0; i < 3; i++) {
  160. // WidgetModel item = WidgetModel.fromJson(Map<String, dynamic>.from(datas[i]));
  161. // print('item.modName ${item.modName}');
  162. // list.addAll(WidgetFactory.create(
  163. // item.modName,
  164. // isSliver: true,
  165. // model: datas[i],
  166. // ));
  167. // }
  168. //
  169. // return list;
  170. // }
  171. }