Browse Source

safety

master
fmk 3 years ago
parent
commit
7a2344b2bc
  1. 3
      android/app/src/main/AndroidManifest.xml
  2. 12
      assets/svg/zhaopianshipin.svg
  3. 210
      lib/community/community_child_page.dart
  4. 376
      lib/community/community_details.dart
  5. 6
      lib/community/community_page.dart
  6. 201
      lib/community/community_view/community_comment.dart
  7. 213
      lib/community/community_view/community_dynamic.dart
  8. 408
      lib/community/release_dynamic.dart
  9. 93
      lib/main.dart
  10. 97
      lib/mine/user_info_page.dart
  11. 22
      lib/qr/qr_code_scan.dart
  12. 6
      lib/retrofit/retrofit_api.dart
  13. 23
      lib/retrofit/retrofit_api.g.dart
  14. 247
      lib/store/store_view/settlement.dart
  15. 23
      lib/union/union_page.dart
  16. 57
      lib/web/web_page.dart
  17. 5
      lib/web/web_view/comment_list.dart
  18. 7
      lib/web/web_view/input_comment.dart
  19. 27
      pubspec.lock
  20. 13
      pubspec.yaml

3
android/app/src/main/AndroidManifest.xml

@ -100,8 +100,7 @@
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
android:screenOrientation="portrait"/>
<activity
android:name="io.dcloud.PandoraEntryActivity"

12
assets/svg/zhaopianshipin.svg

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Icon-xiangji1</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="写动态" transform="translate(-45.000000, -302.000000)" fill="#D8D8D8" fill-rule="nonzero">
<g id="编组" transform="translate(45.000000, 302.000000)">
<rect id="矩形" opacity="0" x="0" y="0" width="48" height="48"></rect>
<path d="M23.8830841,35.1553838 C18.932303,35.1553838 14.9087855,31.1318663 14.9087855,26.1810852 C14.9087855,21.230304 18.932303,17.2067865 23.8830841,17.2067865 C28.8338653,17.2067865 32.8573828,21.230304 32.8573828,26.1810852 C32.8573828,31.1318663 28.8338653,35.1553838 23.8830841,35.1553838 Z M23.8830841,20.1982194 C20.5852511,20.1982194 17.9002184,22.8832522 17.9002184,26.1810852 C17.9002184,29.4789182 20.5852511,32.163951 23.8830841,32.163951 C27.1809172,32.163951 29.8659499,29.4789182 29.8659499,26.1810852 C29.8659499,22.8832522 27.1809172,20.1982194 23.8830841,20.1982194 Z M40.3399966,42.6379976 L7.42617169,42.6379976 C4.95078113,42.6379976 2.93499075,40.6222073 2.93499075,38.1468167 L2.93499075,14.2153536 C2.93499075,11.739963 4.95078113,9.72417267 7.42617169,9.72417267 L11.9173526,9.72417267 C12.7397951,9.72417267 13.4171007,10.3934151 13.4171007,11.2239207 C13.4171007,12.0544263 12.7478583,12.7236688 11.9173526,12.7236688 L7.42617169,12.7236687 C6.60372923,12.7236687 5.92642364,13.3929111 5.92642364,14.2234168 L5.92642364,38.1548799 C5.92642364,38.9773223 6.59566603,39.6546279 7.42617169,39.6546279 L40.3319335,39.6546279 C41.1543759,39.6546279 41.8316815,38.9853855 41.8316815,38.1548799 L41.8316815,14.2153536 C41.8316815,13.3929112 41.1624391,12.7156056 40.3319334,12.7156056 L23.8830841,12.7156056 C23.0606417,12.7156056 22.3833361,12.0463632 22.3833361,11.2158575 C22.3833361,10.3853519 23.0525785,9.71610947 23.8830841,9.71610947 L40.3399966,9.71610947 C42.8153872,9.71610947 44.8311776,11.7318998 44.8311776,14.2072904 L44.8311776,38.1387536 C44.8231144,40.6222073 42.807324,42.6379976 40.3399966,42.6379976 Z M35.8488157,16.4649757 C35.8488157,17.7067025 36.8567109,18.7065345 38.0903746,18.7065345 C39.3321015,18.7065345 40.3319335,17.6986394 40.3319335,16.4649757 C40.3319335,15.231312 39.3240383,14.2234168 38.0903746,14.2234168 C36.8567109,14.2153536 35.8488157,15.2232488 35.8488157,16.4649757 Z M22.3913993,6.74080294 C22.3913993,7.56324539 21.7221569,8.24055098 20.8916512,8.24055098 L14.9087855,8.24055098 C14.086343,8.24055098 13.4090374,7.57130859 13.4090374,6.74080294 L13.4090374,6.74080294 C13.4090374,5.91836048 14.0782798,5.24105489 14.9087855,5.24105489 L20.8916512,5.24105489 C21.7140937,5.24105489 22.3913993,5.91029733 22.3913993,6.74080294 L22.3913993,6.74080294 Z" id="形状"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

210
lib/community/community_child_page.dart

@ -1,10 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:huixiang/utils/flutter_utils.dart';
import 'package:huixiang/utils/font_weight.dart';
import 'package:huixiang/view_widget/icon_text.dart';
import 'package:huixiang/view_widget/round_button.dart';
import 'package:huixiang/community/community_view/community_dynamic.dart';
import 'package:huixiang/view_widget/classic_header.dart';
import 'package:huixiang/view_widget/my_footer.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class CommunityChildPage extends StatefulWidget {
@override
@ -14,168 +12,56 @@ class CommunityChildPage extends StatefulWidget {
}
class _CommunityChildPage extends State<CommunityChildPage> {
RefreshController refreshController = RefreshController();
@override
Widget build(BuildContext context) {
return ListView.builder(
itemBuilder: (context, position) {
return dynamicItem();
},
itemCount: 13,
);
void initState() {
super.initState();
}
_onRefresh() {
Future.delayed(Duration(seconds: 1), () {
refreshController.refreshCompleted();
refreshController.loadComplete();
});
}
int imageCount = 9;
queryCommunity() {
Future.delayed(Duration(seconds: 1), () {
refreshController.refreshCompleted();
refreshController.loadComplete();
});
}
Widget dynamicItem() {
return Container(
margin: EdgeInsets.only(bottom: 16.h),
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Color(0x08000000),
offset: Offset(0, 1),
blurRadius: 8,
spreadRadius: 0,
),
],
@override
Widget build(BuildContext context) {
return SmartRefresher(
controller: refreshController,
enablePullDown: true,
enablePullUp: true,
physics: BouncingScrollPhysics(),
header: MyHeader(),
footer: CustomFooter(
builder: (context, mode) {
return MyFooter(mode);
},
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
height: 44,
child: Row(
children: [
ClipRRect(
child: Image.asset(
"assets/image/default_user.png",
width: 44,
height: 44,
),
borderRadius: BorderRadius.circular(22),
),
SizedBox(
width: 8,
),
Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"百花谷",
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF1A1A1A),
),
),
Text(
"2021.04.12",
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF808080),
),
),
],
),
],
),
),
RoundButton(
padding: EdgeInsets.symmetric(
horizontal: 8,
vertical: 3,
),
backgroup: Color(0xFF32A060),
textColor: Colors.white,
text: "关注",
radius: 20,
icons: SvgPicture.asset(
"assets/svg/shequ_fabu.svg",
fit: BoxFit.contain,
color: Colors.white,
width: 14,
height: 14,
),
),
],
),
SizedBox(
height: 12.h,
),
Text(
"文本,是指书面语言的表现形式,从文学角度说,通常是具有完整、系统含义(Message)的一个句子或多个句子的组说,通常是具有完整、系统含义(Message)的一个句子或多个句子的组或多个句子的组说。",
maxLines: 5,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Color(0xFF1A1A1A),
fontWeight: MyFontWeight.regular,
fontSize: 14.sp,
),
),
SizedBox(
height: 16.h,
),
if (imageCount == 1)
Container(
width: MediaQuery.of(context).size.width / 2,
height: MediaQuery.of(context).size.width,
color: Colors.blue.withAlpha(123),
)
else
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: (imageCount == 2 || imageCount == 4) ? 2 : 3,
crossAxisSpacing: 12.w,
mainAxisSpacing: 12.w,
childAspectRatio: 1,
),
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, position) {
return Container(
color: Colors.blue.withAlpha(123),
);
},
itemCount: imageCount,
),
SizedBox(
height: 12.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
IconText(
"58",
space: 4.w,
leftImage: "assets/svg/liulanliang.svg",
iconSize: 16,
),
IconText(
"58",
space: 4.w,
leftImage: "assets/svg/pinglun.svg",
iconSize: 16,
),
IconText(
"58",
space: 4.w,
leftImage: "assets/svg/xihuan.svg",
iconSize: 16,
),
],
),
],
onRefresh: _onRefresh,
onLoading: queryCommunity,
child: ListView.builder(
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, position) {
return InkWell(
child: CommunityDynamic(),
onTap: () {
Navigator.of(context).pushNamed('/router/community_details');
},
);
},
itemCount: 13,
),
);
}
}

