video_recommend_list_page.dart 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:news_app/constant/size_res.dart';
  4. import 'package:news_app/ui/video/video_play_item_widget.dart';
  5. import 'package:news_app/util/log.util.dart';
  6. import 'package:visibility_detector/visibility_detector.dart';
  7. import '../../model/video_new_model.dart';
  8. import '../../provider/video_commend_provider.dart';
  9. /// @author: bo.zeng
  10. /// @email: cnhbwds@gmail.com
  11. /// @date: 2025 2025/4/9 16:00
  12. /// @description:
  13. class VideoRecommendListPage extends ConsumerStatefulWidget {
  14. const VideoRecommendListPage({super.key});
  15. @override
  16. ConsumerState<VideoRecommendListPage> createState() =>
  17. _VideoRecommendListPageState();
  18. }
  19. final recommendListProvider =
  20. NotifierProvider<VideoRecommendProvider, List<VideoNewModel>>(() {
  21. return VideoRecommendProvider();
  22. });
  23. class _VideoRecommendListPageState extends ConsumerState<VideoRecommendListPage>
  24. with AutomaticKeepAliveClientMixin {
  25. @override
  26. void initState() {
  27. super.initState();
  28. ref.read(recommendListProvider.notifier).fetchRecommendVideos();
  29. }
  30. bool _isVisible = false;
  31. int _currentPage = 0;
  32. void _onVisibilityChanged(VisibilityInfo info) {
  33. final visible = info.visibleFraction > 0.5;
  34. if (_isVisible != visible) {
  35. setState(() {
  36. _isVisible = visible;
  37. });
  38. }
  39. consoleLog("VideoRecommendListPage: visibility changed, visible: $visible, currentPage: $_currentPage");
  40. }
  41. void _onPageChanged(int page) {
  42. setState(() {
  43. _currentPage = page;
  44. });
  45. consoleLog("VideoRecommendListPage: page changed to $page");
  46. }
  47. @override
  48. Widget build(BuildContext context) {
  49. super.build(context);
  50. final videos = ref.watch(recommendListProvider);
  51. return VisibilityDetector(
  52. key: const Key("value"),
  53. onVisibilityChanged: _onVisibilityChanged,
  54. child: Padding(
  55. padding: EdgeInsets.symmetric(
  56. horizontal: horizontalPadding,
  57. vertical: horizontalPadding,
  58. ),
  59. child: PageView.builder(
  60. onPageChanged: _onPageChanged,
  61. scrollDirection: Axis.vertical,
  62. itemCount: videos.length,
  63. itemBuilder: (context, index) {
  64. return VideoPlayItemWidget(
  65. key: ValueKey(videos[index].contentId),
  66. item: videos[index],
  67. isActive: _isVisible && index == _currentPage,
  68. );
  69. },
  70. ),
  71. ),
  72. );
  73. }
  74. @override
  75. bool get wantKeepAlive => true;
  76. }