diff --git a/lib/common/widgets/live_card.dart b/lib/common/widgets/live_card.dart index 8c19b3db..01d0bf32 100644 --- a/lib/common/widgets/live_card.dart +++ b/lib/common/widgets/live_card.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart'; -import 'package:pilipala/pages/rcmd/controller.dart'; import 'package:pilipala/utils/utils.dart'; class LiveCard extends StatelessWidget { @@ -95,7 +93,7 @@ class LiveContent extends StatelessWidget { liveItem.title, textAlign: TextAlign.start, style: const TextStyle(fontSize: 13, fontWeight: FontWeight.w500), - maxLines: Get.find().crossAxisCount, + maxLines: 2, overflow: TextOverflow.ellipsis, ), SizedBox( diff --git a/lib/common/widgets/video_card_v.dart b/lib/common/widgets/video_card_v.dart index c15f4100..4477ad11 100644 --- a/lib/common/widgets/video_card_v.dart +++ b/lib/common/widgets/video_card_v.dart @@ -14,8 +14,7 @@ import 'package:pilipala/common/widgets/network_img_layer.dart'; // 视频卡片 - 垂直布局 class VideoCardV extends StatelessWidget { - // ignore: prefer_typing_uninitialized_variables - final videoItem; + final dynamic videoItem; final Function()? longPress; final Function()? longPressEnd; @@ -89,48 +88,20 @@ class VideoCardV extends StatelessWidget { onTap: () async => onPushDetail(heroTag), child: Column( children: [ - ClipRRect( - borderRadius: const BorderRadius.only( - topLeft: StyleString.imgRadius, - topRight: StyleString.imgRadius, - bottomLeft: StyleString.imgRadius, - bottomRight: StyleString.imgRadius, - ), - child: AspectRatio( - aspectRatio: StyleString.aspectRatio, - child: LayoutBuilder(builder: (context, boxConstraints) { - double maxWidth = boxConstraints.maxWidth; - double maxHeight = boxConstraints.maxHeight; - return Stack( - children: [ - Hero( - tag: heroTag, - child: NetworkImgLayer( - src: videoItem.pic, - width: maxWidth, - height: maxHeight, - ), - ), - // if (videoItem.stat.view is int && - // videoItem.stat.danmaku is int) - // Positioned( - // left: 0, - // right: 0, - // bottom: 0, - // child: AnimatedOpacity( - // opacity: 1, - // duration: const Duration(milliseconds: 200), - // child: VideoStat( - // view: videoItem.stat.view, - // danmaku: videoItem.stat.danmaku, - // duration: videoItem.duration, - // ), - // ), - // ), - ], - ); - }), - ), + AspectRatio( + aspectRatio: StyleString.aspectRatio, + child: LayoutBuilder(builder: (context, boxConstraints) { + double maxWidth = boxConstraints.maxWidth; + double maxHeight = boxConstraints.maxHeight; + return Hero( + tag: heroTag, + child: NetworkImgLayer( + src: videoItem.pic, + width: maxWidth, + height: maxHeight, + ), + ); + }), ), VideoContent(videoItem: videoItem) ], @@ -155,7 +126,6 @@ class VideoContent extends StatelessWidget { children: [ Text( videoItem.title, - textAlign: TextAlign.start, style: const TextStyle(fontSize: 13), maxLines: 2, overflow: TextOverflow.ellipsis, @@ -182,21 +152,15 @@ class VideoContent extends StatelessWidget { ) ], Expanded( - child: LayoutBuilder(builder: - (BuildContext context, BoxConstraints constraints) { - return SizedBox( - width: constraints.maxWidth, - child: Text( - videoItem.owner.name, - maxLines: 1, - style: TextStyle( - fontSize: - Theme.of(context).textTheme.labelMedium!.fontSize, - color: Theme.of(context).colorScheme.outline, - ), - ), - ); - }), + child: Text( + videoItem.owner.name, + maxLines: 1, + style: TextStyle( + fontSize: + Theme.of(context).textTheme.labelMedium!.fontSize, + color: Theme.of(context).colorScheme.outline, + ), + ), ), if (videoItem.goto == 'av') SizedBox( diff --git a/lib/pages/rcmd/controller.dart b/lib/pages/rcmd/controller.dart index f642a319..df7aa2e7 100644 --- a/lib/pages/rcmd/controller.dart +++ b/lib/pages/rcmd/controller.dart @@ -8,9 +8,8 @@ import 'package:pilipala/utils/storage.dart'; class RcmdController extends GetxController { final ScrollController scrollController = ScrollController(); int _currentPage = 0; - int crossAxisCount = 2; - RxList videoList = [RecVideoItemAppModel()].obs; - bool isLoadingMore = false; + RxList videoList = [].obs; + bool isLoadingMore = true; OverlayEntry? popupDialog; Box recVideo = GStrorage.recVideo; @@ -29,6 +28,9 @@ class RcmdController extends GetxController { // 获取推荐 Future queryRcmdFeed(type) async { + if (isLoadingMore == false) { + return; + } if (type == 'onRefresh') { _currentPage = 0; } @@ -37,7 +39,7 @@ class RcmdController extends GetxController { ); if (res['status']) { if (type == 'init') { - if (videoList.length > 1) { + if (videoList.isNotEmpty) { videoList.addAll(res['data']); } else { videoList.value = res['data']; @@ -56,6 +58,7 @@ class RcmdController extends GetxController { // 下拉刷新 Future onRefresh() async { + isLoadingMore = true; queryRcmdFeed('onRefresh'); } diff --git a/lib/pages/rcmd/view.dart b/lib/pages/rcmd/view.dart index 11a6d192..9f544648 100644 --- a/lib/pages/rcmd/view.dart +++ b/lib/pages/rcmd/view.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; @@ -41,7 +42,9 @@ class _RcmdPageState extends State scrollController.position.maxScrollExtent - 200) { if (!_rcmdController.isLoadingMore) { _rcmdController.isLoadingMore = true; - _rcmdController.onLoad(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + _rcmdController.onLoad(); + }); } } @@ -74,30 +77,36 @@ class _RcmdPageState extends State controller: _rcmdController.scrollController, slivers: [ SliverPadding( - // 单列布局 EdgeInsets.zero - padding: _rcmdController.crossAxisCount == 1 - ? EdgeInsets.zero - : const EdgeInsets.fromLTRB(0, StyleString.safeSpace, 0, 0), + padding: + const EdgeInsets.fromLTRB(0, StyleString.safeSpace, 0, 0), sliver: FutureBuilder( future: _futureBuilderFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { Map data = snapshot.data as Map; if (data['status']) { - return SliverLayoutBuilder( - builder: (context, boxConstraints) { - return Obx(() => contentGrid( - _rcmdController, _rcmdController.videoList)); - }); + return Platform.isAndroid || Platform.isIOS + ? Obx(() => contentGrid( + _rcmdController, _rcmdController.videoList)) + : SliverLayoutBuilder( + builder: (context, boxConstraints) { + return Obx(() => contentGrid( + _rcmdController, _rcmdController.videoList)); + }); } else { return HttpError( errMsg: data['msg'], - fn: () => {}, + fn: () { + setState(() { + _futureBuilderFuture = + _rcmdController.queryRcmdFeed('init'); + }); + }, ); } } else { // 缓存数据 - if (_rcmdController.videoList.length > 1) { + if (_rcmdController.videoList.isNotEmpty) { return contentGrid( _rcmdController, _rcmdController.videoList); } @@ -118,9 +127,10 @@ class _RcmdPageState extends State OverlayEntry _createPopupDialog(videoItem) { return OverlayEntry( - builder: (context) => AnimatedDialog( - child: OverlayPop(videoItem: videoItem), - )); + builder: (context) => AnimatedDialog( + child: OverlayPop(videoItem: videoItem), + ), + ); } Widget contentGrid(ctr, videoList) {