376
lib/community/community_details.dart

@ -0,0 +1,376 @@
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/base_data.dart';
import 'package:huixiang/retrofit/data/member_comment_list.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/tips_dialog.dart';
import 'package:huixiang/web/web_view/input_comment.dart';
import 'package:shared_preferences/shared_preferences.dart';
class CommunityDetails extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _CommunityDetails();
}
}
class _CommunityDetails extends State<CommunityDetails> {
double height = 0;
double commentHeight = 60.h;
List<MemberCommentList> memberList = [];
ApiService apiService;
var commentFocus = FocusNode();
String hintText = S.current.liuxianinjingcaidepinglunba;
bool isKeyBoardShow = false;
@override
void didChangeMetrics() {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (MediaQuery.of(context).viewInsets.bottom == 0) {
if (isKeyBoardShow) {
FocusScope.of(context).requestFocus(FocusNode());
setState(() {
hintText = S.current.liuxianinjingcaidepinglunba;
isKeyBoardShow = false;
});
}
} else {
setState(() {
isKeyBoardShow = true;
});
}
});
}
@override
void initState() {
super.initState();
SharedPreferences.getInstance().then((value) {
apiService = ApiService(
Dio(),
context: context,
token: value.getString("token"),
);
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Expanded(
child: NestedScrollView(
headerSliverBuilder: (context, position) {
return [
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver: SliverAppBar(
expandedHeight: (height == 0) ? 614 : height,
pinned: true,
backgroundColor: Colors.white,
title: Text(
"动态详情",
style: TextStyle(
color: Colors.black,
fontSize: 18.sp,
fontWeight: MyFontWeight.semi_bold,
),
),
elevation: 0,
leading: GestureDetector(
onTap: () {
Navigator.of(context).pop();
},
child: Container(
alignment: Alignment.centerRight,
margin: EdgeInsets.only(left: 10),
padding: EdgeInsets.all(6),
child: Icon(
Icons.arrow_back_ios,
color: Colors.black,
size: 24,
),
),
),
flexibleSpace: FlexibleSpaceBar(
//Colors.white,
background: Container(
padding: EdgeInsets.only(
top: MediaQuery.of(context).padding.top +
kToolbarHeight,
),
color: Colors.white,
child: CommunityDynamic(
itemCount: 3,
isDetails: true,
heightFun: (height) {
this.height = height +
MediaQuery.of(context).padding.top +
kToolbarHeight +
68;
setState(() {});
},
),
),
collapseMode: CollapseMode.pin,
),
bottom: PreferredSize(
preferredSize: Size(
MediaQuery.of(context).size.width,
46,
),
child: Container(
padding: EdgeInsets.all(16),
margin: EdgeInsets.only(top: 16.h),
color: Colors.white,
child: Row(
children: [
Text(
S.of(context).pinglun_("1"),
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
color: Color(0xff1A1A1A),
),
),
SizedBox(
width: 16.w,
),
Text(
S.of(context).xihuan_("0"),
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
color: Color(0xff1A1A1A),
),
),
],
),
),
),
),
),
];
},
body: Container(
height: MediaQuery.of(context).size.height -
MediaQuery.of(context).padding.top +
kToolbarHeight -
68,
margin: EdgeInsets.only(top: 68 + 50 + kToolbarHeight),
child: Column(
children: [
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,
),
),
);
},
),
if (memberList != null && memberList.length > 0)
Container(
height: commentHeight,
decoration: BoxDecoration(
color: Color(0xFFF2F2F2),
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(12),
offset: Offset(0, 2),
blurRadius: 14,
spreadRadius: 0,
),
],
),
alignment: Alignment.topCenter,
padding: EdgeInsets.only(top: 22.h),
child: Text(
S.of(context).yixiansquanbupinglun,
style: TextStyle(
fontSize: 12,
color: Color(0xff353535),
),
),
),
if (memberList == null || memberList.length == 0)
Container(
width: double.infinity,
alignment: Alignment.topCenter,
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,
),
],
);
}
///
_queryInformationLikes() async {
BaseData baseData = await apiService.informationLikes("");
if (baseData != null && baseData.isSuccess) {
// commentKey.currentState.setState(() {});
} else {
SmartDialog.showToast(baseData.msg, alignment: Alignment.center);
}
}
//
_queryMemberComment(String content) async {
// BaseData baseData = await apiService.memberComment({
// "content": content,
// "parentId": parenId,
// "relationalId":
// widget.arguments["activityId"] ?? widget.arguments["articleId"],
// "relationalType": 1
// }).catchError((error) {});
// if (baseData != null && baseData.isSuccess) {
// commentKey.currentState.initState();
// commentTextController.text = "";
// _toComment();
// }
}
///
_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;
}
}
});
}
}
}

6
lib/community/community_page.dart

