import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:huixiang/community/community_view/community_dynamic.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:huixiang/retrofit/data/article.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/comunity_comment.dart'; import 'package:huixiang/retrofit/data/member_comment_list.dart'; import 'package:huixiang/retrofit/data/page.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/tips_dialog.dart'; import 'package:huixiang/web/web_view/comment_list.dart'; import 'package:huixiang/web/web_view/input_comment.dart'; import 'package:shared_preferences/shared_preferences.dart'; class CommunityDetails extends StatefulWidget { final Map arguments; CommunityDetails({this.arguments}); @override State createState() { return _CommunityDetails(); } } class _CommunityDetails extends State with WidgetsBindingObserver { double height = 0; double commentHeight = 60.h; ComunityComment comunity; String parenId = "0"; final GlobalKey commentKey = GlobalKey(); final ScrollController scrollController = ScrollController(); List memberList = []; ApiService apiService; var commentFocus = FocusNode(); String hintText = S.current.liuxianinjingcaidepinglunba; bool isKeyBoardShow = false; int commentTotal = 0; Article article; @override void didChangeMetrics() { WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; if (MediaQuery .of(context) .viewInsets .bottom == 0) { if (isKeyBoardShow) { FocusScope.of(context).requestFocus(FocusNode()); if (mounted) setState(() { hintText = S.current.liuxianinjingcaidepinglunba; isKeyBoardShow = false; }); } } else { if (mounted) setState(() { isKeyBoardShow = true; }); } }); } @override void initState() { super.initState(); comunity = widget.arguments["comment"]; WidgetsBinding.instance.addObserver(this); _queryMemberCommentList(); queryDetails(); } ///详情接口 queryDetails() async { SharedPreferences value = await SharedPreferences.getInstance(); if (apiService == null) apiService = ApiService( Dio(), context: context, token: value.getString("token"), ); BaseData
baseData = await apiService.informationInfo(comunity.id) .catchError((onError) { debugPrint(onError.toString()); }); if (baseData != null && baseData.isSuccess) {} } @override Widget build(BuildContext context) { return Scaffold( appBar: MyAppBar( title: "动态详情", titleColor: Colors.black, titleSize: 18.sp, background: Colors.white, leading: true, leadingColor: Colors.black, ), body: Container( child: Column( children: [ Expanded( child: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Column( children: [ CommunityDynamic( comunity, 0, exitFull: () { setState(() {}); }, userId:widget.arguments["userId"], itemCount: 3, isDetails: true, heightFun: (height) { this.height = height + MediaQuery .of(context) .padding .top + kToolbarHeight + 24; if (mounted) setState(() {}); }, ), CommentList( commentKey, comunity?.likes ?? comunity?.likes.toString() ?? 0, comunity.id, isKeyBoardShow, _reply, _delCommentTips, 12.sp, ), if (memberList == null || memberList.length == 0) Container( width: double.infinity, alignment: Alignment.topCenter, margin: EdgeInsets.only(top: 40), padding: EdgeInsets.all(22.h), child: Text( S .of(context) .zanwupinglun, style: TextStyle( fontSize: 12, fontWeight: FontWeight.bold, color: Color(0xFFA0A0A0), ), ), ), ], ), ), flex: 1, ), /// 富文本评论的输入框 InputComment( inputKey, hintText, isKeyBoardShow, commentFocus, commentTextController, _toComment, _queryMemberComment, _queryInformationLikes, isLike: comunity.selfLike, ), ], ), ), ); } ///给文章/活动点赞 _queryInformationLikes() async { BaseData baseData = await apiService.informationLikes(comunity.id); if (baseData != null && baseData.isSuccess) { commentKey.currentState.setState(() {}); setState(() { if (comunity.selfLike ?? false) comunity.likes -= 1; else comunity.likes += 1; comunity.selfLike = !comunity.selfLike ?? false; }); } else { // SmartDialog.showToast(baseData.msg, alignment: Alignment.center); } } ///发布评论 _queryMemberComment(String content) async { BaseData baseData = await apiService.memberComment({ "content": content, "parentId": parenId, "relationalId": comunity.id, "relationalType": 1 }).catchError((error) {}); if (baseData != null && baseData.isSuccess) { CommentListState state = commentKey.currentState; state.queryMemberCommentList(); commentTextController.text = ""; FocusScope.of(context).unfocus(); _queryMemberCommentList(); } } ///滑动到评论列表 _toComment() { if (commentKey.currentContext == null) return; RenderBox firstRenderBox = commentKey.currentContext.findRenderObject(); Offset first = firstRenderBox.localToGlobal(Offset.zero); scrollController.animateTo( first.dy + scrollController.offset - (kToolbarHeight + MediaQuery .of(context) .padding .top), duration: Duration(milliseconds: 300), curve: Curves.easeIn, ); } final GlobalKey inputKey = GlobalKey(); final TextEditingController commentTextController = TextEditingController(); contentHeight() { double contentHeight = MediaQuery .of(context) .size .height - kToolbarHeight - MediaQuery .of(context) .padding .top - 160.h; if ((contentHeight - 60.h) > (128.h * memberList.length)) { commentHeight = contentHeight - (128.h * memberList.length); } } ///删除评论的提示 _delCommentTips(memberComment) { SmartDialog.show(widget: Tips(() { delComment(memberComment); })); } ///删除评论 delComment(memberComment) async { BaseData baseData = await apiService.delComment(memberComment.id); if (baseData != null && baseData.isSuccess) { CommentListState state = commentKey.currentState; state.queryMemberCommentList(); } } ///评论 回复 _reply(memberComment) { FocusScope.of(context).requestFocus(commentFocus); parenId = memberComment.id; hintText = S.of(context).huifu_("${memberComment.username}"); } ///评论列表 _queryMemberCommentList() async { SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); if (apiService == null) apiService = ApiService( Dio(), context: context, token: sharedPreferences.getString("token"), showLoading: false, ); BaseData> baseData = await apiService.memberCommentList({ "pageNum": 1, "pageSize": 100, "relationalId": comunity.id, "relationalType": 1, }).catchError((error) {}); if (baseData != null && baseData.isSuccess) { commentTotal = baseData.data.size; memberList = baseData.data.list; contentHeight(); if (mounted) setState(() {}); } } }