import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:news_app/http/http_util.dart'; import 'package:news_app/http/model_parser.dart'; import 'package:news_app/ui/news/main_news_page.dart'; import 'package:news_app/util/log.util.dart'; import '../constant/api_const.dart'; import '../model/activity_banner_model.dart'; import '../model/news_data_model.dart'; import 'network_provider.dart'; class NewsNotifier extends FamilyNotifier { int tabIndex = 0; bool _hasConnectedOnce = false; @override NewsState build(int index) { tabIndex = index; // 监听网络变化,在首次联网时触发加载 ref.listen>>(connectivityProvider, ( previous, next, ) { final results = next.asData?.value ?? []; final hasNetwork = results.isNotEmpty && !results.contains(ConnectivityResult.none); if (hasNetwork && !_hasConnectedOnce) { _hasConnectedOnce = true; fetchBannerList(); fetchNewsItemList(1); } }); return NewsState(bannerList: [], newsDataModel: NewsDataModel()); } Future fetchBannerList() async { final model = ref.read(newsCategoryProvider)[tabIndex]; consoleLog(model.name); final jsonData = await HttpUtil().get( apiBannerList, queryParameters: {"type": "", "categoryId": model.catalogId}, ); final bannerData = ModelParser.parseList( jsonData, ActivityBannerModel.fromJson, ); state = state.copyWith(bannerList: bannerData); } Future fetchNewsItemList(int pageNum) async { final model = ref.read(newsCategoryProvider)[tabIndex]; consoleLog(model.name); final jsonData = await HttpUtil().get( apiNewsList, queryParameters: { "cid": model.catalogId, "sid": model.siteId, "pp": "", "text": "true", "pageNum": pageNum.toString(), "pageSize": 10, }, ); final response = ModelParser.parseObject(jsonData, NewsDataModel.fromJson); final oldRecords = state.newsDataModel.records ?? []; state = state.copyWith( newsDataModel: response.copyWith( total: response.total, size: response.size, current: response.current, pages: response.pages, records: pageNum == 1 ? response.records : [...oldRecords, ...?response.records], ), ); } } class NewsState { final List bannerList; final NewsDataModel newsDataModel; NewsState({required this.bannerList, required this.newsDataModel}); NewsState copyWith({ List? bannerList, NewsDataModel? newsDataModel, }) { return NewsState( bannerList: bannerList ?? this.bannerList, newsDataModel: newsDataModel ?? this.newsDataModel, ); } }