@ -13,7 +13,8 @@ class CommunityPage extends StatefulWidget {
}
}
class _CommunityPage extends State<CommunityPage> with SingleTickerProviderStateMixin {
class _CommunityPage extends State<CommunityPage>
with SingleTickerProviderStateMixin {
TabController tabcontroller;
List<String> lables = [
@ -64,6 +65,9 @@ class _CommunityPage extends State<CommunityPage> with SingleTickerProviderState
tabs: lables.map((e) => MyTab(text: e)).toList(),
),
),
onTap: () {
Navigator.of(context).pushNamed('/router/release_dynamic');
},
action: SvgPicture.asset(
"assets/svg/shequ_fabu.svg",
fit: BoxFit.contain,

201
lib/community/community_view/community_comment.dart

@ -0,0 +1,201 @@
import 'package:flutter/material.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/member_comment_list.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:huixiang/view_widget/custom_image.dart';
import 'package:huixiang/view_widget/login_tips_dialog.dart';
import 'package:like_button/like_button.dart';
import 'package:shared_preferences/shared_preferences.dart';
class CommunityComment extends StatefulWidget {
MemberCommentList memberList;
Function(String id) queryCommentLike;
CommunityComment(this.memberList, this.queryCommentLike);
@override
State<StatefulWidget> createState() {
return _CommunityComment();
}
}
class _CommunityComment extends State<CommunityComment> {
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.symmetric(vertical: 8.w),
child: Column(
children: [
Container(
padding: EdgeInsets.symmetric(horizontal: 16.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
MImage(
widget.memberList.userAvatarUrl ?? "",
fit: BoxFit.cover,
isCircle: true,
width: 40,
height: 40,
fadeSrc: "assets/image/default_user.png",
errorSrc: "assets/image/default_user.png",
),
SizedBox(
width: 12.w,
),
Expanded(
child: Container(
// height: 60.h,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text.rich(
TextSpan(
children: [
TextSpan(
text: widget.memberList.username,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 12,
color: Colors.black,
),
),
],
),
textDirection: TextDirection.ltr,
),
SizedBox(
height: 3.h,
),
Text(
widget.memberList.createTime,
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 14,
color: Color(0xff808080),
),
),
],
),
),
flex: 1,
),
Tooltip(
message: S.of(context).dianzanxihuan_(S.of(context).pinglun),
child: Container(
alignment: Alignment.topRight,
child: LikeButton(
padding: EdgeInsets.all(10),
circleSize: 16,
circleColor: CircleColor(
start: Color(0xff00ddff),
end: Color(0xff0099cc),
),
bubblesColor: BubblesColor(
dotPrimaryColor: Color(0xff33b5e5),
dotSecondaryColor: Color(0xff0099cc),
),
bubblesSize: 15,
likeBuilder: (bool isLiked) {
return isLiked
? Image.asset(
"assets/image/icon_like.png",
width: 16,
height: 16,
)
: Image.asset(
"assets/image/icon_like_h.png",
width: 16,
height: 16,
);
},
isLiked: widget.memberList.liked ?? false,
onTap: (isLiked) async {
widget.queryCommentLike(widget.memberList.id);
return (widget.memberList == null || widget.memberList.liked == null)
? false
: widget.memberList.liked;
},
likeCount: widget.memberList.likes,
countBuilder: (int count, bool isLiked, String text) {
return Text(
text,
style: TextStyle(
color: Color(0xFF1A1A1A),
fontSize: 14,
),
);
},
),
),
),
],
),
),
Container(
padding: EdgeInsets.only(
left: 68.w,
right: 16.w,
top: 16.h,
bottom: 16.h,
),
child: Align(
alignment: Alignment.centerLeft,
child: Text(
widget.memberList.content,
style: TextStyle(
fontSize: 12,
color: Color(0xff1A1A1A),
),
),
),
),
SizedBox(
height: 12.h,
),
if (widget.memberList.parentContent != null)
Container(
margin: EdgeInsets.only(left: 68.w, right: 16.w),
decoration: BoxDecoration(
color: Color(0xffF2F2F2),
borderRadius: BorderRadius.circular(2.0),
),
child: Padding(
padding: EdgeInsets.only(left: 4.w, top: 4.h, bottom: 4.h),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"${widget.memberList.parentUserName}:" ?? "",
style: TextStyle(
fontSize: 14,
color: Color(0xff808080),
),
),
Expanded(
flex: 1,
child: Text(
widget.memberList.parentContent ?? "",
style: TextStyle(
fontSize: 14,
color: Color(0xff808080),
),
),
),
],
),
),
),
],
),
);
}
}

213
lib/community/community_view/community_dynamic.dart

@ -0,0 +1,213 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:huixiang/utils/font_weight.dart';
import 'package:huixiang/view_widget/icon_text.dart';
import 'package:huixiang/view_widget/round_button.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class CommunityDynamic extends StatefulWidget {
final int itemCount;
final Function(double height) heightFun;
final bool isDetails ;
CommunityDynamic({
Key key,
this.itemCount = 9,
this.heightFun,
this.isDetails = false,
}) : super(key: key);
@override
State<StatefulWidget> createState() {
return _CommunityDynamic();
}
}
class _CommunityDynamic extends State<CommunityDynamic> {
GlobalKey globalKey = GlobalKey();
double height = 0;
@override
Widget build(BuildContext context) {
return Column(
children: [
Container(
alignment: Alignment.topCenter,
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Color(0x08000000),
offset: Offset(0, 1),
blurRadius: 8,
spreadRadius: 0,
),
],
),
child: Column(
key: globalKey,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
height: 44,
child: Row(
children: [
ClipRRect(
child: Image.asset(
"assets/image/default_user.png",
width: 44,
height: 44,
),
borderRadius: BorderRadius.circular(22),
),
SizedBox(
width: 8,
),
Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"百花谷",
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF1A1A1A),
),
),
Text(
"2021.04.12",
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF808080),
),
),
],
),
],
),
),
RoundButton(
padding: EdgeInsets.symmetric(
horizontal: 8,
vertical: 3,
),
backgroup: Color(0xFF32A060),
textColor: Colors.white,
text: "关注",
radius: 20,
icons: SvgPicture.asset(
"assets/svg/shequ_fabu.svg",
fit: BoxFit.contain,
color: Colors.white,
width: 14,
height: 14,
),
),
],
),
SizedBox(
height: 12.h,
),
Text(
"文本,是指书面语言的表现形式,从文学角度说,通常是具有完整、系统含义(Message)的一个句子或多个句子的组说,通常是具有完整、系统含义(Message)的一个句子或多个句子的组或多个句子的组说。",
maxLines: 5,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Color(0xFF1A1A1A),
fontWeight: MyFontWeight.regular,
fontSize: 14.sp,
),
),
SizedBox(
height: 16.h,
),
if (widget.itemCount == 1)
Container(
width: MediaQuery.of(context).size.width / 2,
height: MediaQuery.of(context).size.width,
color: Colors.blue.withAlpha(123),
)
else
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount:
(widget.itemCount == 2 || widget.itemCount == 4) ? 2 : 3,
crossAxisSpacing: 12.w,
mainAxisSpacing: 12.w,
childAspectRatio: 1,
),
padding: EdgeInsets.zero,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, position) {
return Container(
color: Colors.blue.withAlpha(123),
);
},
itemCount: widget.itemCount,
),
if (!widget.isDetails)
SizedBox(
height: 12.h,
),
if (!widget.isDetails)
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
IconText(
"58",
space: 4.w,
leftImage: "assets/svg/liulanliang.svg",
iconSize: 16,
),
IconText(
"58",
space: 4.w,
leftImage: "assets/svg/pinglun.svg",
iconSize: 16,
),
IconText(
"58",
space: 4.w,
leftImage: "assets/svg/xihuan.svg",
iconSize: 16,
),
],
),
],
),
),
Container(
height: 16,
color: Color(0xFFF7F7F7),
)
],
);
}
@override
void didChangeDependencies() {
WidgetsBinding.instance.addPostFrameCallback(_getContainerHeight);
super.didChangeDependencies();
}
_getContainerHeight(_) {
height = globalKey.currentContext.size.height;
widget.heightFun(height);
print("height: $height");
}
}

