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/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; String businessId; @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"]; businessId = widget.arguments["businessId"]; WidgetsBinding.instance.addObserver(this); _queryMemberCommentList(); queryDetails(businessId); } ///详情接口 queryDetails(id) async { SharedPreferences value = await SharedPreferences.getInstance(); if (apiService == null) apiService = ApiService( Dio(), context: context, token: value.getString("token"), ); BaseData
baseData = await apiService.informationInfo(id) .catchError((onError) { debugPrint(onError.toString()); }); if (baseData != null && baseData.isSuccess) { setState(() { article = baseData.data; }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: MyAppBar( title: S.of(context).dongtaixiangqing, titleColor: Colors.black, titleSize: 18.sp, background: Colors.white, leading: true, leadingColor: Colors.black, ), body: GestureDetector( behavior: HitTestBehavior.translucent, onTap: () { FocusScope.of(context).requestFocus(FocusNode()); }, child:Container( child: Column( children: [ Expanded( child: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Column( children: [ if(article != null) CommunityDynamic( article, 0, exitFull: () { setState(() {}); }, userId:widget.arguments !=null ? widget.arguments["userId"] :widget.arguments["mid"], itemCount: 3, isDetails: true, heightFun: (height) { this.height = height + MediaQuery .of(context) .padding .top + kToolbarHeight + 24; if (mounted) setState(() {}); }, ), CommentList( commentKey, article?.likes ?? 0, businessId, 4, isKeyBoardShow, _reply, _delCommentTips, 12.sp, requestApiFinish: (total){setState(() { commentTotal = total; });}, ), 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: article?.liked ?? false, ), ], ), )), ); } ///给文章/活动点赞 _queryInformationLikes() async { BaseData baseData = await apiService.informationLikes(businessId).catchError((onError) {}); if (baseData != null && baseData.isSuccess) { commentKey.currentState.setState(() {}); setState(() { if (article?.liked ?? false) article?.likes -= 1; else article?.likes += 1; article?.liked = !(article.liked ?? false); }); } else { // SmartDialog.showToast(baseData.msg, alignment: Alignment.center); } } ///动态发布评论 _queryMemberComment(String content) async { BaseData baseData = await apiService.memberComment({ "content": content, "parentId": parenId, "relationalId": businessId, "relationalType":4 }).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": businessId, "relationalType":4, }).catchError((error) {}); if (baseData != null && baseData.isSuccess) { commentTotal = baseData.data.size; memberList = baseData.data.list; contentHeight(); if (mounted) setState(() {}); } } }