132 lines
4.4 KiB
Dart
132 lines
4.4 KiB
Dart
import 'package:flutter/widgets.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:hgdj/hj_page/comment/cell/comment_item.dart';
|
|
import 'package:hgdj/hj_page/comment/comment_mixin.dart';
|
|
import 'package:hgdj/hj_page/comment/widget/comment_foot_view.dart';
|
|
import 'package:hgdj/tools_base/loading/loading_center_widget.dart';
|
|
import 'package:hgdj/tools_base/refresh/pull_refresh.dart';
|
|
|
|
import '../home/widget/quick_search_view.dart';
|
|
|
|
class CommentLogic extends GetxController with CommentMixin {
|
|
final String objId;
|
|
|
|
final String commentType;
|
|
|
|
@override
|
|
final Function(int)? totalCallback;
|
|
|
|
CommentLogic(
|
|
this.objId, {
|
|
this.commentType = 'video',
|
|
this.totalCallback,
|
|
}) : super();
|
|
|
|
bool isLoading = true;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
id = objId;
|
|
objType = commentType;
|
|
}
|
|
|
|
@override
|
|
void onReady() {
|
|
super.onReady();
|
|
isLoading = false;
|
|
fetchComments(objId);
|
|
}
|
|
}
|
|
|
|
class CommentView extends StatelessWidget {
|
|
final bool showInput;
|
|
final String objId;
|
|
final String objType; // video, cartoon
|
|
final Function(int)? totalCallback;
|
|
|
|
const CommentView(
|
|
this.objId, {
|
|
super.key,
|
|
this.showInput = true,
|
|
this.objType = 'video',
|
|
this.totalCallback,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return GetBuilder(
|
|
init: CommentLogic(objId,
|
|
commentType: objType, totalCallback: totalCallback),
|
|
tag: objId,
|
|
builder: (logic) => LayoutBuilder(builder: (_, cons) {
|
|
if (cons.maxHeight < 58) return SizedBox.shrink();
|
|
return Column(
|
|
children: [
|
|
Expanded(
|
|
child: pullYsRefresh(
|
|
onInit: (refreshCtr) => logic.refreshCtr = refreshCtr,
|
|
onLoading: (_) => logic.fetchComments(objId),
|
|
onRefresh: (_) => logic.fetchComments(objId, isRefresh: true),
|
|
child: () {
|
|
if (logic.isLoading) return LoadingCenterWidget();
|
|
if (logic.comments.isEmpty) return CErrorWidget();
|
|
return CustomScrollView(
|
|
slivers: [
|
|
if (logic.quickSearchList.isNotEmpty)
|
|
SliverToBoxAdapter(
|
|
child: Container(
|
|
padding: EdgeInsets.only(bottom: 12),
|
|
margin: EdgeInsets.fromLTRB(12, 0, 12, 12),
|
|
decoration: BoxDecoration(
|
|
border: Border(
|
|
bottom:
|
|
BorderSide(color: Color(0x08ffffff)))),
|
|
child: QuickSearchView(logic.quickSearchList),
|
|
),
|
|
),
|
|
SliverList.builder(
|
|
itemCount: logic.comments.length,
|
|
itemBuilder: (BuildContext context, int index) {
|
|
final topIndex = logic.topPinnedCommentIndex;
|
|
final showBanner = index == topIndex &&
|
|
logic.commentTopBanners.isNotEmpty;
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 16),
|
|
child: CommentItem(
|
|
key: ValueKey(logic.comments[index].id),
|
|
logic.comments[index],
|
|
objId: objId,
|
|
topBanners:
|
|
showBanner ? logic.commentTopBanners : null,
|
|
replyHandler: (comment, {reply}) =>
|
|
logic.readyReplyComment(comment,
|
|
replyModel: reply),
|
|
),
|
|
);
|
|
},
|
|
),
|
|
],
|
|
);
|
|
}(),
|
|
),
|
|
),
|
|
if (showInput)
|
|
Obx(
|
|
() => CommentFootView(
|
|
isSending: logic.isSendingMsg.value,
|
|
onComment: (isSend) =>
|
|
logic.readyReplyComment(null, isSend: isSend),
|
|
textCtr: logic.commentController,
|
|
imgPath: logic.selectedImagePath.value,
|
|
onImgChange: (value) => logic.selectedImagePath.value = value,
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}),
|
|
global: false,
|
|
);
|
|
}
|
|
}
|