mod: rcmd FutureBuilder
This commit is contained in:
@ -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];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 下拉刷新
|
// 下拉刷新
|
||||||
|
|||||||
@ -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),
|
||||||
],
|
],
|
||||||
|
|||||||
Reference in New Issue
Block a user