From f3b57bfe7ba702d4c048ab91a28dc95d0e8b876a Mon Sep 17 00:00:00 2001 From: guozhigq Date: Mon, 8 May 2023 12:46:48 +0800 Subject: [PATCH] =?UTF-8?q?mod:=20=E4=BD=BF=E7=94=A8PageView=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2IndexedStack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/hot/controller.dart | 7 +----- lib/pages/hot/view.dart | 46 ++++++++++++++++++++++++++--------- lib/pages/main/view.dart | 15 +++++++++--- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/lib/pages/hot/controller.dart b/lib/pages/hot/controller.dart index 0620ecf4..7f475c2d 100644 --- a/lib/pages/hot/controller.dart +++ b/lib/pages/hot/controller.dart @@ -11,12 +11,6 @@ class HotController extends GetxController { bool isLoadingMore = false; bool flag = false; - @override - void onInit() { - super.onInit(); - queryHotFeed('init'); - } - // 获取推荐 Future queryHotFeed(type) async { var res = await VideoHttp.hotVideoList( @@ -34,6 +28,7 @@ class HotController extends GetxController { _currentPage += 1; } isLoadingMore = false; + return res; } // 下拉刷新 diff --git a/lib/pages/hot/view.dart b/lib/pages/hot/view.dart index 29a0b177..3bddd37c 100644 --- a/lib/pages/hot/view.dart +++ b/lib/pages/hot/view.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:pilipala/common/skeleton/video_card_h.dart'; +import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/video_card_h.dart'; import 'package:pilipala/pages/hot/controller.dart'; import 'package:pilipala/pages/home/widgets/app_bar.dart'; @@ -14,6 +16,7 @@ class HotPage extends StatefulWidget { class _HotPageState extends State with AutomaticKeepAliveClientMixin { final HotController _hotController = Get.put(HotController()); List videoList = []; + Future? _futureBuilderFuture; @override bool get wantKeepAlive => true; @@ -21,11 +24,7 @@ class _HotPageState extends State with AutomaticKeepAliveClientMixin { @override void initState() { super.initState(); - _hotController.videoList.listen((value) { - videoList = value; - setState(() {}); - }); - + _futureBuilderFuture = _hotController!.queryHotFeed('init'); _hotController.scrollController.addListener( () { if (_hotController.scrollController.position.pixels >= @@ -52,12 +51,37 @@ class _HotPageState extends State with AutomaticKeepAliveClientMixin { controller: _hotController.scrollController, slivers: [ const HomeAppBar(), - SliverList( - delegate: SliverChildBuilderDelegate((context, index) { - return VideoCardH( - videoItem: videoList[index], - ); - }, childCount: videoList.length)), + FutureBuilder( + future: _futureBuilderFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + Map data = snapshot.data as Map; + if (data['status']) { + return Obx( + () => SliverList( + delegate: SliverChildBuilderDelegate((context, index) { + return VideoCardH( + videoItem: _hotController.videoList[index], + ); + }, childCount: _hotController.videoList.length), + ), + ); + } else { + return HttpError( + errMsg: data['msg'], + fn: () => setState(() {}), + ); + } + } else { + // 骨架屏 + return SliverList( + delegate: SliverChildBuilderDelegate((context, index) { + return const VideoCardHSkeleton(); + }, childCount: 5), + ); + } + }, + ), SliverToBoxAdapter( child: SizedBox( height: MediaQuery.of(context).padding.bottom + 10, diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index 89b952c0..e1503de8 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -15,11 +15,12 @@ class _MainAppState extends State with SingleTickerProviderStateMixin { final MainController _mainController = Get.put(MainController()); final HomeController _homeController = Get.put(HomeController()); final HotController _hotController = Get.put(HotController()); + PageController? _pageController; late AnimationController? _animationController; late Animation? _fadeAnimation; late Animation? _slideAnimation; - int selectedIndex = 2; + int selectedIndex = 0; int? _lastSelectTime; //上次点击时间 @override @@ -36,6 +37,7 @@ class _MainAppState extends State with SingleTickerProviderStateMixin { _slideAnimation = Tween(begin: 0.8, end: 1.0).animate(_animationController!); _lastSelectTime = DateTime.now().millisecondsSinceEpoch; + _pageController = PageController(initialPage: selectedIndex); } void setIndex(int value) async { @@ -47,7 +49,7 @@ class _MainAppState extends State with SingleTickerProviderStateMixin { }); setState(() {}); } - + _pageController!.jumpToPage(value); var currentPage = _mainController.pages[value]; if (currentPage is HomePage) { if (_homeController.flag) { @@ -98,8 +100,13 @@ class _MainAppState extends State with SingleTickerProviderStateMixin { reverseCurve: Curves.linear, ), ), - child: IndexedStack( - index: selectedIndex, + child: PageView( + controller: _pageController, + physics: const NeverScrollableScrollPhysics(), + onPageChanged: (index) { + selectedIndex = index; + setState(() {}); + }, children: _mainController.pages, ), ),