408
lib/community/release_dynamic.dart

@ -0,0 +1,408 @@
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/upload_result.dart';
import 'package:huixiang/retrofit/retrofit_api.dart';
import 'package:huixiang/utils/font_weight.dart';
import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:image_pickers/image_pickers.dart';
import 'package:shared_preferences/shared_preferences.dart';
class ReleaseDynamic extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _ReleaseDynamic();
}
}
class _ReleaseDynamic extends State<ReleaseDynamic> {
int selectCount = 9;
List<Medias> mediaPaths = [];
bool isRelease = false;
int dynamicType = 0;
TextEditingController textEditingController = TextEditingController();
ApiService apiService;
@override
void initState() {
super.initState();
SharedPreferences.getInstance().then((value) {
apiService = ApiService(
Dio(),
context: context,
token: value.getString("token"),
showLoading: false,
);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppBar(
title: "写动态",
titleColor: Colors.black,
leadingColor: Colors.black,
background: Colors.white,
action: Container(
alignment: Alignment.center,
child: Container(
width: 46.w,
height: 24.h,
alignment: Alignment.center,
decoration: BoxDecoration(
color: isRelease ? Color(0xFF32A060) : Color(0xFFD8D8D8),
borderRadius: BorderRadius.circular(4),
),
child: Text(
"发布",
style: TextStyle(
color: isRelease ? Colors.white : Color(0xFFA0A0A0),
fontSize: 14.sp,
fontWeight: MyFontWeight.semi_bold,
),
),
),
),
onTap: () {
if (!isRelease) {
SmartDialog.showToast("请输入您此刻的想法!~");
return;
}
releaseDynamic();
},
),
body: Container(
child: Column(
children: [
buildEdit(),
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 12.w,
mainAxisSpacing: 12.w,
childAspectRatio: 1,
),
padding: EdgeInsets.all(16),
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, position) {
if (mediaPaths.length > position) {
return imageItem(mediaPaths[position]);
} else {
return addImageItem();
}
},
itemCount: (mediaPaths.length == 0)
? 1
: ((dynamicType == 2)
? 1
: mediaPaths.length >= 9
? 9
: (mediaPaths.length + 1)),
),
],
),
),
);
}
releaseDynamic() async {
String dynamicText = textEditingController.text;
if (dynamicText == null || dynamicText == "") {
SmartDialog.showToast("请输入您此刻的想法!~");
return;
}
EasyLoading.show(status: S.of(context).zhengzaijiazai);
fileUpload().then((value) async {
String subjectType = "text";
if (dynamicType == 0) {
subjectType = "text";
} else if (dynamicType == 1) {
subjectType = "image";
} else if (dynamicType == 2) {
subjectType = "video";
}
List<String> remoteImageUrls = [];
String remoteVideoUrl = "";
if (mediaPaths.length > 0) {
if (dynamicType == 1) {
remoteImageUrls = mediaPaths.map((e) => e.remotePath).toList();
} else if (dynamicType == 2) {
remoteVideoUrl = mediaPaths[0].remotePath;
}
}
BaseData<String> baseData = await apiService.trend({
"images": remoteImageUrls,
"subject": dynamicText,
"subjectType": subjectType,
"video": remoteVideoUrl,
}).catchError((onError) {
EasyLoading.dismiss();
});
if (baseData.isSuccess) {}
EasyLoading.dismiss();
});
}
///
Future<void> fileUpload() async {
if (mediaPaths != null && mediaPaths.length > 0) {
await Future.forEach(mediaPaths, (element) async {
if ((element.remotePath == null || element.remotePath == "") &&
(element != null &&
element.path != null &&
element.path != "" &&
await File(element.path).exists())) {
BaseData<UploadResult> baseData = await apiService.upload(
File(element.path),
123123123,
);
if (baseData != null && baseData.isSuccess) {
UploadResult uploadResult = baseData.data;
mediaPaths[mediaPaths.indexOf(element)].remotePath = uploadResult.url;
}
}
});
}
}
Widget imageItem(Medias media) {
return InkWell(
onTap: () {
showDeletePicker(media);
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
),
alignment: Alignment.center,
child: ClipRRect(
borderRadius: BorderRadius.circular(4),
child: Image.file(
File(media.galleryMode == GalleryMode.video
? media.thumbPath
: media.path),
fit: BoxFit.cover,
width: double.infinity,
height: double.infinity,
),
),
),
);
}
///
showImagePicker() {
if (dynamicType == 1) {
getImageOrVideo(GalleryMode.image);
return;
}
showCupertinoModalPopup(
context: context,
builder: (context) {
return CupertinoActionSheet(
title: Text("选择媒体文件"),
actions: [
CupertinoActionSheetAction(
child: Text("照片"),
onPressed: () {
getImageOrVideo(GalleryMode.image);
Navigator.of(context).pop();
},
isDefaultAction: true,
isDestructiveAction: false,
),
CupertinoActionSheetAction(
child: Text("视频"),
onPressed: () {
getImageOrVideo(GalleryMode.video);
Navigator.of(context).pop();
},
isDefaultAction: true,
isDestructiveAction: false,
),
],
cancelButton: CupertinoActionSheetAction(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(S.of(context).quxiao),
isDestructiveAction: true,
),
);
});
}
///
showDeletePicker(Medias media) {
showCupertinoModalPopup(
context: context,
builder: (context) {
return CupertinoActionSheet(
title: Text("动态"),
actions: [
CupertinoActionSheetAction(
child: Text("删除"),
onPressed: () {
mediaPaths.remove(media);
if (mediaPaths.length == 0) {
dynamicType = 0;
}
selectCount = 9 - mediaPaths.length;
Navigator.of(context).pop();
setState(() {});
},
isDefaultAction: true,
isDestructiveAction: false,
),
],
cancelButton: CupertinoActionSheetAction(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(S.of(context).quxiao),
isDestructiveAction: true,
),
);
});
}
Widget addImageItem() {
return InkWell(
onTap: () {
showImagePicker();
},
child: Container(
decoration: BoxDecoration(
color: Color(0xFFF2F2F2),
borderRadius: BorderRadius.circular(4),
),
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SvgPicture.asset(
"assets/svg/zhaopianshipin.svg",
width: 48,
height: 48,
fit: BoxFit.contain,
),
Text(
"照片/视频",
style: TextStyle(
fontWeight: MyFontWeight.semi_bold,
fontSize: 15.sp,
color: Color(0xFFCDCCCC),
),
),
],
),
),
);
}
Future getImageOrVideo(GalleryMode galleryMode) async {
if (selectCount == 0) return;
List<Media> medias = await ImagePickers.pickerPaths(
galleryMode: galleryMode,
selectCount: (galleryMode == GalleryMode.video) ? 1 : selectCount,
showGif: true,
showCamera: false,
compressSize: 500,
uiConfig: UIConfig(
uiThemeColor: Color(0xFFFFFFFF),
),
cropConfig: CropConfig(
enableCrop: false,
width: 200,
height: 200,
),
);
mediaPaths.addAll(medias.map((e) => Medias(e)).toList());
selectCount = 9 - mediaPaths.length;
if (mediaPaths.length > 0) {
if (galleryMode == GalleryMode.image) {
dynamicType = 1;
} else {
dynamicType = 2;
}
}
setState(() {});
}
///
Widget buildEdit() {
return Container(
height: 174.h,
margin: EdgeInsets.symmetric(horizontal: 16.w),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
width: 1.w,
color: Color(0xFFD8D8D8),
style: BorderStyle.solid,
),
),
),
child: TextField(
controller: textEditingController,
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF4C4C4C),
),
onChanged: (text) {
bool release = text != "" && text != null;
if (release != isRelease) {
isRelease = release;
setState(() {});
}
},
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(
vertical: 18.h,
),
errorBorder: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
hintText: "此时此刻的想法~",
hintStyle: TextStyle(
fontSize: 14.sp,
color: Color(0xFFA29E9E),
),
),
),
);
}
}
class Medias {
// Media media;
Medias(Media media) {
this.thumbPath = media.thumbPath;
this.path = media.path;
this.galleryMode = media.galleryMode;
}
String thumbPath;
String path;
GalleryMode galleryMode;
String remotePath;
}

