video_recommend_list_page.dart 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. void _onVisibilityChanged(VisibilityInfo info) {
  32. final visible = info.visibleFraction > 0.5; // 页面超过一半可见就算“可见”
  33. if (_isVisible != visible) {
  34. setState(() {
  35. _isVisible = visible;
  36. });
  37. }
  38. if (visible) {
  39. // 页面可见时恢复播放
  40. consoleLog("页面可见");
  41. } else {
  42. // 页面不可见时暂停播放
  43. consoleLog("页面不可见");
  44. }
  45. }
  46. @override
  47. Widget build(BuildContext context) {
  48. super.build(context);
  49. final videos = ref.watch(recommendListProvider);
  50. return VisibilityDetector(
  51. key: const Key("value"),
  52. onVisibilityChanged: _onVisibilityChanged,
  53. child: Padding(
  54. padding: EdgeInsets.symmetric(
  55. horizontal: horizontalPadding,
  56. vertical: horizontalPadding,
  57. ),
  58. child: PageView(
  59. pageSnapping: true,
  60. scrollDirection: Axis.vertical,
  61. children: List.generate(videos.length, (index) {
  62. return VideoPlayItemWidget(
  63. item: videos[index],
  64. isActive: _isVisible,
  65. );
  66. }),
  67. ),
  68. ),
  69. );
  70. }
  71. @override
  72. bool get wantKeepAlive => true;
  73. }