mod: rcmd FutureBuilder

This commit is contained in:
guozhigq
2024-02-04 23:03:24 +08:00
parent b0d8f5d0b6
commit a560d66567
3 changed files with 43 additions and 19 deletions

View File

@ -3,5 +3,5 @@ enum RcmdType { web, app, notLogin }
extension RcmdTypeExtension on RcmdType { extension RcmdTypeExtension on RcmdType {
String get values => ['web', 'app', 'notLogin'][index]; String get values => ['web', 'app', 'notLogin'][index];
String get labels => ['web端', 'app端', '模拟未登录'][index]; String get labels => ['web端', 'app端', '游客模式'][index];
} }

View File

@ -28,7 +28,7 @@ class RcmdController extends GetxController {
setting.get(SettingBoxKey.enableSaveLastData, defaultValue: false); setting.get(SettingBoxKey.enableSaveLastData, defaultValue: false);
defaultRcmdType = defaultRcmdType =
setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'web'); setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'web');
if (defaultRcmdType == 'web'){ if (defaultRcmdType == 'web') {
videoList = <RecVideoItemModel>[].obs; videoList = <RecVideoItemModel>[].obs;
} else { } else {
videoList = <RecVideoItemAppModel>[].obs; videoList = <RecVideoItemAppModel>[].obs;
@ -43,7 +43,7 @@ class RcmdController extends GetxController {
if (type == 'onRefresh') { if (type == 'onRefresh') {
_currentPage = 0; _currentPage = 0;
} }
late final Map<String,dynamic> res; late final Map<String, dynamic> res;
switch (defaultRcmdType) { switch (defaultRcmdType) {
case 'app': case 'app':
case 'notLogin': case 'notLogin':
@ -77,13 +77,14 @@ class RcmdController extends GetxController {
_currentPage += 1; _currentPage += 1;
// 若videoList数量太小可能会影响翻页此时再次请求 // 若videoList数量太小可能会影响翻页此时再次请求
// 为避免请求到的数据太少时还在反复请求要求本次返回数据大于1条才触发 // 为避免请求到的数据太少时还在反复请求要求本次返回数据大于1条才触发
if (res['data'].length > 1 && videoList.length < 10){ if (res['data'].length > 1 && videoList.length < 10) {
queryRcmdFeed('onLoad'); queryRcmdFeed('onLoad');
} }
} else { } else {
Get.snackbar('提示', res['msg']); Get.snackbar('提示', res['msg']);
} }
isLoadingMore = false; isLoadingMore = false;
return res;
} }
// 下拉刷新 // 下拉刷新

View File

@ -7,7 +7,7 @@ import 'package:get/get.dart';
import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/constants.dart';
import 'package:pilipala/common/skeleton/video_card_v.dart'; import 'package:pilipala/common/skeleton/video_card_v.dart';
import 'package:pilipala/common/widgets/animated_dialog.dart'; import 'package:pilipala/common/widgets/animated_dialog.dart';
// import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/common/widgets/overlay_pop.dart'; import 'package:pilipala/common/widgets/overlay_pop.dart';
import 'package:pilipala/common/widgets/video_card_v.dart'; import 'package:pilipala/common/widgets/video_card_v.dart';
import 'package:pilipala/pages/home/index.dart'; import 'package:pilipala/pages/home/index.dart';
@ -25,6 +25,7 @@ class RcmdPage extends StatefulWidget {
class _RcmdPageState extends State<RcmdPage> class _RcmdPageState extends State<RcmdPage>
with AutomaticKeepAliveClientMixin { with AutomaticKeepAliveClientMixin {
final RcmdController _rcmdController = Get.put(RcmdController()); final RcmdController _rcmdController = Get.put(RcmdController());
late Future _futureBuilderFuture;
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
@ -32,7 +33,7 @@ class _RcmdPageState extends State<RcmdPage>
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_rcmdController.queryRcmdFeed('init'); _futureBuilderFuture = _rcmdController.queryRcmdFeed('init');
ScrollController scrollController = _rcmdController.scrollController; ScrollController scrollController = _rcmdController.scrollController;
StreamController<bool> mainStream = StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream; Get.find<MainController>().bottomBarStream;
@ -88,19 +89,41 @@ class _RcmdPageState extends State<RcmdPage>
slivers: [ slivers: [
SliverPadding( SliverPadding(
padding: padding:
const EdgeInsets.fromLTRB(0, StyleString.safeSpace, 0, 0), const EdgeInsets.fromLTRB(0, StyleString.safeSpace, 0, 0),
sliver: Obx(() { // 使用Obx来监听数据的变化 sliver: FutureBuilder(
if (_rcmdController.isLoadingMore && _rcmdController.videoList.isEmpty) { future: _futureBuilderFuture,
return contentGrid(_rcmdController, []); builder: (context, snapshot) {
// 如果正在加载并且列表为空,则显示加载指示器 if (snapshot.connectionState == ConnectionState.done) {
// return const SliverToBoxAdapter( Map data = snapshot.data as Map;
// child: Center(child: CircularProgressIndicator()), if (data['status']) {
// ); return Obx(
} else { () {
// 显示视频列表 if (_rcmdController.isLoadingMore &&
return contentGrid(_rcmdController, _rcmdController.videoList); _rcmdController.videoList.isEmpty) {
} return contentGrid(_rcmdController, []);
}), } else {
// 显示视频列表
return contentGrid(
_rcmdController, _rcmdController.videoList);
}
},
);
} else {
return HttpError(
errMsg: data['msg'],
fn: () {
setState(() {
_futureBuilderFuture =
_rcmdController.queryRcmdFeed('init');
});
},
);
}
} else {
return contentGrid(_rcmdController, []);
}
},
),
), ),
LoadingMore(ctr: _rcmdController), LoadingMore(ctr: _rcmdController),
], ],