search_provider.dart 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import 'package:news_app/extension/base.dart';
  3. import 'package:news_app/model/hot_word_model.dart';
  4. import '../constant/api_const.dart';
  5. import '../http/http_util.dart';
  6. import '../http/model_parser.dart';
  7. import '../model/news_data_model.dart';
  8. class SearchProvider extends Notifier<SearchData> {
  9. @override
  10. SearchData build() {
  11. return SearchData();
  12. }
  13. Future<void>fetchArticleHotWord(String type) async{
  14. var jsonData = await HttpUtil().get(
  15. apiHotWord,
  16. queryParameters: {"q": type},
  17. );
  18. final newList = ModelParser.parseList<HotWordModel>(
  19. jsonData,
  20. HotWordModel.fromJson,
  21. );
  22. state = state.copyWith(hotWords: newList);
  23. }
  24. Future<void> fetchSearch(String keyword, int pageNum) async {
  25. final jsonData = await HttpUtil().get(
  26. apiSearch,
  27. queryParameters: {
  28. "q": keyword,
  29. "pageSize": 10.toString(),
  30. "pageNum": pageNum.toString(),
  31. },
  32. );
  33. final response = ModelParser.parseObject<SearchModel>(
  34. jsonData,
  35. SearchModel.fromJson,
  36. );
  37. if (pageNum == 0) {
  38. state = state.copyWith(searchModel: response);
  39. } else {
  40. //把新的列表添加到旧的列表中
  41. state = state.copyWith(searchModel: SearchModel(
  42. total: response.total,
  43. rows: [...state.searchModel?.rows ?? [], ...response.rows ?? []],
  44. ));
  45. }
  46. }
  47. }
  48. class SearchData{
  49. final SearchModel? searchModel;
  50. final List<HotWordModel> hotWords;
  51. SearchData({
  52. this.searchModel,
  53. this.hotWords = const [],
  54. });
  55. SearchData copyWith({
  56. SearchModel? searchModel,
  57. List<HotWordModel>? hotWords,
  58. }){
  59. return SearchData(
  60. searchModel:searchModel ?? this.searchModel,
  61. hotWords:hotWords ?? this.hotWords,
  62. );
  63. }
  64. }
  65. class SearchModel {
  66. List<NewsRecord?>? rows;
  67. int? total;
  68. SearchModel({this.rows, this.total});
  69. SearchModel.fromJson(Map<String, dynamic> json) {
  70. if (json['rows'] != null) {
  71. final v = json['rows'];
  72. final arr0 = <NewsRecord>[];
  73. v.forEach((v) {
  74. arr0.add(NewsRecord.fromJson(v));
  75. });
  76. rows = arr0;
  77. }
  78. total = json['total']?.toString().convertInt;
  79. }
  80. Map<String, dynamic> toJson() {
  81. final data = <String, dynamic>{};
  82. if (rows != null) {
  83. final v = rows;
  84. final arr0 = [];
  85. for (var v in v!) {
  86. arr0.add(v!.toJson());
  87. }
  88. data['rows'] = arr0;
  89. }
  90. data['total'] = total;
  91. return data;
  92. }
  93. }