| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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<VideoRecommendListPage> createState() =>
- _VideoRecommendListPageState();
- }
- final recommendListProvider =
- NotifierProvider<VideoRecommendProvider, List<VideoNewModel>>(() {
- return VideoRecommendProvider();
- });
- class _VideoRecommendListPageState extends ConsumerState<VideoRecommendListPage>
- 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;
- }
|