activity_search_page.dart 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import 'package:easy_refresh/easy_refresh.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_riverpod/flutter_riverpod.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:go_router/go_router.dart';
  6. import 'package:news_app/extension/base.dart';
  7. import 'package:news_app/model/activity_model.dart';
  8. import 'package:news_app/provider/activity_search_provider.dart';
  9. import '../../constant/color_res.dart';
  10. import '../../constant/size_res.dart';
  11. import '../../widget/load_image.dart';
  12. import '../../widget/my_txt.dart';
  13. import '../activity/activity_card_widget.dart';
  14. final searchProvider = NotifierProvider<ActivitySearchProvider, ActivitySearchData>(
  15. () => ActivitySearchProvider(),
  16. );
  17. class ActivitySearchPage extends ConsumerStatefulWidget {
  18. const ActivitySearchPage({super.key});
  19. @override
  20. ConsumerState<ActivitySearchPage> createState() => _ActivitySearchPageState();
  21. }
  22. class _ActivitySearchPageState extends ConsumerState<ActivitySearchPage> {
  23. int pageNum = 0;
  24. String keyword = '';
  25. int total = 0;
  26. final TextEditingController _searchController = TextEditingController();
  27. @override
  28. void initState() {
  29. // TODO: implement initState
  30. super.initState();
  31. ref.read(searchProvider.notifier)
  32. .fetchActivityHotWord("activity");
  33. }
  34. @override
  35. void dispose() {
  36. _searchController.dispose();
  37. // TODO: implement dispose
  38. super.dispose();
  39. }
  40. @override
  41. Widget build(BuildContext context) {
  42. final result = ref.watch(searchProvider);
  43. ref.listen(searchProvider, (pre, next) {
  44. total = next.searchModel?.rows?.length ?? 0;
  45. });
  46. return Scaffold(
  47. appBar: AppBar(
  48. scrolledUnderElevation: 0,
  49. title: SizedBox(
  50. height: 40.h,
  51. child: TextField(
  52. controller: _searchController,
  53. textInputAction: TextInputAction.search,
  54. decoration: InputDecoration(
  55. hintText: '输入您想搜索的内容',
  56. hintStyle: TextStyle(color: color001842, fontSize: 16),
  57. border: OutlineInputBorder(
  58. borderRadius: BorderRadius.circular(30.r),
  59. borderSide: BorderSide.none,
  60. ),
  61. filled: true,
  62. prefixIcon: Icon(Icons.search, color: color66748E),
  63. fillColor: colorF9F9F9,
  64. contentPadding: EdgeInsets.zero,
  65. ),
  66. style: TextStyle(color: color333333, fontSize: 16),
  67. cursorColor: color333333,
  68. onSubmitted: (value) {
  69. keyword = value;
  70. if (keyword.isNotEmpty) {
  71. ref.read(searchProvider.notifier).fetchSearch(keyword, 0);
  72. }
  73. },
  74. ),
  75. ),
  76. ),
  77. body: EasyRefresh.builder(
  78. onLoad: () async {
  79. if (total >= (result.searchModel?.total ?? 0).safeValue) {
  80. return IndicatorResult.noMore;
  81. } else {
  82. pageNum++;
  83. await ref
  84. .read(searchProvider.notifier)
  85. .fetchSearch(keyword, pageNum);
  86. return IndicatorResult.success;
  87. }
  88. },
  89. childBuilder: (context, py) {
  90. return CustomScrollView(
  91. physics:py,
  92. slivers: [
  93. SliverToBoxAdapter(
  94. child: Padding(
  95. padding: EdgeInsets.symmetric(
  96. horizontal: horizontalPadding,
  97. vertical: horizontalPadding+6.h,
  98. ),
  99. child: Row(
  100. crossAxisAlignment: CrossAxisAlignment.center,
  101. // mainAxisAlignment: MainAxisAlignment.center,
  102. children: [
  103. LoadAssetImage('search_hot',width: 12.w,height: 12.h,),
  104. SizedBox(width: 2.w,),
  105. myTxt(
  106. text: "热门搜索",
  107. color: Colors.black,
  108. fontWeight: FontWeight.bold,
  109. fontSize: 14.sp,
  110. ),
  111. ],
  112. ),
  113. ),
  114. ),
  115. SliverPadding(
  116. padding: EdgeInsets.symmetric(
  117. horizontal: horizontalPadding,
  118. ),
  119. sliver: SliverGrid.count(
  120. crossAxisCount: 2,
  121. mainAxisSpacing: 10.w,
  122. crossAxisSpacing: 10.w,
  123. childAspectRatio: 1 / 0.1,
  124. children: [
  125. ...List.generate(
  126. (result.hotWords).length,
  127. (index) {
  128. return GestureDetector(
  129. onTap: (){
  130. pageNum = 0;
  131. keyword = result.hotWords[index].word ?? '';
  132. _searchController.text = keyword;
  133. ref.read(searchProvider.notifier)
  134. .fetchSearch(keyword, pageNum);
  135. },
  136. child: myTxt(
  137. text: result.hotWords[index].word ?? '',
  138. color: Colors.black,
  139. fontWeight: FontWeight.normal,
  140. fontSize: 14.sp,
  141. ),
  142. );
  143. },
  144. ),
  145. ],
  146. ),
  147. ),
  148. SliverPadding(
  149. padding: EdgeInsets.all(horizontalPadding),
  150. sliver: SliverList.separated(
  151. separatorBuilder: (context, index) {
  152. return SizedBox(height: 10.h);
  153. },
  154. itemBuilder: (context, index) {
  155. return GestureDetector(
  156. onTap: (){
  157. context.push(
  158. "/activity/detail",
  159. extra: result.searchModel?.rows?[index]?.contentId ?? '',
  160. );
  161. },
  162. child: ActivityCardWidget(cellData:result.searchModel?.rows?[index] ?? ActivityModelRecord()));
  163. },
  164. itemCount: result.searchModel?.rows?.length ?? 0,
  165. ),
  166. ),
  167. ],
  168. );
  169. // ListView.separated(
  170. // padding: EdgeInsets.all(horizontalPadding),
  171. // separatorBuilder: (context, index) {
  172. // return Container(height: 10.h);
  173. // },
  174. // physics: py,
  175. // itemBuilder: (context, index) {
  176. // return ActivityCardWidget(cellData:result.searchModel?.rows?[index] ?? ActivityModelRecord());
  177. // },
  178. // itemCount: result.searchModel?.rows?.length ?? 0,
  179. // );
  180. },
  181. ),
  182. );
  183. }
  184. }