news_provider.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import 'package:connectivity_plus/connectivity_plus.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:news_app/http/http_util.dart';
  4. import 'package:news_app/http/model_parser.dart';
  5. import 'package:news_app/ui/news/main_news_page.dart';
  6. import 'package:news_app/util/log.util.dart';
  7. import '../constant/api_const.dart';
  8. import '../model/activity_banner_model.dart';
  9. import '../model/news_data_model.dart';
  10. import 'network_provider.dart';
  11. class NewsNotifier extends FamilyNotifier<NewsState, int> {
  12. int tabIndex = 0;
  13. bool _hasConnectedOnce = false;
  14. @override
  15. NewsState build(int index) {
  16. tabIndex = index;
  17. // 监听网络变化,在首次联网时触发加载
  18. ref.listen<AsyncValue<List<ConnectivityResult>>>(connectivityProvider, (
  19. previous,
  20. next,
  21. ) {
  22. final results = next.asData?.value ?? [];
  23. final hasNetwork =
  24. results.isNotEmpty && !results.contains(ConnectivityResult.none);
  25. if (hasNetwork && !_hasConnectedOnce) {
  26. _hasConnectedOnce = true;
  27. fetchBannerList();
  28. fetchNewsItemList(1);
  29. }
  30. });
  31. return NewsState(bannerList: [], newsDataModel: NewsDataModel());
  32. }
  33. Future<void> fetchBannerList() async {
  34. final model = ref.read(newsCategoryProvider)[tabIndex];
  35. consoleLog(model.name);
  36. final jsonData = await HttpUtil().get(
  37. apiBannerList,
  38. queryParameters: {"type": "", "categoryId": model.catalogId},
  39. );
  40. final bannerData = ModelParser.parseList(
  41. jsonData,
  42. ActivityBannerModel.fromJson,
  43. );
  44. state = state.copyWith(bannerList: bannerData);
  45. }
  46. Future<void> fetchNewsItemList(int pageNum) async {
  47. final model = ref.read(newsCategoryProvider)[tabIndex];
  48. consoleLog(model.name);
  49. final jsonData = await HttpUtil().get(
  50. apiNewsList,
  51. queryParameters: {
  52. "cid": model.catalogId,
  53. "sid": model.siteId,
  54. "pp": "",
  55. "text": "true",
  56. "pageNum": pageNum.toString(),
  57. "pageSize": 10,
  58. },
  59. );
  60. final response = ModelParser.parseObject(jsonData, NewsDataModel.fromJson);
  61. final oldRecords = state.newsDataModel.records ?? [];
  62. state = state.copyWith(
  63. newsDataModel: response.copyWith(
  64. total: response.total,
  65. size: response.size,
  66. current: response.current,
  67. pages: response.pages,
  68. records:
  69. pageNum == 1
  70. ? response.records
  71. : [...oldRecords, ...?response.records],
  72. ),
  73. );
  74. }
  75. }
  76. class NewsState {
  77. final List<ActivityBannerModel> bannerList;
  78. final NewsDataModel newsDataModel;
  79. NewsState({required this.bannerList, required this.newsDataModel});
  80. NewsState copyWith({
  81. List<ActivityBannerModel>? bannerList,
  82. NewsDataModel? newsDataModel,
  83. }) {
  84. return NewsState(
  85. bannerList: bannerList ?? this.bannerList,
  86. newsDataModel: newsDataModel ?? this.newsDataModel,
  87. );
  88. }
  89. }