93
lib/main.dart

@ -7,7 +7,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bmflocation/bdmap_location_flutter_plugin.dart';
// import 'package:flutter_bugly/flutter_bugly.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:huixiang/address/address_map_page.dart';
@ -15,6 +14,8 @@ import 'package:huixiang/address/edit_address_page.dart';
import 'package:huixiang/article/hot_article_details_page.dart';
import 'package:huixiang/article/hot_article_item.dart';
import 'package:huixiang/article/video_playback_page.dart';
import 'package:huixiang/community/community_details.dart';
import 'package:huixiang/community/release_dynamic.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/home/founder_story_page.dart';
import 'package:huixiang/integral/integral_detailed_page.dart';
@ -52,7 +53,6 @@ import 'package:huixiang/setting/help_feedback_page.dart';
import 'package:huixiang/setting/permission_setting_page.dart';
import 'package:huixiang/setting/setting_page.dart';
import 'package:huixiang/setting/treaty_page.dart';
// import 'package:huixiang/store/settlement.dart';
import 'package:huixiang/store/store_order.dart';
import 'package:huixiang/store/store_view/settlement.dart';
import 'package:huixiang/test_page.dart';
@ -118,7 +118,7 @@ initSdk() async {
if (Platform.isAndroid) {
XgAndroidApi androidApi = xgFlutterPlugin.getXgAndroidApi();
//
androidApi.setMiPushAppId(appId:"2882303761520050452");
androidApi.setMiPushAppId(appId: "2882303761520050452");
androidApi.setMiPushAppKey(appKey: "5582005091452");
androidApi.enableOtherPush();
@ -126,16 +126,24 @@ initSdk() async {
}
ShareSDKRegister shareSDKRegister = ShareSDKRegister();
shareSDKRegister.setupWechat("wx3b269e795ed23e5f",
"64020361b8ec4c99936c0e3999a9f249", "https://hx.lotus-wallet.com/app/");
shareSDKRegister.setupWechat(
"wx3b269e795ed23e5f",
"64020361b8ec4c99936c0e3999a9f249",
"https://hx.lotus-wallet.com/app/",
);
shareSDKRegister.setupFacebook(
"523308712059457", "d3a1b6377100871799d8973fbe84794a", "回乡");
"523308712059457",
"d3a1b6377100871799d8973fbe84794a",
"回乡",
);
SharesdkPlugin.regist(shareSDKRegister);
if (Platform.isIOS) {
LocationFlutterPlugin.setApiKey("ylW2QPlsbERkho7jOgU4GQSeawmdUIoR");
BMFMapSDK.setApiKeyAndCoordType(
'ylW2QPlsbERkho7jOgU4GQSeawmdUIoR', BMF_COORD_TYPE.COMMON);
'ylW2QPlsbERkho7jOgU4GQSeawmdUIoR',
BMF_COORD_TYPE.COMMON,
);
} else if (Platform.isAndroid) {
BMFMapSDK.setCoordType(BMF_COORD_TYPE.COMMON);
}
@ -218,30 +226,53 @@ class MyApp extends StatelessWidget {
}
Map<String, WidgetBuilder> routers = <String, WidgetBuilder>{
'/router/exchange_order_success_page': (context, {arguments}) => ExchangeOrderSuccessPage(arguments: arguments),
'/router/logistics_information_page': (context, {arguments}) => LogisticsInformationPage(arguments: arguments),
'/router/integral_store_page': (context, {arguments}) => IntegralStoreDetailsPage(arguments: arguments),
'/router/manage_address_page': (context, {arguments}) => ManageAddressPage(arguments: arguments),
'/router/exchange_order_page': (context, {arguments}) => ExchangeOrderPage(arguments: arguments),
'/router/mine_vip_level_page': (context, {arguments}) => MineVipLevelPage(arguments: arguments),
'/router/order_history_page': (context, {arguments}) => OrderHistoryPage(arguments: arguments),
'/router/union_detail_page': (context, {arguments}) => UnionDetailsPage(arguments: arguments),
'/router/address_edit_page': (context, {arguments}) => EditAddressPage(arguments: arguments),
'/router/vip_details_page': (context, {arguments}) => VipDetailPage(arguments: arguments),
'/router/order_details': (context, {arguments}) => OrderDetailPage(arguments: arguments),
'/router/exchange_order_success_page': (context, {arguments}) =>
ExchangeOrderSuccessPage(arguments: arguments),
'/router/logistics_information_page': (context, {arguments}) =>
LogisticsInformationPage(arguments: arguments),
'/router/integral_store_page': (context, {arguments}) =>
IntegralStoreDetailsPage(arguments: arguments),
'/router/manage_address_page': (context, {arguments}) =>
ManageAddressPage(arguments: arguments),
'/router/exchange_order_page': (context, {arguments}) =>
ExchangeOrderPage(arguments: arguments),
'/router/mine_vip_level_page': (context, {arguments}) =>
MineVipLevelPage(arguments: arguments),
'/router/order_history_page': (context, {arguments}) =>
OrderHistoryPage(arguments: arguments),
'/router/union_detail_page': (context, {arguments}) =>
UnionDetailsPage(arguments: arguments),
'/router/address_edit_page': (context, {arguments}) =>
EditAddressPage(arguments: arguments),
'/router/vip_details_page': (context, {arguments}) =>
VipDetailPage(arguments: arguments),
'/router/order_details': (context, {arguments}) =>
OrderDetailPage(arguments: arguments),
// '/router/hot_article_details_page': (context, {arguments}) => HotArticleDetailsPage(),
'/router/write_off_page': (context, {arguments}) => WriteOffPage(arguments: arguments),
'/router/hot_article_details_page': (context, {arguments}) => HotArticleDetailsPage(),
'/router/store_order': (context, {arguments}) => StoreOrderPage(arguments: arguments),
'/router/vip_balance': (context, {arguments}) => VipBalancePage(arguments: arguments),
'/router/exchange_order_details': (context, {arguments}) => ExchangeOrderDetailPage(),
'/router/location_map': (context, {arguments}) => LocationMap(arguments: arguments),
'/router/settlement': (context, {arguments}) => Settlement(arguments: arguments),
'/router/integral_detailed_page': (context, {arguments}) => IntegralDetailedPage(),
'/router/write_off_success_page': (context, {arguments}) => WriteOffSuccessPage(),
'/router/exchange_history_page': (context, {arguments}) => ExchangeHistoryPage(),
'/router/permission_setting': (context, {arguments}) => PermissionSettingPage(),
'/router/login_page': (context, {arguments}) => LoginPage(arguments: arguments),
'/router/write_off_page': (context, {arguments}) =>
WriteOffPage(arguments: arguments),
'/router/hot_article_details_page': (context, {arguments}) =>
HotArticleDetailsPage(),
'/router/store_order': (context, {arguments}) =>
StoreOrderPage(arguments: arguments),
'/router/vip_balance': (context, {arguments}) =>
VipBalancePage(arguments: arguments),
'/router/exchange_order_details': (context, {arguments}) =>
ExchangeOrderDetailPage(),
'/router/location_map': (context, {arguments}) =>
LocationMap(arguments: arguments),
'/router/settlement': (context, {arguments}) =>
Settlement(arguments: arguments),
'/router/integral_detailed_page': (context, {arguments}) =>
IntegralDetailedPage(),
'/router/write_off_success_page': (context, {arguments}) =>
WriteOffSuccessPage(),
'/router/exchange_history_page': (context, {arguments}) =>
ExchangeHistoryPage(),
'/router/permission_setting': (context, {arguments}) =>
PermissionSettingPage(),
'/router/login_page': (context, {arguments}) =>
LoginPage(arguments: arguments),
'/router/edit_name': (context, {arguments}) => EditName(arguments: arguments),
'/router/mine_card_invalid': (context, {arguments}) => MineCardInvalidPage(),
'/router/store_selector_page': (context, {arguments}) => StoreSelectorPage(),
@ -254,6 +285,8 @@ Map<String, WidgetBuilder> routers = <String, WidgetBuilder>{
'/router/hot_article_page': (context, {arguments}) => HotArticlePage(),
'/router/address_map_page': (context, {arguments}) => AddressMapPage(),
'/router/roll_center_page': (context, {arguments}) => RollCenterPage(),
'/router/release_dynamic': (context, {arguments}) => ReleaseDynamic(),
'/router/community_details': (context, {arguments}) => CommunityDetails(),
'/router/user_info_page': (context, {arguments}) => UserInfoPage(),
'/router/recharge_page': (context, {arguments}) => RechargePage(),
'/router/mine_wallet': (context, {arguments}) => MineWalletPage(),

97
lib/mine/user_info_page.dart

@ -12,8 +12,7 @@ import 'package:huixiang/retrofit/retrofit_api.dart';
import 'package:huixiang/utils/flutter_utils.dart';
import 'package:huixiang/view_widget/cupertino_date_picker.dart';
import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker_gallery_camera/image_picker_gallery_camera.dart';
import 'package:image_pickers/image_pickers.dart';
import 'package:intl/intl.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:shared_preferences/shared_preferences.dart';
@ -267,12 +266,17 @@ class _UserInfoPage extends State<UserInfoPage> {
///
openCamera() async {
if (await Permission.camera.isGranted) {
var image = await ImagePickerGC.pickImage(
context: context, source: ImgSource.Camera);
if (image == null) return;
var imageFile = await cropImage(image.path);
if (imageFile == null) return;
filePath = imageFile.path;
Media medias = await ImagePickers.openCamera(
cameraMimeType: CameraMimeType.photo,
cropConfig: CropConfig(
enableCrop: true,
width: 200,
height: 200,
),
compressSize: 500,
);
if (medias == null) return;
filePath = medias.path;
fileUpload();
} else {
await Permission.camera.request();
@ -285,11 +289,23 @@ class _UserInfoPage extends State<UserInfoPage> {
///
openStorage() async {
if (await Permission.storage.isGranted) {
var image = await ImagePickerGC.pickImage(
context: context, source: ImgSource.Gallery);
var imageFile = await cropImage(image.path);
if (imageFile == null) return;
filePath = imageFile.path;
List<Media> medias = await ImagePickers.pickerPaths(
galleryMode: GalleryMode.image,
selectCount: 1,
showGif: true,
showCamera: false,
compressSize: 500,
uiConfig: UIConfig(
uiThemeColor: Color(0xFFFFFFFF),
),
cropConfig: CropConfig(
enableCrop: true,
width: 200,
height: 200,
),
);
if (medias == null || medias.length == 0) return;
filePath = medias[0].path;
setState(() {});
fileUpload();
} else {
@ -298,34 +314,33 @@ class _UserInfoPage extends State<UserInfoPage> {
}
}
Future<File> cropImage(imagePath) async {
File croppedFile = await ImageCropper.cropImage(
sourcePath: imagePath,
aspectRatioPresets: [
CropAspectRatioPreset.square,
// CropAspectRatioPreset.ratio3x2,
// CropAspectRatioPreset.original,
// CropAspectRatioPreset.ratio4x3,
// CropAspectRatioPreset.ratio16x9
],
aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1),
androidUiSettings: AndroidUiSettings(
toolbarTitle: 'Cropper',
toolbarColor: Colors.black,
toolbarWidgetColor: Colors.white,
initAspectRatio: CropAspectRatioPreset.square,
hideBottomControls: true,
lockAspectRatio: false),
iosUiSettings: IOSUiSettings(
minimumAspectRatio: 1.0,
resetAspectRatioEnabled: false,
aspectRatioPickerButtonHidden: true,
rectWidth: 500.w,
rectHeight: 500.h,
));
return croppedFile;
}
// Future<File> cropImage(imagePath) async {
// File croppedFile = await ImageCropper.cropImage(
// sourcePath: imagePath,
// aspectRatioPresets: [
// CropAspectRatioPreset.square,
// // CropAspectRatioPreset.ratio3x2,
// // CropAspectRatioPreset.original,
// // CropAspectRatioPreset.ratio4x3,
// // CropAspectRatioPreset.ratio16x9
// ],
// aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1),
// androidUiSettings: AndroidUiSettings(
// toolbarTitle: 'Cropper',
// toolbarColor: Colors.black,
// toolbarWidgetColor: Colors.white,
// initAspectRatio: CropAspectRatioPreset.square,
// hideBottomControls: true,
// lockAspectRatio: false),
// iosUiSettings: IOSUiSettings(
// minimumAspectRatio: 1.0,
// resetAspectRatioEnabled: false,
// aspectRatioPickerButtonHidden: true,
// rectWidth: 500.w,
// rectHeight: 500.h,
// ));
// return croppedFile;
// }
///
modifyInfos() async {

22
lib/qr/qr_code_scan.dart

@ -5,7 +5,7 @@ import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:huixiang/view_widget/tips_dialog.dart';
import 'package:image_picker_gallery_camera/image_picker_gallery_camera.dart';
import 'package:image_pickers/image_pickers.dart';
import 'package:permission_handler/permission_handler.dart';
class QrCodeScanPage extends StatefulWidget {
@ -111,9 +111,23 @@ class _QrCodeScanPage extends State<QrCodeScanPage> {
///
openStorage() async {
if (await Permission.storage.isGranted) {
var image = await ImagePickerGC.pickImage(
context: context, source: ImgSource.Gallery);
String filePath = image.path;
List<Media> medias = await ImagePickers.pickerPaths(
galleryMode: GalleryMode.image,
selectCount: 1,
showGif: true,
showCamera: false,
compressSize: 500,
uiConfig: UIConfig(
uiThemeColor: Color(0xFFFFFFFF),
),
cropConfig: CropConfig(
enableCrop: true,
width: 200,
height: 200,
),
);
if (medias == null || medias.length == 0) return;
String filePath = medias[0].path;
final String data = await FlutterQrReader.imgScan(filePath);
showData(data);
} else {

6
lib/retrofit/retrofit_api.dart

@ -362,4 +362,10 @@ abstract class ApiService {
///
@POST("/order/settlement")
Future<BaseData<String>> settlement(@Body() Map<String, String> map);
///
@POST("/information/trend")
Future<BaseData<String>> trend(@Body() Map<String, dynamic> map);
}

23
lib/retrofit/retrofit_api.g.dart

@ -1205,4 +1205,27 @@ class _ApiService implements ApiService {
);
return value;
}
@override
Future<BaseData<String>> trend(map) async {
ArgumentError.checkNotNull(map, 'map');
const _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _data = <String, dynamic>{};
_data.addAll(map ?? <String, dynamic>{});
final _result = await _dio.request<Map<String, dynamic>>(
'/information/trend',
queryParameters: queryParameters,
options: RequestOptions(
method: 'POST',
headers: <String, dynamic>{},
extra: _extra,
baseUrl: baseUrl),
data: _data);
final value = BaseData<String>.fromJson(
_result.data,
(json) => json as String,
);
return value;
}
}

247
lib/store/store_view/settlement.dart

@ -126,116 +126,8 @@ class _Settlement extends State<Settlement> {
height: 16,
),
Container(
margin: EdgeInsets.only(
left: 16,
right: 16,
),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Color(0x0D000000),
offset: Offset(0, 3),
blurRadius: 14,
spreadRadius: 0,
),
],
borderRadius: BorderRadius.circular(8),
),
padding: EdgeInsets.symmetric(
horizontal: 12.w,
vertical: 15.h,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
S.of(context).yuliudianhua,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF4C4C4C),
),
),
SizedBox(
width: 50,
),
Expanded(
child: isEdit
? Container(
height: 30.h,
alignment: Alignment.centerRight,
child: TextField(
controller: _vc,
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF4C4C4C),
),
textAlign: TextAlign.right,
textAlignVertical: TextAlignVertical.center,
keyboardType: TextInputType.phone,
decoration: InputDecoration(
errorBorder: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
hintText: "",
hintStyle: TextStyle(
fontSize: 10.sp,
color: Color(0xFFA29E9E),
),
),
textInputAction: TextInputAction.next,
inputFormatters: [
LengthLimitingTextInputFormatter(11)
],
cursorColor: Colors.grey,
),
)
: Container(
height: 30.h,
alignment: Alignment.centerRight,
child: Text(
storeInfo != null
? storeInfo.headMobile
: "",
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.end,
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF4C4C4C),
),
),
),
),
GestureDetector(
onTap: () {
setState(() {
this.isEdit = !this.isEdit;
});
},
child: Container(
padding: EdgeInsets.all(8),
child: isEdit
? Icon(
Icons.check,
size: 14.w,
color: Color(0xFF32A060),
)
: Image.asset(
"assets/image/pen.png",
height: 14.h,
width: 14.w,
),
),
),
],
),
),
///
phoneWidget(),
///
SettlementOrderCommodity(settleOrderInfo, 0),
@ -288,18 +180,16 @@ class _Settlement extends State<Settlement> {
SizedBox(
width: 28,
),
GestureDetector(
onTap: () {},
child: RoundButton(
width: 103.w,
height: 54.h,
text: S.current.jiesuan,
textColor: Colors.white,
fontWeight: MyFontWeight.regular,
backgroup: Color(0xFF32A060),
fontSize: 16.sp,
padding: EdgeInsets.symmetric(vertical: 5.h),
),
RoundButton(
width: 103.w,
height: 54.h,
text: S.current.jiesuan,
textColor: Colors.white,
fontWeight: MyFontWeight.regular,
backgroup: Color(0xFF32A060),
fontSize: 16.sp,
padding: EdgeInsets.symmetric(vertical: 5.h,),
callback: () {},
),
],
),
@ -309,6 +199,117 @@ class _Settlement extends State<Settlement> {
);
}
///
Widget phoneWidget() {
return Container(
margin: EdgeInsets.only(
left: 16,
right: 16,
),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Color(0x0D000000),
offset: Offset(0, 3),
blurRadius: 14,
spreadRadius: 0,
),
],
borderRadius: BorderRadius.circular(8),
),
padding: EdgeInsets.symmetric(
horizontal: 12.w,
vertical: 15.h,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
S.of(context).yuliudianhua,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF4C4C4C),
),
),
SizedBox(
width: 50,
),
Expanded(
child: isEdit
? Container(
height: 25.h,
alignment: Alignment.centerRight,
child: TextField(
controller: _vc,
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF4C4C4C),
),
textAlign: TextAlign.right,
textAlignVertical: TextAlignVertical.center,
keyboardType: TextInputType.phone,
decoration: InputDecoration(
errorBorder: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
hintText: "",
hintStyle: TextStyle(
fontSize: 10.sp,
color: Color(0xFFA29E9E),
),
),
textInputAction: TextInputAction.next,
inputFormatters: [LengthLimitingTextInputFormatter(11)],
cursorColor: Colors.grey,
),
)
: Container(
height: 25.h,
alignment: Alignment.centerRight,
child: Text(
storeInfo != null ? storeInfo.headMobile : "",
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.end,
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF4C4C4C),
),
),
),
),
GestureDetector(
onTap: () {
setState(() {
this.isEdit = !this.isEdit;
});
},
child: Container(
padding: EdgeInsets.all(8),
child: isEdit
? Icon(
Icons.check,
size: 14.w,
color: Color(0xFF32A060),
)
: Image.asset(
"assets/image/pen.png",
height: 14.h,
width: 14.w,
),
),
),
],
),
);
}
///+
Widget distributionMode() {
return Container(
height: 143.h,
@ -570,6 +571,7 @@ class _Settlement extends State<Settlement> {
);
}
///
Widget activityRemarks() {
return Container(
decoration: BoxDecoration(
@ -672,6 +674,7 @@ class _Settlement extends State<Settlement> {
);
}
///
Widget payMethod() {
return Container(
width: double.infinity,

23
lib/union/union_page.dart

@ -19,6 +19,7 @@ import 'package:huixiang/view_widget/classic_header.dart';
import 'package:huixiang/view_widget/custom_image.dart';
import 'package:huixiang/view_widget/icon_text.dart';
import 'package:huixiang/view_widget/item_title.dart';
import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter/rendering.dart';
@ -221,9 +222,10 @@ class _UnionPage extends State<UnionPage>
},
child: Scaffold(
resizeToAvoidBottomInset: false,
appBar: PreferredSize(
preferredSize: Size(double.infinity, 75.h),
child: buildSearchItem(),
appBar: MyAppBar(
titleChild: buildSearchItem(),
leading: false,
brightness: Brightness.light,
),
body: Column(
children: [
@ -268,13 +270,6 @@ class _UnionPage extends State<UnionPage>
itemBuilder: (context, position) {
return GestureDetector(
onTap: () {
// Navigator.of(context).pushNamed(
// '/router/union_detail_page',
// arguments: {
// "id": storeList[position].id,
// "storeName": storeList[position].storeName
// });
Navigator.of(context).pushNamed(
'/router/store_order',
arguments: {
@ -301,11 +296,11 @@ class _UnionPage extends State<UnionPage>
Widget buildSearchItem() {
return Container(
height: 36.h,
margin: EdgeInsets.fromLTRB(16.w, 40, 16.w, 0),
margin: EdgeInsets.fromLTRB(6.w, 0, 14.w, 0),
padding: EdgeInsets.fromLTRB(0, 6.h, 0, 6.h),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(4)),
borderRadius: BorderRadius.circular(4),
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(12),
@ -323,7 +318,9 @@ class _UnionPage extends State<UnionPage>
controller: editingController,
cursorHeight: 30.h,
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(vertical: 12.h),
contentPadding: EdgeInsets.symmetric(
vertical: 12.h,
),
prefixIcon: Icon(
Icons.search,
size: 24,

57
lib/web/web_page.dart

@ -58,7 +58,6 @@ class _WebPage extends State<WebPage> with WidgetsBindingObserver {
if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
queryHtml();
}
bool isKeyBoardShow = false;
@ -91,17 +90,22 @@ class _WebPage extends State<WebPage> with WidgetsBindingObserver {
queryHtml() async {
SharedPreferences value = await SharedPreferences.getInstance();
if (apiService == null)
apiService = ApiService(Dio(), context: context, token: value.getString("token"));
apiService =
ApiService(Dio(), context: context, token: value.getString("token"));
if (widget.arguments["activityId"] != null) {
BaseData<Activity> baseData = await apiService.activityInfo(widget.arguments["activityId"]).catchError((onError){});
BaseData<Activity> baseData = await apiService
.activityInfo(widget.arguments["activityId"])
.catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
activity = baseData.data;
setState(() {});
}
}
if (widget.arguments["articleId"] != null) {
BaseData<Article> baseData = await apiService.informationInfo(widget.arguments["articleId"]).catchError((onError){});
BaseData<Article> baseData = await apiService
.informationInfo(widget.arguments["articleId"])
.catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
article = baseData.data;
setState(() {});
@ -115,7 +119,7 @@ class _WebPage extends State<WebPage> with WidgetsBindingObserver {
"content": content,
"parentId": parenId,
"relationalId":
widget.arguments["activityId"] ?? widget.arguments["articleId"],
widget.arguments["activityId"] ?? widget.arguments["articleId"],
"relationalType": 1
}).catchError((error) {});
if (baseData != null && baseData.isSuccess) {
@ -150,7 +154,12 @@ class _WebPage extends State<WebPage> with WidgetsBindingObserver {
: article != null
? article.coverImg
: "",
"", buildShareUrl(), "", "", "", "",
"",
buildShareUrl(),
"",
"",
"",
"",
SSDKContentTypes.webpage,
);
@ -224,9 +233,9 @@ class _WebPage extends State<WebPage> with WidgetsBindingObserver {
title: activity != null
? activity.mainTitle
: article != null
? article.mainTitle
: "",
titleSize:fontSize,
? article.mainTitle
: "",
titleSize: fontSize,
titleColor: Colors.black,
),
body: Container(
@ -246,24 +255,23 @@ class _WebPage extends State<WebPage> with WidgetsBindingObserver {
child: Column(
children: [
///
WebHeader(widget.arguments, activity, article,16),
WebHeader(widget.arguments, activity, article, 16),
///
WebContent(activity, article, (){
WebContent(activity, article, () {
setState(() {});
}),
///
CommentList(
commentKey,
widget.arguments,
activity,
article,
isKeyBoardShow,
_reply,
_delCommentTips,
12.sp
),
commentKey,
widget.arguments,
activity,
article,
isKeyBoardShow,
_reply,
_delCommentTips,
12.sp),
],
),
),
@ -275,14 +283,14 @@ class _WebPage extends State<WebPage> with WidgetsBindingObserver {
InputComment(
inputKey,
hintText,
activity,
article,
isKeyBoardShow,
commentFocus,
commentTextController,
_toComment,
_queryMemberComment,
_queryInformationLikes,
activity: activity,
article: article,
),
],
),
@ -318,10 +326,11 @@ class _WebPage extends State<WebPage> with WidgetsBindingObserver {
if (commentKey.currentContext == null) return;
RenderBox firstRenderBox = commentKey.currentContext.findRenderObject();
Offset first = firstRenderBox.localToGlobal(Offset.zero);
scrollController.animateTo(first.dy + scrollController.offset -
scrollController.animateTo(
first.dy +
scrollController.offset -
(kToolbarHeight + MediaQuery.of(context).padding.top),
duration: Duration(milliseconds: 300),
curve: Curves.easeIn);
}
}

5
lib/web/web_view/comment_list.dart

@ -130,8 +130,7 @@ class _CommentList extends State<CommentList> {
showPressMenu(memberList[position].createUser,
memberList[position]);
},
child: commentItem(
memberList[position], position, memberList.length),
child: commentItem(memberList[position]),
),
);
},
@ -247,7 +246,7 @@ class _CommentList extends State<CommentList> {
});
}
Widget commentItem(MemberCommentList memberList, int index, int max) {
Widget commentItem(MemberCommentList memberList) {
return Container(
padding: EdgeInsets.symmetric(vertical: 8.w),
child: Column(

7
lib/web/web_view/input_comment.dart

@ -19,14 +19,17 @@ class InputComment extends StatefulWidget {
InputComment(
Key key,
this.hintText,
this.activity,
this.article,
this.isKeyBoardShow,
this.commentFocus,
this.commentTextController,
this.toComment,
this.queryMemberComment,
this.queryInformationLikes,
{
this.activity,
this.article,
}
) : super(key: key);
@override

27
pubspec.lock

@ -490,34 +490,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.4"
image_cropper:
image_pickers:
dependency: "direct main"
description:
name: image_cropper
name: image_pickers
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.1"
image_picker:
dependency: transitive
description:
name: image_picker
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.6.7+22"
image_picker_gallery_camera:
dependency: "direct main"
description:
name: image_picker_gallery_camera
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.6"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.6"
version: "2.0.0"
import_js_library:
dependency: transitive
description:

13
pubspec.yaml

@ -58,8 +58,17 @@ dependencies:
qr_flutter: ^4.0.0
url_launcher: ^5.0.0
image_cropper: ^1.4.1
image_picker_gallery_camera: ^0.1.6
# image_cropper: ^1.4.1
# image_picker_gallery_camera: ^0.1.6
#多图, 裁剪
image_pickers: ^2.0.0
# 数量,视频时长
# images_picker: ^1.2.4
# 多图,带UI
# wechat_assets_picker: ^4.2.2
path_provider: ^1.2.0
cached_network_image: ^2.0.0

Loading…
Cancel
Save