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_comment.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/activity.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/utils/font_weight.dart'; import 'package:huixiang/view_widget/comment_menu.dart'; import 'package:huixiang/view_widget/login_tips_dialog.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) {}); 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(() {}); }, itemCount: 3, isDetails: true, heightFun: (height) { this.height = height + MediaQuery.of(context).padding.top + kToolbarHeight + 24; if (mounted) setState(() {}); }, ), // CommentList( // commentKey, // widget.arguments, // activity, // article, // isKeyBoardShow, // _reply, // _delCommentTips, // 12.sp, // ) Container( padding: EdgeInsets.all(16), color: Colors.white, child: Row( children: [ Text( S.of(context).pinglun_(commentTotal.toString()), style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, color: Color(0xff1A1A1A), ), ), SizedBox( width: 16.w, ), Text( S.of(context).xihuan_( "${comunity?.likes ?? comunity?.likes ?? "0"}"), style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, color: Color(0xff1A1A1A), ), ), ], ), ), if (memberList != null && memberList.length > 0) ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemCount: memberList != null ? memberList.length : 0, scrollDirection: Axis.vertical, itemBuilder: (context, position) { return Material( color: Colors.white, child: InkWell( onTap: () { showPressMenu( memberList[position].createUser, memberList[position], ); }, child: CommunityComment( memberList[position], _queryCommentLike, (memberList.length - 1 == position) ? 1 : 0, ), ), ); }, ), 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) { // commentKey.currentState.initState(); 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); } } showPressMenu(String userId, memberComment) { if (isKeyBoardShow) { FocusScope.of(context).requestFocus(FocusNode()); return; } SharedPreferences.getInstance().then((value) { SmartDialog.show( widget: CommentMenu( (type) { SmartDialog.dismiss(); if (type == "huifu") { _reply(memberComment); } else if (type == "shanchu") { _delCommentTips(); } }, isSelf: userId == value.getString("userId"), ), alignmentTemp: Alignment.bottomCenter, isUseAnimationTemp: true, animationDurationTemp: Duration(milliseconds: 300), ); }); } ///删除评论的提示 _delCommentTips() { SmartDialog.show(widget: Tips(() { delComment(); })); } ///删除评论 delComment() async { BaseData baseData = await apiService.delComment(""); if (baseData != null && baseData.isSuccess) { // commentKey.currentState.initState(); } } ///评论 回复 _reply(memberComment) { FocusScope.of(context).requestFocus(commentFocus); parenId = memberComment.id; hintText = S.of(context).huifu_("${memberComment.username}"); } ///评论点赞 _queryCommentLike(String id) async { SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); String token = sharedPreferences.getString("token"); if (token == null || token == "") { LoginTipsDialog().show(context); return; } BaseData baseData = await apiService.commentLike(id).catchError((error) {}); if (baseData != null && baseData.isSuccess) { memberList.forEach((element) { if (element.id == id) { if (element.liked) { element.likes -= 1; element.liked = false; } else { element.likes += 1; element.liked = true; } } }); } } ///评论列表 _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(() {}); } } }