fix: 评论区加载到底后状态不正确;移除dispose避免崩溃

This commit is contained in:
orz12
2024-02-23 01:33:47 +08:00
parent 03b46bf6df
commit e78cd8b179
2 changed files with 54 additions and 96 deletions

View File

@@ -56,7 +56,6 @@ class VideoReplyController extends GetxController {
if (isLoadingMore) {
return;
}
isLoadingMore = true;
if (type == 'init') {
currentPage = 0;
noMore.value = '';
@@ -64,6 +63,7 @@ class VideoReplyController extends GetxController {
if (noMore.value == '没有更多了') {
return;
}
isLoadingMore = true;
final res = await ReplyHttp.replyList(
oid: aid!,
pageNum: currentPage + 1,
@@ -71,6 +71,7 @@ class VideoReplyController extends GetxController {
type: ReplyType.video.index,
sort: _sortType.index,
);
isLoadingMore = false;
if (res['status']) {
final List<ReplyItemModel> replies = res['data'].replies;
if (replies.isNotEmpty) {
@@ -105,8 +106,6 @@ class VideoReplyController extends GetxController {
replyList.addAll(replies);
}
}
isLoadingMore = false;
return res;
}
// 上拉加载

View File

@@ -38,7 +38,6 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
late AnimationController fabAnimationCtr;
late ScrollController scrollController;
Future? _futureBuilderFuture;
bool _isFabVisible = true;
String replyLevel = '1';
late String heroTag;
@@ -66,7 +65,7 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
fabAnimationCtr = AnimationController(
vsync: this, duration: const Duration(milliseconds: 300));
_futureBuilderFuture = _videoReplyController.queryReplyList();
_videoReplyController.queryReplyList();
fabAnimationCtr.forward();
scrollListener();
@@ -121,13 +120,6 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
}
}
@override
void dispose() {
scrollController.removeListener(() {});
fabAnimationCtr.dispose();
// scrollController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
@@ -135,7 +127,8 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
return RefreshIndicator(
onRefresh: () async {
_videoReplyController.currentPage = 0;
return await _videoReplyController.queryReplyList();
_videoReplyController.noMore.value = '';
await _videoReplyController.queryReplyList();
},
child: Stack(
children: [
@@ -195,90 +188,56 @@ class _VideoReplyPanelState extends State<VideoReplyPanel>
),
),
),
FutureBuilder(
future: _futureBuilderFuture,
builder: (BuildContext context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
var data = snapshot.data;
if (data['status']) {
// 请求成功
return Obx(
() => _videoReplyController.isLoadingMore &&
_videoReplyController.replyList.isEmpty
? SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, index) {
return const VideoReplySkeleton();
}, childCount: 5),
)
: SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, index) {
double bottom =
MediaQuery.of(context).padding.bottom;
if (index ==
_videoReplyController
.replyList.length) {
return Container(
padding:
EdgeInsets.only(bottom: bottom),
height: bottom + 100,
child: Center(
child: Obx(
() => Text(
_videoReplyController
.noMore.value,
style: TextStyle(
fontSize: 12,
color: Theme.of(context)
.colorScheme
.outline,
),
),
),
),
);
} else {
return ReplyItem(
replyItem: _videoReplyController
.replyList[index],
showReplyRow: true,
replyLevel: replyLevel,
replyReply: (replyItem) =>
replyReply(replyItem),
replyType: ReplyType.video,
);
}
},
childCount:
_videoReplyController.replyList.length +
1,
),
),
);
} else {
// 请求错误
return HttpError(
errMsg: data['msg'],
fn: () {
setState(() {
_futureBuilderFuture =
_videoReplyController.queryReplyList();
});
},
);
}
} else {
// 骨架屏
return SliverList(
delegate: SliverChildBuilderDelegate(
Obx(
() => _videoReplyController.isLoadingMore &&
_videoReplyController.replyList.isEmpty
? SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, index) {
return const VideoReplySkeleton();
}, childCount: 5),
)
: SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, index) {
return const VideoReplySkeleton();
}, childCount: 5),
);
}
},
)
double bottom =
MediaQuery.of(context).padding.bottom;
if (index ==
_videoReplyController.replyList.length) {
return Container(
padding: EdgeInsets.only(bottom: bottom),
height: bottom + 100,
child: Center(
child: Obx(
() => Text(
_videoReplyController.noMore.value,
style: TextStyle(
fontSize: 12,
color: Theme.of(context)
.colorScheme
.outline,
),
),
),
),
);
} else {
return ReplyItem(
replyItem:
_videoReplyController.replyList[index],
showReplyRow: true,
replyLevel: replyLevel,
replyReply: (replyItem) =>
replyReply(replyItem),
replyType: ReplyType.video,
);
}
},
childCount:
_videoReplyController.replyList.length + 1,
),
),
),
],
),
Positioned(