import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:news_app/constant/size_res.dart'; import 'package:news_app/ui/video/video_play_item_widget.dart'; import 'package:news_app/util/log.util.dart'; import 'package:visibility_detector/visibility_detector.dart'; import '../../model/video_new_model.dart'; import '../../provider/video_commend_provider.dart'; /// @author: bo.zeng /// @email: cnhbwds@gmail.com /// @date: 2025 2025/4/9 16:00 /// @description: class VideoRecommendListPage extends ConsumerStatefulWidget { const VideoRecommendListPage({super.key}); @override ConsumerState createState() => _VideoRecommendListPageState(); } final recommendListProvider = NotifierProvider>(() { return VideoRecommendProvider(); }); class _VideoRecommendListPageState extends ConsumerState with AutomaticKeepAliveClientMixin { @override void initState() { super.initState(); ref.read(recommendListProvider.notifier).fetchRecommendVideos(); } bool _isVisible = false; int _currentPage = 0; void _onVisibilityChanged(VisibilityInfo info) { final visible = info.visibleFraction > 0.5; if (_isVisible != visible) { setState(() { _isVisible = visible; }); } consoleLog("VideoRecommendListPage: visibility changed, visible: $visible, currentPage: $_currentPage"); } void _onPageChanged(int page) { setState(() { _currentPage = page; }); consoleLog("VideoRecommendListPage: page changed to $page"); } @override Widget build(BuildContext context) { super.build(context); final videos = ref.watch(recommendListProvider); return VisibilityDetector( key: const Key("value"), onVisibilityChanged: _onVisibilityChanged, child: Padding( padding: EdgeInsets.symmetric( horizontal: horizontalPadding, vertical: horizontalPadding, ), child: PageView.builder( onPageChanged: _onPageChanged, scrollDirection: Axis.vertical, itemCount: videos.length, itemBuilder: (context, index) { return VideoPlayItemWidget( key: ValueKey(videos[index].contentId), item: videos[index], isActive: _isVisible && index == _currentPage, ); }, ), ), ); } @override bool get wantKeepAlive => true; }