Browse Source

Merge remote-tracking branch 'origin/dev' into remove_uniapp

ff_new
fmk 3 years ago
parent
commit
46e08466a3
  1. BIN
      assets/image/2x/home_coupon.png
  2. BIN
      assets/image/2x/home_order.png
  3. BIN
      assets/image/2x/home_recharge.png
  4. BIN
      assets/image/2x/integral_return.png
  5. BIN
      assets/image/2x/ketang.png
  6. BIN
      assets/image/2x/ketang_like.png
  7. BIN
      assets/image/2x/ketang_message.png
  8. BIN
      assets/image/2x/ketang_play.png
  9. BIN
      assets/image/3x/home_coupon.png
  10. BIN
      assets/image/3x/home_order.png
  11. BIN
      assets/image/3x/home_recharge.png
  12. BIN
      assets/image/3x/integral_return.png
  13. BIN
      assets/image/3x/ketang.png
  14. BIN
      assets/image/3x/ketang_like.png
  15. BIN
      assets/image/3x/ketang_message.png
  16. BIN
      assets/image/3x/ketang_play.png
  17. BIN
      assets/image/home_coupon.png
  18. BIN
      assets/image/home_order.png
  19. BIN
      assets/image/home_recharge.png
  20. BIN
      assets/image/integral_return.png
  21. BIN
      assets/image/ketang.png
  22. BIN
      assets/image/ketang_like.png
  23. BIN
      assets/image/ketang_message.png
  24. BIN
      assets/image/ketang_play.png
  25. 278
      lib/community/community_course.dart
  26. 6
      lib/community/community_details.dart
  27. 9
      lib/community/community_page.dart
  28. 615
      lib/community/community_view/class_details.dart
  29. 196
      lib/community/community_view/class_list_view.dart
  30. 71
      lib/community/community_view/class_title_tab.dart
  31. 119
      lib/community/community_view/course_banner.dart
  32. 264
      lib/community/community_view/home_class.dart
  33. 29
      lib/home/home_page.dart
  34. 30
      lib/home/home_view/home_banner.dart
  35. 3
      lib/home/home_view/home_integral_store.dart
  36. 2
      lib/home/home_view/quick_order.dart
  37. 162
      lib/home/home_view/shortcut_operation.dart
  38. 14
      lib/home/home_view/sign_view.dart
  39. 8
      lib/home/huixiang_view/huixiang_banner.dart
  40. 25
      lib/home/points_mall_view/points_goods_view.dart
  41. 9
      lib/home/points_mall_view/points_mall_banner.dart
  42. 1
      lib/integral/integral_detailed_page.dart
  43. 4
      lib/integral/integral_page.dart
  44. 137
      lib/integral_store/integral_store_details_page.dart
  45. 2
      lib/main.dart
  46. 6
      lib/main_page.dart
  47. 2
      lib/mine/coupons_page.dart
  48. 1
      lib/mine/fans_page.dart
  49. 3
      lib/mine/mine_view/community_follow.dart
  50. 2
      lib/mine/mine_wallet_page.dart
  51. 4
      lib/mine/user_info_page.dart
  52. 561
      lib/order/exchange_order_page.dart
  53. 1
      lib/order/order_view/order_status.dart
  54. 114
      lib/retrofit/data/category_select_list.dart
  55. 136
      lib/retrofit/data/chapter.dart
  56. 114
      lib/retrofit/data/collect_class_list.dart
  57. 222
      lib/retrofit/data/course_details.dart
  58. 220
      lib/retrofit/data/course_list.dart
  59. 11
      lib/retrofit/min_api.dart
  60. 2
      lib/retrofit/min_api.g.dart
  61. 45
      lib/retrofit/retrofit_api.dart
  62. 190
      lib/retrofit/retrofit_api.g.dart
  63. 13
      lib/settlement/settlement.dart
  64. 11
      lib/store/store_order.dart
  65. 2
      lib/store/store_view/shop_car.dart
  66. 12
      lib/store/store_view/shop_goods.dart
  67. 9
      lib/store/store_view/store_order_list.dart
  68. 3
      lib/union/union_page.dart
  69. 4
      lib/view_widget/my_appbar.dart
  70. 6
      lib/web/web_page.dart
  71. 50
      lib/web/web_view/comment_list.dart

BIN
assets/image/2x/home_coupon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
assets/image/2x/home_order.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

BIN
assets/image/2x/home_recharge.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
assets/image/2x/integral_return.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
assets/image/2x/ketang.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

BIN
assets/image/2x/ketang_like.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B

BIN
assets/image/2x/ketang_message.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

BIN
assets/image/2x/ketang_play.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

BIN
assets/image/3x/home_coupon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
assets/image/3x/home_order.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
assets/image/3x/home_recharge.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
assets/image/3x/integral_return.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
assets/image/3x/ketang.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
assets/image/3x/ketang_like.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
assets/image/3x/ketang_message.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

BIN
assets/image/3x/ketang_play.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B

BIN
assets/image/home_coupon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
assets/image/home_order.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
assets/image/home_recharge.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
assets/image/integral_return.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

BIN
assets/image/ketang.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

BIN
assets/image/ketang_like.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

BIN
assets/image/ketang_message.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

BIN
assets/image/ketang_play.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

278
lib/community/community_course.dart

@ -0,0 +1,278 @@
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:huixiang/main.dart';
import 'package:huixiang/retrofit/data/banner.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/brand.dart';
import 'package:huixiang/retrofit/data/category_select_list.dart';
import 'package:huixiang/retrofit/data/collect_class_list.dart';
import 'package:huixiang/retrofit/data/course_list.dart';
import 'package:huixiang/retrofit/data/page.dart';
import 'package:huixiang/retrofit/retrofit_api.dart';
import 'package:huixiang/utils/event_type.dart';
import 'package:huixiang/view_widget/classic_header.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:huixiang/view_widget/store_title_tab.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'community_view/class_list_view.dart';
import 'community_view/class_title_tab.dart';
import 'community_view/course_banner.dart';
import 'community_view/home_class.dart';
class CommunityCourse extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _CommunityCourse();
}
}
class _CommunityCourse extends State<CommunityCourse>
with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin {
final ScrollController scrollController = ScrollController();
final RefreshController refreshController = RefreshController();
ApiService apiService;
List<GlobalKey> globaKeys = [];
List<Brand> brands = [];
List<BannerData> bannerData = [];
List<CategorySelectList> classSelectList = [];
List<CourseList> classList = [];
List<CourseList> classTabList = [];
List<CollectClassList> collectList = [];
List<CourseList> collect = [];
int checkIndex = 0;
@override
void initState() {
super.initState();
eventBus.on<EventType>().listen((event) {
print("object: CommunityCourse");
if (event.type < 3) {
setState(() {});
}
});
queryCourseBanner();
classListAsync();
collectionList();
}
///banner
queryCourseBanner() async {
if (apiService == null) {
SharedPreferences value = await SharedPreferences.getInstance();
apiService = ApiService(
Dio(),
context: context,
token: value.getString("token"),
);
}
BaseData<PageInfo<BannerData>> baseData =
await apiService.queryBanner({
"model": {"type": "COURSE_BANNER"},
}).catchError((onError) {
refreshController.refreshFailed();
});
if (baseData != null && baseData.isSuccess) {
bannerData.clear();
bannerData.addAll(baseData.data.records);
refreshController.refreshCompleted();
} else {
refreshController.refreshFailed();
}
EasyLoading.dismiss();
}
///
classListAsync() async {
if (apiService == null) {
SharedPreferences value = await SharedPreferences.getInstance();
apiService = ApiService(
Dio(),
context: context,
token: value.getString("token"),
);
}
BaseData<List<CategorySelectList>> baseData = await apiService.categoryList().catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
setState(() {
classSelectList = baseData.data;
});
queryClassList("");
}
EasyLoading.dismiss();
}
///
queryClassList(categoryId) async {
if (apiService == null) {
SharedPreferences value = await SharedPreferences.getInstance();
apiService = ApiService(
Dio(),
context: context,
token: value.getString("token"),
);
}
BaseData<PageInfo<CourseList>> baseData = await apiService.courseList({
"categoryId":categoryId,
"pageNum": 1,
"pageSize":10,
"searchKey": "",
"state":0
}).catchError((error) {
if(categoryId == ""){
refreshController.refreshFailed();
refreshController.loadFailed();
}
});
if (baseData.isSuccess) {
if(categoryId == "") {
refreshController.refreshCompleted();
refreshController.loadComplete();
setState(() {
classList.clear();
classList.addAll(baseData.data.list);
});
if(classSelectList.length > 0)
queryClassList(classSelectList[checkIndex].id);
}else{
setState(() {
classTabList.clear();
classTabList.addAll(baseData.data.list);
});
}
}
}
///
collectionList() async {
if (apiService == null) {
SharedPreferences value = await SharedPreferences.getInstance();
apiService = ApiService(
Dio(),
context: context,
token: value.getString("token"),
);
}
BaseData<List<CollectClassList>> baseData = await apiService.collectList().catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
setState(() {
collectList.clear();
collectList.addAll(baseData.data);
if(collectList.length > 0)
collectCourse(collectList[0].id);
});
}
EasyLoading.dismiss();
}
///
collectCourse(collectId) async {
if (apiService == null) {
SharedPreferences value = await SharedPreferences.getInstance();
apiService = ApiService(
Dio(),
context: context,
token: value.getString("token"),
);
}
BaseData<List<CourseList>> baseData = await apiService.collect(collectId).catchError((error) {
});
if (baseData != null && baseData.isSuccess) {
setState(() {
collect.clear();
collect.addAll(baseData.data);
});
}
}
_onRefresh(){
classListAsync();
}
@override
Widget build(BuildContext context) {
super.build(context);
return
Stack(
children: [
Positioned(
child: Container(
child: SmartRefresher(
controller: refreshController,
enablePullDown: true,
enablePullUp: false,
header: MyHeader(),
physics: ClampingScrollPhysics(),
onRefresh: _onRefresh,
scrollController: scrollController,
child: Container(
child: SingleChildScrollView(
physics: NeverScrollableScrollPhysics(),
child: Container(
color: Color(0xFFF7F7F7),
margin: EdgeInsets.only(top: 16.h),
child: Column(
children: classChildItem(),
),
),
),
),
),
),
bottom:0,
top: 0,
left: 0,
right: 0,
),
if (brands != null && brands.length > 0)
Positioned(
child: Container(
color: Colors.white,
child: StoreTitleTab(
brands,
globaKeys,
scrollController,
isScroll: true,
),
),
top: 0,
left: 0,
right: 0,
),
],
);
}
List<Widget> classChildItem() {
var widgets = <Widget>[
///banner
CourseBanner(bannerData,),
SizedBox(height: 28),
///
HomeClass(collect,collectList,),
///
ClassTitleTab(classSelectList,(index){
checkIndex = index;
queryClassList(classSelectList[index].id);
}),
///
ClassListView(classTabList),
];
return widgets;
}
@override
bool get wantKeepAlive => true;
}

6
lib/community/community_details.dart

@ -138,10 +138,14 @@ class _CommunityDetails extends State<CommunityDetails> with WidgetsBindingObser
commentKey,
comunity?.likes ?? comunity?.likes.toString() ?? 0,
comunity.id,
1,
isKeyBoardShow,
_reply,
_delCommentTips,
12.sp,
requestApiFinish: (total){setState(() {
commentTotal = total;
});},
),
if (memberList == null || memberList.length == 0)
Container(
@ -186,7 +190,7 @@ class _CommunityDetails extends State<CommunityDetails> with WidgetsBindingObser
////
_queryInformationLikes() async {
BaseData baseData = await apiService.informationLikes(comunity.id);
BaseData baseData = await apiService.informationLikes(comunity.id).catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
commentKey.currentState.setState(() {});
setState(() {

9
lib/community/community_page.dart

@ -7,6 +7,8 @@ import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:huixiang/view_widget/my_tab.dart';
import 'community_course.dart';
class CommunityPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
@ -22,8 +24,8 @@ class _CommunityPage extends State<CommunityPage>
"关注",
"推荐",
"头条",
"课程",
"关于我们",
// "课程",
// "直播",
];
@ -96,7 +98,10 @@ class _CommunityPage extends State<CommunityPage>
return BrandPage();
}else if(e == "头条"){
return HotArticlePage();
} else {
}else if(e == "课程"){
return CommunityCourse();
}
else {
return CommunityChildPage(e);
}
}).toList(),

615
lib/community/community_view/class_details.dart

@ -0,0 +1,615 @@
import 'dart:io';
import 'package:chewie/chewie.dart';
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:huixiang/generated/l10n.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/chapter.dart';
import 'package:huixiang/retrofit/data/course_details.dart';
import 'package:huixiang/retrofit/retrofit_api.dart';
import 'package:huixiang/utils/font_weight.dart';
import 'package:huixiang/view_widget/custom_image.dart';
import 'package:chewie/src/chewie_progress_colors.dart' as chewie;
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';
import 'package:video_player/video_player.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class ClassDetails extends StatefulWidget {
final Map<String, dynamic> arguments;
ClassDetails({this.arguments});
@override
State<StatefulWidget> createState() {
return _ClassDetails();
}
}
class _ClassDetails extends State<ClassDetails> with WidgetsBindingObserver{
VideoPlayerController videoPlayerController;
Chewie chewies;
ChewieController chewieAudioController;
ApiService apiService;
final GlobalKey commentKey = GlobalKey();
final ScrollController scrollController = ScrollController();
bool isKeyBoardShow = false;
var commentFocus = FocusNode();
String parenId = "0";
String hintText = S.current.liuxianinjingcaidepinglunba;
final GlobalKey inputKey = GlobalKey();
final TextEditingController commentTextController = TextEditingController();
int commentTotal = 0;
CourseDetails course;
List<Chapter> chapterList = [];
bool isShowImg = true;
int chapterIndex = 0;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
courseDetails(widget.arguments["id"]);
queryChapterList(widget.arguments["id"]);
}
///
queryChapterList(courseId) async {
if (apiService == null) {
SharedPreferences value = await SharedPreferences.getInstance();
apiService = ApiService(
Dio(),
context: context,
token: value.getString("token"),
);
}
BaseData<List<Chapter>> baseData = await apiService.catalogList(courseId).catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
setState(() {
chapterList.clear();
chapterList.addAll(baseData.data);
chapterIndex = 0;
initVideo(chapterList[chapterIndex].content.fileUrl);
});
}
EasyLoading.dismiss();
}
///
courseDetails(id) async {
if (apiService == null) {
SharedPreferences value = await SharedPreferences.getInstance();
apiService = ApiService(
Dio(),
context: context,
token: value.getString("token"),
);
}
BaseData<CourseDetails> baseData = await apiService.course(id).catchError((error) {});
if (baseData != null && baseData.isSuccess) {
setState(() {
course = baseData.data;
});
}
}
@override
void dispose() {
/**
*
*/
if (chewieAudioController != null) {
chewieAudioController.pause();
chewieAudioController.dispose();
chewieAudioController = null;
}
if (videoPlayerController != null) {
videoPlayerController.pause();
videoPlayerController.dispose();
}
super.dispose();
}
@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
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child:Column(
children: [
Expanded(
child: SingleChildScrollView(
physics: BouncingScrollPhysics(),
child: Column(
children: [
Stack(
children: [
videoWidget(
MediaQuery.of(context).size.width,
videoPlayerController != null
? (MediaQuery.of(context).size.width) /
videoPlayerController.value.aspectRatio
: MediaQuery.of(context).size.width / 2,
chapterList.length>chapterIndex?chapterList[chapterIndex].content.coverImg:"",
),
Container(
margin: EdgeInsets.only(top: 40.h, left: 16.w, right: 16.w),
decoration: BoxDecoration(
color: Colors.transparent,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
child: Image.asset(
"assets/image/integral_return.png",
width: 24,
height: 24,
),
onTap: () {
Navigator.of(context).pop(course.viewers+1);
},
),
],
),
),
],
),
Container(
height: 123,
margin: EdgeInsets.only(bottom: 16.h),
padding: EdgeInsets.only(left: 16,top: 16,right: 10),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(12),
offset: Offset(0, 2),
blurRadius: 14,
spreadRadius: 0,
)
],
),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
height: 22.h,
width: 40.w,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(2),
border: Border.all(
width: 1,
color: Color(0xFFFF7A1A),
style: BorderStyle.solid,
),
),
child: Text(
( course?.tags != null && course.tags.length > 0 )?course.tags[0] : "",
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFFFF7A1A),
),
),
),
SizedBox(
width: 6.w,
),
Expanded(
child: Text(
course != null ?course.subject:"",
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 16.sp,
fontWeight: MyFontWeight.semi_bold,
color: Color(0xFF1A1A1A),
),
),
flex: 1,
)
],
),
SizedBox(
height:10.h,
),
Padding(padding: EdgeInsets.only(right: 16),
child: Row(
children: [
Expanded(
child: Text(
"讲师:${course !=null ? course.author.name :""}",
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Colors.black,
),
)),
Text(
"播放次数:",
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF808080),
),
),
SizedBox(
width:4,
),
Text(
course != null ? course.viewers.toString() :"",
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF808080),
),
),
],
),),
SizedBox(
height:10.h,
),
Text(
course != null ?course.introduce:"",
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Colors.black,
),
),
],
),
),
anthology(),
CommentList(
commentKey,
course?.likes ?? course?.likes?? 0,
widget.arguments["id"],
3,
isKeyBoardShow,
_reply,
_delCommentTips,
12.sp,
requestApiFinish: (total){setState(() {
commentTotal = total;
});},
),
if (commentTotal == 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,
_queryCourseLikes,
isLike:course?.selfLiked,
),
],
),
),
);
}
initVideo(videoUrl) async {
videoPlayerController = VideoPlayerController.network(
videoUrl,
)..initialize().then((value) {
chewieAudioController = ChewieController(
videoPlayerController: videoPlayerController,
aspectRatio: videoPlayerController.value.aspectRatio,
//
autoPlay: false,
//
looping: false,
//
allowFullScreen: true,
//
materialProgressColors: chewie.ChewieProgressColors(
playedColor: Colors.white,
handleColor: Colors.white,
backgroundColor: Colors.grey,
bufferedColor: Colors.transparent,
),
autoInitialize: true,
);
chewieAudioController.addListener(_fullScreenListener);
if (mounted) setState(() {});
});
}
Future<void> _fullScreenListener() async {
if (!chewieAudioController.isFullScreen) {
Future.delayed(Duration(seconds: 1), () {
});
}
}
Widget videoWidget(double width, double height, src) {
print("src : $src");
return MediaQuery(
data: MediaQuery.of(context).copyWith(
textScaleFactor: 0.9,
),
child: !isShowImg
? (chewieAudioController != null
? Container(
width: width,
height: height,
child: chewies = Chewie(
controller: chewieAudioController,
),
)
: Container(
width: width,
height: height,
))
: GestureDetector(
onTap: (){
setState(() {
isShowImg = false;
});
},
child: Container(
width: width,
height: width / 7 * 5,
color: Colors.black,
child: Stack(
children: [
Center(
child: MImage(
src,
fit: BoxFit.cover,
errorSrc: "assets/image/default_2_1.png",
fadeSrc: "assets/image/default_2_1.png",
),
),
Center(
child: Icon(
Icons.play_circle_outline,
color: Colors.white,
size: 60,
),
),
],
),
),
),
);
}
Widget anthology() {
return Container(
color: Colors.white,
margin: EdgeInsets.only(bottom: 16),
padding: EdgeInsets.all(16),
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"选集",
style: TextStyle(
fontSize: 15.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF1A1A1A),
),
),
Text(
"${chapterList.length}",
style: TextStyle(
fontSize: 16.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF1A1A1A),
),
),
],
),
Container(
height: 70.h,
margin: EdgeInsets.only(top:10),
child: ListView.builder(
scrollDirection: Axis.horizontal,
physics: BouncingScrollPhysics(),
itemCount:chapterList.length,
itemBuilder: (context, position) {
return GestureDetector(
onTap: () {
setState(() {
chapterIndex = position;
isShowImg = true;
initVideo(chapterList[position].content.fileUrl);
});
},
child: classSelectItem(chapterList[position],position),
);
},
),
),
],
),
);
}
Widget classSelectItem(Chapter chapterList,position) {
return Container(
width: 106.w,
alignment: Alignment.center,
margin: EdgeInsets.symmetric(
horizontal: 6.w,
vertical: 3,
),
padding: EdgeInsets.all(8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: position==chapterIndex ? Color(0xFF32A060): Color(0xFFE5E5E5),
),
child: Text(
chapterList?.name ?? chapterList.name ?? "",
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: position == chapterIndex ? Colors.white :Color(0xFF7C7C7C),
),
),
);
}
// ////
// _queryInformationLikes() async {
// BaseData baseData = await apiService.courseLikes(widget.arguments["id"]).catchError((onError) {});
// if (baseData != null && baseData.isSuccess) {
// commentKey.currentState.setState(() {});
// setState(() {
// comunity.likes -= 1;
// else
// comunity.likes += 1;
//
// });
// } else {
// // SmartDialog.showToast(baseData.msg, alignment: Alignment.center);
// }
// }
///
_queryCourseLikes() async {
BaseData baseData = await apiService.courseLikes(widget.arguments["id"]).catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
setState(() {
if (course.selfLiked ?? false)
course.likes -= 1;
else
course.likes += 1;
course.selfLiked = !course.selfLiked ?? false;
});
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["id"],
"relationalType": 3
}).catchError((error) {});
if (baseData != null && baseData.isSuccess) {
CommentListState state = commentKey.currentState;
state.queryMemberCommentList();
commentTextController.text = "";
FocusScope.of(context).unfocus();
// _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,
);
}
///
_reply(memberComment) {
FocusScope.of(context).requestFocus(commentFocus);
parenId = memberComment.id;
hintText = S.of(context).huifu_("${memberComment.username}");
}
///
delComment(memberComment) async {
BaseData baseData = await apiService.delComment(memberComment.id);
if (baseData != null && baseData.isSuccess) {
CommentListState state = commentKey.currentState;
state.queryMemberCommentList();
}
}
///
_delCommentTips(memberComment) {
SmartDialog.show(widget: Tips(() {
delComment(memberComment);
}));
}
}

196
lib/community/community_view/class_list_view.dart

@ -0,0 +1,196 @@
import 'package:flutter/material.dart';
import 'package:huixiang/retrofit/data/course_list.dart';
import 'package:huixiang/utils/flutter_utils.dart';
import 'package:huixiang/utils/font_weight.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:huixiang/view_widget/custom_image.dart';
class ClassListView extends StatefulWidget {
final List<CourseList> classList;
ClassListView(this.classList);
@override
State<StatefulWidget> createState() {
return _ClassListView();
}
}
class _ClassListView extends State<ClassListView> {
@override
Widget build(BuildContext context) {
return GridView.builder(
itemCount:widget.classList == null ? 0 : widget.classList.length,
padding: EdgeInsets.only(
left: 16.w,
right: 16.w,
top: 13.h,
bottom: 16.h,
),
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
//Widget数量
crossAxisCount:2,
//Widget之间间距
crossAxisSpacing: 11.w,
//Widget之间间距
mainAxisSpacing: 16.w,
//Widget宽高比例 0.59
childAspectRatio:
260 / (281 / 2 + (281 / 2) * AppUtils.textScale(context)),
),
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
Navigator.of(context).pushNamed('/router/class_details',
arguments: {"id": widget.classList[index].id})
.then((value) => {widget.classList[index].viewers = value != null?value:widget.classList[index].viewers+1});
},
child: classListItem(widget.classList[index]),
);
},
);
}
Widget classListItem(CourseList classList) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.vertical(
bottom: Radius.circular(4),
),
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(10),
offset: Offset(0, 3),
blurRadius: 14,
spreadRadius: 0,
)
],
color: Colors.white,
),
margin: EdgeInsets.symmetric(
vertical: 3,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Stack(
alignment: Alignment(0.9, 0.9),
children: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(10),
offset: Offset(0, 3),
blurRadius: 14,
spreadRadius: 0,
)
],
color: Color.fromARGB(90, 0, 0, 0),
),
child: ClipRRect(
child:
Opacity(
opacity: 0.6,
child:MImage(
classList.coverImg,
width: double.infinity,
height: 120,
fit: BoxFit.cover,
errorSrc: "assets/image/default_1.png",
fadeSrc: "assets/image/default_1.png",
),
),
borderRadius: BorderRadius.vertical(
top: Radius.circular(4),
),
),
),
Container(
padding: EdgeInsets.only(left: 4),
child: Row(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Image.asset(
"assets/image/ketang_play.png",
width: 16.w,
height: 16.h,
color: Colors.white,
),
SizedBox(width: 5),
Text(
classList.viewers.toString(),
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Colors.white,
),
),
],
),
SizedBox(width: 8),
// Row(
// children: [
// Image.asset(
// "assets/image/ketang_message.png",
// width: 16.w,
// height: 16.h,
// color: Colors.white,
// ),
// SizedBox(width: 5),
// Text(
// classList.viewers.toString(),
// style: TextStyle(
// fontSize: 12.sp,
// fontWeight: MyFontWeight.regular,
// color: Colors.white,
// ),
// ),
// ],
// ),
],
),
),
],
),
Expanded(child:Container(
padding: EdgeInsets.all(10),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
classList.subject,
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.semi_bold,
color: Colors.black,
),
),
SizedBox(height: 2),
Text(
"讲师:${classList.author.name}",
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Colors.black,
),
),
],
),
),)
],
),
);
}
}

71
lib/community/community_view/class_title_tab.dart

@ -0,0 +1,71 @@
import 'package:flutter/material.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/retrofit/data/category_select_list.dart';
import 'package:huixiang/retrofit/data/goods_category.dart';
import 'package:huixiang/utils/font_weight.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:huixiang/view_widget/my_tab.dart';
class ClassTitleTab extends StatefulWidget {
final List<CategorySelectList> classSelectList;
final Function notifyClassSelectList;
ClassTitleTab(this.classSelectList,this.notifyClassSelectList);
@override
State<StatefulWidget> createState() {
return _ClassTitleTab();
}
}
class _ClassTitleTab extends State<ClassTitleTab>
with SingleTickerProviderStateMixin {
TabController tabController;
@override
void initState() {
super.initState();
if (widget.classSelectList != null && widget.classSelectList.length > 0)
tabController = TabController(length: widget.classSelectList.length, vsync: this );
}
@override
Widget build(BuildContext context) {
return Container(
alignment: Alignment.centerLeft,
child: DefaultTabController(
length:widget.classSelectList == null
? 0
: widget.classSelectList.length,
child: TabBar(
isScrollable: true,
//
indicatorColor: Color(0xff39B54A),
labelColor: Color(0xff32A060),
labelStyle: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.bold,
),
unselectedLabelStyle: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.regular,
),
controller: tabController,
//
unselectedLabelColor: Color(0xff4D4D4D),
indicatorSize: TabBarIndicatorSize.label,
onTap: (index){
widget.notifyClassSelectList(index);
},
//
tabs:widget.classSelectList == null
? []
: widget.classSelectList
.map((e) => MyTab(text: e.name))
.toList(),
),
),
);
}
}

119
lib/community/community_view/course_banner.dart

@ -0,0 +1,119 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_swiper/flutter_swiper.dart';
import 'package:huixiang/retrofit/data/banner.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/page.dart';
import 'package:huixiang/retrofit/retrofit_api.dart';
import 'package:huixiang/view_widget/custom_image.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class CourseBanner extends StatefulWidget {
final List<BannerData> bannerData;
CourseBanner(this.bannerData);
@override
State<StatefulWidget> createState() {
return _CourseBanner();
}
}
class _CourseBanner extends State<CourseBanner> {
ApiService apiService;
final RefreshController refreshController = RefreshController();
List<BannerData> bannerData = [];
@override
Widget build(BuildContext context) {
return Container(
child: AspectRatio(
aspectRatio: 2.08,
child: Swiper(
viewportFraction: 0.88,
scale: 0.93,
pagination: SwiperPagination(
alignment: Alignment.bottomCenter,
builder: DotSwiperPaginationBuilder(
size: 8,
activeSize: 8,
space: 5,
activeColor: Colors.black,
color: Colors.black.withAlpha(76),
),
),
physics: BouncingScrollPhysics(),
itemBuilder: (context, position) {
return InkWell(
onTap: () {
bannerClick(widget.bannerData[position]);
},
child: MImage(
(widget.bannerData != null && position < widget.bannerData.length)
? widget.bannerData[position].imgUrl
: "",
fit: BoxFit.cover,
radius: BorderRadius.circular(8),
errorSrc: "assets/image/default_2_1.png",
fadeSrc: "assets/image/default_2_1.png",
),
);
},
itemCount: (widget.bannerData != null && widget.bannerData.length > 0)
? widget.bannerData.length
: 1),
),
);
}
/// contentType 0123,4:,5:
bannerClick(BannerData bannerData) async {
switch (bannerData.contentType) {
case 1:
Navigator.of(context).pushNamed('/router/integral_store_page',
arguments: {"goodsId": bannerData.content});
break;
case 2:
Navigator.of(context)
.pushNamed('/router/web_page', arguments: {
"activityId": bannerData.content,
});
break;
case 3:
Navigator.of(context)
.pushNamed('/router/web_page', arguments: {
"articleId": bannerData.content,
});
break;
case 4:
String router = bannerData.content;
if (router.contains("?")) {
String params = router.substring(router.indexOf("?"));
params = params.replaceAll("?", "");
Map map = jsonDecode(params);
Navigator.of(context).pushNamed(router, arguments: map);
} else {
Navigator.of(context).pushNamed(router);
}
break;
case 5:
Navigator.of(context)
.pushNamed('/router/class_details', arguments: {
"id": bannerData.content,
});
break;
}
}
}

264
lib/community/community_view/home_class.dart

@ -0,0 +1,264 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import 'package:huixiang/retrofit/data/collect_class_list.dart';
import 'package:huixiang/retrofit/data/course_list.dart';
import 'package:huixiang/retrofit/retrofit_api.dart';
import 'package:huixiang/utils/font_weight.dart';
import 'package:huixiang/view_widget/custom_image.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class HomeClass extends StatefulWidget {
final List<CourseList> collect;
final List<CollectClassList> collectList;
HomeClass(this.collect,this.collectList);
@override
State<StatefulWidget> createState() {
return _HomeClass();
}
}
class _HomeClass extends State<HomeClass> {
ApiService apiService;
BMFCoordinate latLng;
final TextEditingController editingController = TextEditingController();
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return ListView.builder(
padding: EdgeInsets.zero,
itemCount:widget.collectList == null ? 0 : widget.collectList.length,
scrollDirection: Axis.vertical,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, position) {
return collectItem(widget.collectList[position]);
},
);
}
Widget collectItem(CollectClassList collectList) {
return Container(
width: 168,
height: 230,
margin: EdgeInsets.symmetric(
horizontal: 6.w,
vertical:10,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(padding: EdgeInsets.only(left: 16,top: 5),
child: Text(
collectList.name,
style: TextStyle(
fontSize: 15.sp,
fontWeight: MyFontWeight.medium,
color: Colors.black,
),
),),
Container(
height: 189,
margin: EdgeInsets.only(top:10),
child: ListView.builder(
scrollDirection: Axis.horizontal,
physics: BouncingScrollPhysics(),
padding: EdgeInsets.symmetric(horizontal: 10),
itemCount:widget.collect == null ? 0 : widget.collect.length,
itemBuilder: (context, position) {
return GestureDetector(
onTap: () {
Navigator.of(context).pushNamed('/router/class_details',
arguments: {"id":widget.collect[position].id})
.then((value) => {widget.collect[position].viewers = value != null?value:widget.collect[position].viewers+1});
},
child: classItem(widget.collect[position]),
);
},
),
),
],
),
);
}
Widget classItem(CourseList collect) {
return Container(
width: 168,
height: 189,
decoration: BoxDecoration(
borderRadius: BorderRadius.vertical(
bottom: Radius.circular(4),
),
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(10),
offset: Offset(0, 3),
blurRadius: 14,
spreadRadius: 0,
)
],
color: Colors.white,
),
margin: EdgeInsets.symmetric(
horizontal:6,
),
child: Column(
children: [
Stack(
alignment: Alignment.topRight,
children: [
Stack(
alignment: Alignment(0.9,0.9),
children: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(10),
offset: Offset(0, 3),
blurRadius: 14,
spreadRadius: 0,
)
],
color: Color.fromARGB(90, 0, 0, 0),
),
child: ClipRRect(
child: Opacity(
opacity: 0.6,
child: MImage(
collect.coverImg,
width: double.infinity,
height: 120,
fit: BoxFit.cover,
errorSrc: "assets/image/default_1.png",
fadeSrc: "assets/image/default_1.png",
),
),
borderRadius: BorderRadius.vertical(
top: Radius.circular(4),
),
),
),
Container(
padding: EdgeInsets.only(left: 4),
child:Row(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Image.asset(
"assets/image/ketang_play.png",
width: 16.w,
height: 16.h,
color: Colors.white,
),
SizedBox(width:5),
Text(
collect.viewers.toString(),
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Colors.white,
),
),
],
),
SizedBox(width:8),
// Row(
// children: [
// Image.asset(
// "assets/image/ketang_message.png",
// width: 16.w,
// height: 16.h,
// color: Colors.white,
// ),
// SizedBox(width:5),
// Text(
// collect.viewers.toString(),
// style: TextStyle(
// fontSize: 12.sp,
// fontWeight: MyFontWeight.regular,
// color: Colors.white,
// ),
// ),
// ],
// ),
],
),
),
],
),
Container(
margin: EdgeInsets.only(top: 8,right: 8),
height: 16.h,
width: 30.w,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(2),
color: Color(0xFFFFCD00),
),
child: Text(
( collect?.tags != null && collect.tags.length > 0 )?collect.tags[0] : "",
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF634815),
),
),
),
],
),
Expanded(child:
Container(
padding: EdgeInsets.all(10),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(child: Text(
collect.subject,
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 14.sp,
fontWeight: MyFontWeight.semi_bold,
color: Colors.black,
),
),),
],
),
SizedBox(height:5),
Text(
"讲师:${collect.author.name}",
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Colors.black,
),
),
],
),
),),
],
),
);
}
}

29
lib/home/home_page.dart

@ -32,22 +32,21 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'home_view/shortcut_operation.dart';
class HomePage extends StatefulWidget {
final GestureTapCallback callback;
final Function changeTab;
HomePage(this.callback);
HomePage(this.changeTab);
@override
State<StatefulWidget> createState() {
return _HomePage(callback);
return _HomePage();
}
}
class _HomePage extends State<HomePage> with AutomaticKeepAliveClientMixin {
ApiService apiService;
final GestureTapCallback callback;
_HomePage(this.callback);
@override
void initState() {
@ -78,6 +77,7 @@ class _HomePage extends State<HomePage> with AutomaticKeepAliveClientMixin {
List<Article> articles = [];
List<Goods> gooods = [];
Founder founder;
bool isSigned = false;
queryHome() async {
EasyLoading.show(status: S.of(context).zhengzaijiazai);
@ -263,8 +263,15 @@ class _HomePage extends State<HomePage> with AutomaticKeepAliveClientMixin {
///banner
HomeBanner(bannerData, controller),
///
ShortcutOperation((){
widget.changeTab(1);
}),
///
SignView(),
SignView(isSigned,(value){setState(() {
isSigned = value;
});}),
// ///
// HotArticle(articles),
@ -273,14 +280,16 @@ class _HomePage extends State<HomePage> with AutomaticKeepAliveClientMixin {
// ///
// BrandView(brandData),
///
///
QuickOrder(),
CouponView(),
///
// CouponView(),
///
HomeIntegralStore(gooods, callback),
HomeIntegralStore(gooods),
///
FeaturedActivity(),
///Tab

30
lib/home/home_view/home_banner.dart

@ -69,26 +69,24 @@ class _HomeBanner extends State<HomeBanner> {
);
}
/// contentType 0123
/// contentType 0123,4:,5:
bannerClick(BannerData bannerData) async {
switch (bannerData.contentType) {
case 1:
Navigator.of(context).pushNamed(
'/router/integral_store_page',
arguments: {"goodsId": bannerData.content},
);
Navigator.of(context).pushNamed('/router/integral_store_page',
arguments: {"goodsId": bannerData.content});
break;
case 2:
Navigator.of(context).pushNamed(
'/router/web_page',
arguments: {"activityId": bannerData.content},
);
Navigator.of(context)
.pushNamed('/router/web_page', arguments: {
"activityId": bannerData.content,
});
break;
case 3:
Navigator.of(context).pushNamed(
'/router/web_page',
arguments: {"articleId": bannerData.content},
);
Navigator.of(context)
.pushNamed('/router/web_page', arguments: {
"articleId": bannerData.content,
});
break;
case 4:
String router = bannerData.content;
@ -101,6 +99,12 @@ class _HomeBanner extends State<HomeBanner> {
Navigator.of(context).pushNamed(router);
}
break;
case 5:
Navigator.of(context)
.pushNamed('/router/class_details', arguments: {
"id": bannerData.content,
});
break;
}
}
}

3
lib/home/home_view/home_integral_store.dart

@ -9,10 +9,9 @@ import 'package:huixiang/view_widget/item_title.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class HomeIntegralStore extends StatefulWidget {
final GestureTapCallback callback;
final List<Goods> gooods;
HomeIntegralStore(this.gooods, this.callback);
HomeIntegralStore(this.gooods);
@override
State<StatefulWidget> createState() {

2
lib/home/home_view/quick_order.dart

@ -161,7 +161,7 @@ class _QuickOrder extends State<QuickOrder> {
return Column(
children: [
ItemTitle(
text: "快捷下单",
text: "店铺推荐",
imgPath: "assets/image/icon_points_mall.png",
),
Container(

162
lib/home/home_view/shortcut_operation.dart

@ -0,0 +1,162 @@
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/retrofit/data/activity.dart';
import 'package:huixiang/retrofit/data/base_data.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/item_title.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:shared_preferences/shared_preferences.dart';
class ShortcutOperation extends StatefulWidget {
final Function goToOrder;
ShortcutOperation(this.goToOrder);
@override
State<StatefulWidget> createState() {
return _ShortcutOperation();
}
}
class _ShortcutOperation extends State<ShortcutOperation> {
ApiService apiService;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
height: 150.h,
margin: EdgeInsets.only(bottom:15),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
onTap: (){
widget.goToOrder();
},
child: Container(
width: 106,
color: Colors.white,
margin: EdgeInsets.only(right:10),
padding: EdgeInsets.only(top: 8,bottom: 8),
child: Column(
children: [
Text(
"现在下单",
style: TextStyle(
fontWeight: MyFontWeight.semi_bold,
fontSize: 15.sp,
color: Colors.black,
),
),
SizedBox(height: 5),
Text(
"美味等你来!",
style: TextStyle(
fontWeight: MyFontWeight.regular,
fontSize: 12.sp,
color: Colors.black,
),
),
SizedBox(height: 20),
Expanded(child: Image.asset(
"assets/image/home_order.png",
width:70,
height:70,
),),
],
),
),
),
GestureDetector(
onTap: (){
Navigator.of(context).pushNamed('/router/recharge_page');
},
child: Container(
width: 106,
color: Colors.white,
margin: EdgeInsets.only(right:10),
padding: EdgeInsets.only(top: 8,bottom: 8),
child: Column(
children: [
Text(
"平台储值",
style: TextStyle(
fontWeight: MyFontWeight.semi_bold,
fontSize: 15.sp,
color: Colors.black,
),
),
SizedBox(height: 5),
Text(
"充值送会员!",
style: TextStyle(
fontWeight: MyFontWeight.regular,
fontSize: 12.sp,
color: Colors.black,
),
),
SizedBox(height: 20),
Expanded(child:Image.asset(
"assets/image/home_recharge.png",
width:70,
height:70,
),),
],
),
),
),
GestureDetector(
onTap: (){
Navigator.of(context).pushNamed('/router/roll_center_page');
},
child:Container(
width: 106,
color: Colors.white,
padding: EdgeInsets.only(top: 8,bottom: 8),
child: Column(
children: [
Text(
"天天有劵",
style: TextStyle(
fontWeight: MyFontWeight.semi_bold,
fontSize: 15.sp,
color: Colors.black,
),
),
SizedBox(height: 5),
Text(
"来领超值好劵!",
style: TextStyle(
fontWeight: MyFontWeight.regular,
fontSize: 12.sp,
color: Colors.black,
),
),
SizedBox(height: 20),
Expanded(child: Image.asset(
"assets/image/home_coupon.png",
width:70,
height:70,
), ),
],
),
),
),
],
),
);
}
}

14
lib/home/home_view/sign_view.dart

@ -7,6 +7,13 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class SignView extends StatelessWidget {
final bool isSigned;
final Function setSigned;
SignView(
this.isSigned,
this.setSigned,
);
@override
Widget build(BuildContext context) {
@ -37,7 +44,10 @@ class SignView extends StatelessWidget {
value.getString('token') == "") {
LoginTipsDialog().show(context);
} else {
Navigator.of(context).pushNamed('/router/integral_page');
Navigator.of(context).pushNamed('/router/integral_page')
.then((value) => {
if (value != null) setSigned(value),
});
}
});
},
@ -94,7 +104,7 @@ class SignView extends StatelessWidget {
],
),
Text(
S.of(context).quqiandao,
isSigned ? S.of(context).yiqiandao : S.of(context).quqiandao,
style: TextStyle(
color: Color(0xFF727272),
fontSize: 12.sp,

8
lib/home/huixiang_view/huixiang_banner.dart

@ -62,7 +62,7 @@ class _HuiXiangBanner extends State<HuiXiangBanner> {
);
}
/// contentType 0123
/// contentType 0123,4:,5:
bannerClick(BannerData bannerData) async {
switch (bannerData.contentType) {
case 1:
@ -92,6 +92,12 @@ class _HuiXiangBanner extends State<HuiXiangBanner> {
Navigator.of(context).pushNamed(router);
}
break;
case 5:
Navigator.of(context)
.pushNamed('/router/class_details', arguments: {
"id": bannerData.content,
});
break;
}
}

25
lib/home/points_mall_view/points_goods_view.dart

@ -100,6 +100,7 @@ class _PointGoods extends State<PointGoods> {
Text(
goods.name,
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: TextStyle(
color: Color(0xff353535),
fontWeight: MyFontWeight.medium,
@ -109,17 +110,12 @@ class _PointGoods extends State<PointGoods> {
SizedBox(
height: 5.h,
),
Container(
height: 35.h * AppUtils.textScale(context),
child: Text(
goods.description,
maxLines: 2,
overflow: TextOverflow.ellipsis,
Text(
S.of(context).jifen_(goods.price),
style: TextStyle(
color: Color(0xFF727272),
fontWeight: MyFontWeight.regular,
fontSize: 12.sp,
),
color: Color(0xFF32A060),
fontSize: 14.sp,
fontWeight: MyFontWeight.semi_bold,
),
),
SizedBox(
@ -143,11 +139,12 @@ class _PointGoods extends State<PointGoods> {
flex: 1,
),
Text(
S.of(context).jifen_(goods.price),
"库存:${goods?.stock ?? goods?.stock ??""}",
style: TextStyle(
color: Color(0xFF32A060),
fontSize: 14.sp,
fontWeight: MyFontWeight.semi_bold,
color: Color(0xFF585858),
decorationColor: Color(0xFF353535),
fontWeight: MyFontWeight.medium,
fontSize: 12.sp,
),
),
],

9
lib/home/points_mall_view/points_mall_banner.dart

@ -69,7 +69,7 @@ class _PointMallBanner extends State<PointMallBanner> {
);
}
/// contentType 0123
/// contentType 0123,4:,5:
bannerClick(BannerData bannerData) async {
switch (bannerData.contentType) {
case 1:
@ -99,10 +99,15 @@ class _PointMallBanner extends State<PointMallBanner> {
Navigator.of(context).pushNamed(router);
}
break;
case 5:
Navigator.of(context)
.pushNamed('/router/class_details', arguments: {
"id": bannerData.content,
});
break;
}
}
}

1
lib/integral/integral_detailed_page.dart

@ -199,6 +199,7 @@ class _IntegralDetailedPage extends State<IntegralDetailedPage>
];
},
body: Container(
color: Colors.white,
child: SmartRefresher(
controller: refreshController,
enablePullDown: true,

4
lib/integral/integral_page.dart

@ -19,6 +19,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'intergra_view/integral_task.dart';
class IntegralPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _IntegralPage();
@ -92,6 +93,7 @@ class _IntegralPage extends State<IntegralPage> {
Scaffold(
backgroundColor: Colors.transparent,
appBar: MyAppBar(
exit: (){Navigator.of(context).pop(signInfo.todayHasSignin ?? false);},
background: Colors.transparent,
leadingColor: Colors.white,
title: "",
@ -150,7 +152,7 @@ class _IntegralPage extends State<IntegralPage> {
return;
}
EasyLoading.show(status: S.of(context).zhengzaijiazai);
BaseData baseData = await apiService.signIn();
BaseData baseData = await apiService.signIn().catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
setState(() {});
SmartDialog.show(

137
lib/integral_store/integral_store_details_page.dart

@ -52,7 +52,7 @@ class _IntegralStoreDetailsPage extends State {
queryGoodsById() async {
BaseData<Goods> baseData =
await apiService.creditGoodsById(arguments["goodsId"]);
await apiService.creditGoodsById(arguments["goodsId"]).catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
setState(() {
goods = baseData.data;
@ -63,13 +63,13 @@ class _IntegralStoreDetailsPage extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppBar(
background: Color(0xFFFFFFFF),
leadingColor: Colors.black,
title: S.of(context).shangpinxiangqing,
titleColor: Colors.black,
titleSize: 16.sp,
),
// appBar: MyAppBar(
// background: Color(0xFFFFFFFF),
// leadingColor: Colors.black,
// title: S.of(context).shangpinxiangqing,
// titleColor: Colors.black,
// titleSize: 16.sp,
// ),
body: Container(
child: Column(
children: [
@ -115,31 +115,34 @@ class _IntegralStoreDetailsPage extends State {
),
GestureDetector(
onTap: () {
if (goods != null &&
points != null &&
int.tryParse(goods.price) < int.tryParse(points)) {
toExchangeOrder();
}
// if (goods != null &&
// points != null &&
// int.tryParse(goods.price) < int.tryParse(points)) {
// toExchangeOrder();
// }
},
child: Container(
padding: EdgeInsets.only(top: 16.h, bottom: 16.h),
decoration: BoxDecoration(
color: (goods != null &&
points != null &&
int.tryParse(goods.price) < int.tryParse(points))
? Color(0xFF32A060)
: Color(0xFFD8D8D8),
color:
// (goods != null &&
// points != null &&
// int.tryParse(goods.price) < int.tryParse(points))
// ? Color(0xFF32A060)
// :
Color(0xFFD8D8D8),
borderRadius: BorderRadius.vertical(
top: Radius.circular(4),
),
),
alignment: Alignment.center,
child: Text(
(goods != null &&
points != null &&
int.tryParse(goods.price) < int.tryParse(points))
? S.of(context).duihuan
: S.of(context).jifenbuzu,
// (goods != null &&
// points != null &&
// int.tryParse(goods.price) < int.tryParse(points))
// ? S.of(context).duihuan
// : S.of(context).jifenbuzu,
"兑换功能暂未开放",
style: TextStyle(
fontSize: 16.sp,
color: Color(0xFFFFFFFF),
@ -194,62 +197,67 @@ class _IntegralStoreDetailsPage extends State {
Container(
padding: EdgeInsets.fromLTRB(16.w, 16.h, 16.w, 16.h),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Text(
goods == null ? "" : goods.name,
overflow: TextOverflow.ellipsis,
Text(
goods == null ? "" : S.of(context).jifen_(goods.price),
style: TextStyle(
fontWeight: MyFontWeight.semi_bold,
fontSize: 18.sp,
color: Color(0xFF353535),
color: Color(0xFF32A060),
),
),
flex: 1,
SizedBox(
width: 10.w,
),
Text(
goods == null
? ""
: S.of(context).yiduihuanjian("${goods.sales}"),
Expanded(child: Text(
S.of(context).yuan_(goods?.worth??goods?.worth??""),
style: TextStyle(
fontSize: 10.sp,
color: Color(0xFF585858),
decoration: TextDecoration.lineThrough,
decorationColor: Color(0xFF585858),
fontWeight: MyFontWeight.regular,
color: Color(0xFFA29E9E),
fontSize: 14.sp,
),
),),
Text(
"库存:${goods?.stock ?? goods?.stock ??""}",
style: TextStyle(
color: Color(0xFF585858),
decorationColor: Color(0xFF353535),
fontWeight: MyFontWeight.medium,
fontSize: 12.sp,
),
),
],
),
SizedBox(
height: 11.h,
height: 8.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
goods == null ? "" : goods.description,
Text(
goods == null ? "" : goods.name,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF727272),
fontWeight: MyFontWeight.semi_bold,
fontSize: 15.sp,
color: Color(0xFF353535),
),
),
flex: 1,
SizedBox(
height: 11.h,
),
Text(
goods == null ? "" : S.of(context).jifen_(goods.price),
goods == null ? "" : goods.description,
style: TextStyle(
fontWeight: MyFontWeight.semi_bold,
fontSize: 16.sp,
color: Color(0xFF32A060),
),
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Color(0xFF727272),
),
],
),
],
),
@ -263,7 +271,9 @@ class _IntegralStoreDetailsPage extends State {
return Container(
child: AspectRatio(
aspectRatio: 1.3698,
child: Swiper(
child: Stack(
children: [
Swiper(
pagination: SwiperPagination(
alignment: Alignment.bottomCenter,
builder: DotSwiperPaginationBuilder(
@ -286,6 +296,23 @@ class _IntegralStoreDetailsPage extends State {
? 1
: goods.viceImgPaths.length,
),
GestureDetector(
onTap: (){
Navigator.of(context).pop();
},
child: Container(
margin: EdgeInsets.only(left: 16,top: 52),
padding:EdgeInsets.all(5),
child:Image.asset(
"assets/image/integral_return.png",
// alignment: Alignment.center,
width: 24,
height: 24,
),
),
),
],
),
),
);
}

2
lib/main.dart

@ -70,6 +70,7 @@ import 'package:tpns_flutter_plugin/android/xg_android_api.dart';
import 'package:tpns_flutter_plugin/tpns_flutter_plugin.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import 'community/community_view/class_details.dart';
import 'home/guide_page.dart';
import 'home/home_view/activity_list.dart';
import 'main_page.dart';
@ -307,4 +308,5 @@ Map<String, WidgetBuilder> routers = <String, WidgetBuilder>{
'/router/communityFollow': (context, {arguments}) => CommunityFollow(),
'/router/releasePage': (context, {arguments}) => ReleasePage(),
'/router/activity_list': (context, {arguments}) => ActivityList(),
'/router/class_details': (context, {arguments}) => ClassDetails(arguments: arguments),
};

6
lib/main_page.dart

@ -78,7 +78,11 @@ class _MainPage extends State<MainPage> with WidgetsBindingObserver {
_widgetOptions = <Widget>[
// BrandPage(),
HomePage(() {}),
HomePage((index) {
setState(() {
pageController.jumpToPage(index);
});
}),
// MainHomePage(),
UnionPage(),
CommunityPage(),

2
lib/mine/coupons_page.dart

@ -211,7 +211,7 @@ class _CouponsPage extends State<CouponsPage> {
}
receiveCoupon(couponId) async {
BaseData baseData = await apiService.receiveCoupon(couponId);
BaseData baseData = await apiService.receiveCoupon(couponId).catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
_onRefresh();
showAlertDialog();

1
lib/mine/fans_page.dart

@ -3,7 +3,6 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/comunity_comment.dart';
import 'package:huixiang/retrofit/data/follow_list.dart';
import 'package:huixiang/retrofit/data/page.dart';
import 'package:huixiang/retrofit/retrofit_api.dart';

3
lib/mine/mine_view/community_follow.dart

@ -4,15 +4,12 @@ import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:huixiang/mine/follow_page.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/comunity_comment.dart';
import 'package:huixiang/retrofit/data/page.dart';
import 'package:huixiang/retrofit/data/social_info.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:huixiang/view_widget/my_tab.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../fans_page.dart';

2
lib/mine/mine_wallet_page.dart

@ -57,7 +57,7 @@ class _MineWalletPage extends State<MineWalletPage> {
}
queryUserBalance() async {
BaseData<UserInfo> baseData = await apiService.queryInfo();
BaseData<UserInfo> baseData = await apiService.queryInfo().catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
userInfo = baseData.data;
mBalance = double.tryParse(userInfo.money);

4
lib/mine/user_info_page.dart

@ -344,7 +344,7 @@ class _UserInfoPage extends State<UserInfoPage> {
///
modifyInfos() async {
var info = await apiService.editInfo(modifyInfo);
var info = await apiService.editInfo(modifyInfo).catchError((onError) {});
if (info.isSuccess) {
setState(() {
SmartDialog.showToast("用户信息修改成功", alignment: Alignment.center);
@ -355,7 +355,7 @@ class _UserInfoPage extends State<UserInfoPage> {
///
fileUpload() async {
if (filePath != null && filePath != "" && await File(filePath).exists()) {
BaseData<UploadResult> baseData = await apiService.upload(File(filePath), 123123123);
BaseData<UploadResult> baseData = await apiService.upload(File(filePath), 123123123).catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
UploadResult uploadResult = baseData.data;
modifyInfo["headimg"] = uploadResult.url;

561
lib/order/exchange_order_page.dart

@ -4,11 +4,16 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:fluwx/fluwx.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/user_info.dart';
import 'package:huixiang/retrofit/data/wx_pay.dart';
import 'package:huixiang/retrofit/retrofit_api.dart';
import 'package:huixiang/utils/font_weight.dart';
import 'package:huixiang/utils/min.dart';
import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:huixiang/view_widget/round_button.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -26,6 +31,9 @@ class ExchangeOrderPage extends StatefulWidget {
class _ExchangeOrderPage extends State<ExchangeOrderPage> {
ApiService apiService;
String money = "0";
String balance = "0";
var checkIndex = 1;
@override
void initState() {
@ -51,10 +59,11 @@ class _ExchangeOrderPage extends State<ExchangeOrderPage> {
background: Color(0xFFFAFAFA),
leadingColor: Colors.black,
),
body: Column(
children: [
Expanded(
body: SingleChildScrollView(
physics: BouncingScrollPhysics(),
child: Column(
children: [
Column(
children: [
Container(
margin:
@ -218,6 +227,85 @@ class _ExchangeOrderPage extends State<ExchangeOrderPage> {
],
),
),
Container(
margin:
EdgeInsets.only(left: 16, right: 16, top: 26, bottom: 8),
padding: EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(12),
offset: Offset(0, 3),
blurRadius: 14,
spreadRadius: 0,
)
],
borderRadius: BorderRadius.all(Radius.circular(8)),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Image.asset(
"assets/image/icon_order_exchange_info.png",
width: 24,
height: 24,
),
SizedBox(width: 4),
Text(
S.of(context).duihuanxinxi,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
color: Color(0xFF353535)),
),
],
),
SizedBox(
height: 18.h,
),
Row(
children: [
Text(
S.of(context).lingqufangshi,
style: TextStyle(
fontSize: 14.sp,
color: Color(0xFF353535),
),
),
SizedBox(
width: 12.w,
),
Text(
widget.arguments["useTyped"] == 1
? S.of(context).ziti
: widget.arguments["useTyped"] == 2
? S.of(context).peisong
: S.of(context).xianshangfafang,
style: TextStyle(
fontSize: 14.sp,
color: Color(0xFF353535),
),
),
],
),
SizedBox(
height: 12.h,
),
Text(
"非实物商品兑换后领取到卡包即可使用!",
style: TextStyle(
fontSize: 14.sp,
color: Color(0xFF32A060),
fontWeight: MyFontWeight.medium
),
),
],
),
),
Container(
margin:
EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 16),
@ -310,38 +398,62 @@ class _ExchangeOrderPage extends State<ExchangeOrderPage> {
SizedBox(
height: 12.h,
),
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// crossAxisAlignment: CrossAxisAlignment.center,
// children: [
// Text(
// "商品积分",
// style:
// TextStyle(fontSize: 14, color: Color(0xFF353535)),
// ),
// SizedBox(
// width: 12,
// ),
// Text(
// S.of(context).jifen_(widget.arguments["price"]),
// style: TextStyle(
// fontSize: 12,
// color: Colors.black,
// ),
// ),
// ],
// ),
// SizedBox(
// height: 12,
// ),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
"实付积分",
"应付数额",
style:
TextStyle(fontSize: 14, color: Color(0xFF353535),fontWeight: MyFontWeight.regular),
),
SizedBox(
width: 12,
),
Text(
S.of(context).jifen_(widget.arguments["price"]),
style: TextStyle(
fontSize: 14.sp, color: Color(0xFF353535)),
fontSize: 12,
color: Colors.black,
),
),
],
),
SizedBox(
height: 12,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
"现金抵扣积分",
style:
TextStyle(fontSize: 14, color: Color(0xFF353535),fontWeight: MyFontWeight.regular),
),
SizedBox(
width: 12,
),
Text(
S.of(context).jifen_(widget.arguments["price"]),
style: TextStyle(
fontSize: 12,
color: Colors.black,
),
),
],
),
SizedBox(
height: 12,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
"合计",
style: TextStyle(
fontSize: 14.sp, color: Color(0xFF353535),fontWeight: MyFontWeight.regular),
),
SizedBox(
width: 12.w,
@ -356,34 +468,361 @@ class _ExchangeOrderPage extends State<ExchangeOrderPage> {
],
),
),
Container(
margin:
EdgeInsets.only(left: 16, right: 16, bottom: 8),
padding: EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(12),
offset: Offset(0, 3),
blurRadius: 14,
spreadRadius: 0,
)
],
borderRadius: BorderRadius.all(Radius.circular(8)),
),
child: Column(
children: [
Row(
children: [
Expanded(child: Text(
"兑换数量",
style: TextStyle(
fontWeight: MyFontWeight.regular,
fontSize: 14.sp,
color: Color(0xFF353535)),
)),
GestureDetector(
InkWell(
onTap: () {
if (!storeIsSelected) return;
creditOrder();
},
child: Container(
padding: EdgeInsets.only(top: 16, bottom: 16),
decoration: BoxDecoration(
color: MaterialStateColor.resolveWith((states) =>
storeIsSelected ? Color(0xFF32A060) : Color(0xFFD8D8D8)),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(4),
topRight: Radius.circular(4))),
child: Image.asset(
"assets/image/reduce.png",
width: 22,
height: 22,
),
),
Container(
width: 30,
alignment: Alignment.center,
child: Text(
S.of(context).querenduihuan,
"1",
style: TextStyle(
color: Colors.black,
fontSize: 14.sp,
fontWeight: MyFontWeight.medium,
),
),
),
InkWell(
onTap: () {
},
child: Image.asset(
"assets/image/add.png",
width: 22,
height: 22,
),
),
],
),
],
),
),
Container(
width: double.infinity,
margin: EdgeInsets.only(
left: 16.w,
right: 16.w,
top: 12.h,
bottom:20.h,
),
padding: EdgeInsets.only(
left: 16.w,
right: 16.w,
top: 20.h,
bottom: 20.h,
),
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
color: Color(0x000000).withAlpha(25),
offset: Offset(0, 1),
blurRadius: 12.0,
),
],
color: Colors.white,
borderRadius: BorderRadius.circular(8),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(bottom: 16.h),
child: Text(
S.of(context).zhifufangshi,
style: TextStyle(
fontSize: 16.sp,
color: MaterialStateColor.resolveWith((states) =>
storeIsSelected ? Colors.white : Color(0xFFA0A0A0)),
fontWeight: FontWeight.bold),
color: Colors.black,
fontWeight: MyFontWeight.regular,
),
),
),
GestureDetector(
onTap: () {
setState(() {
checkIndex = 1;
});
// widget.payChannelCheck(4);
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
checkPayView(1),
Expanded(
child: Container(),
flex: 1,
),
Text(
"¥$money",
style: TextStyle(
fontSize: 14.sp,
color: Color(0xff353535),
fontWeight: MyFontWeight.semi_bold,
),
),
SizedBox(
width: 10,
),
Text(
S.of(context).pingtaiyue,
style: TextStyle(
fontSize: 14.sp,
color: Color(0xff353535),
fontWeight: MyFontWeight.semi_bold,
),
),
],
),
),
SizedBox(
height: 10,
),
GestureDetector(
onTap: () {
setState(() {
checkIndex = 2;
});
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
checkPayView(2),
Expanded(
child: Container(),
flex: 1,
),
Text(
"¥$balance",
style: TextStyle(
fontSize: 14.sp,
color: Color(0xff353535),
fontWeight: MyFontWeight.semi_bold,
),
),
SizedBox(
width: 10,
),
Text(
S.of(context).dianpuyue,
style: TextStyle(
fontSize: 14.sp,
color: Color(0xff353535),
fontWeight: MyFontWeight.semi_bold,
),
),
],
),
),
SizedBox(
height: 10,
),
GestureDetector(
onTap: () {
setState(() {
checkIndex = 3;
});
},
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
checkPayView(3),
Spacer(),
Image.asset("assets/image/icon_we_chat.png"),
Padding(
padding: EdgeInsets.only(left: 8.w),
child: Text(
S.of(context).weixinzhifu,
style: TextStyle(
fontSize: 14.sp,
color: Color(0xff353535),
fontWeight: MyFontWeight.semi_bold,
),
),
),
],
),
),
],
),
),
// GestureDetector(
// onTap: () {
// if (!storeIsSelected) return;
// creditOrder();
// },
// child: Container(
// padding: EdgeInsets.only(top: 16, bottom: 16),
// decoration: BoxDecoration(
// color: MaterialStateColor.resolveWith((states) =>
// storeIsSelected ? Color(0xFF32A060) : Color(0xFFD8D8D8)),
// borderRadius: BorderRadius.only(
// topLeft: Radius.circular(4),
// topRight: Radius.circular(4))),
// alignment: Alignment.center,
// child: Text(
// S.of(context).querenduihuan,
// style: TextStyle(
// fontSize: 16.sp,
// color: MaterialStateColor.resolveWith((states) =>
// storeIsSelected ? Colors.white : Color(0xFFA0A0A0)),
// fontWeight: FontWeight.bold),
// ),
// ),
// ),
Container(
height: 54.h,
color: Colors.white,
child: Row(
children: [
Spacer(),
Padding(padding: EdgeInsets.only(top: 7,right: 16),
child:Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
S.of(context).heji,
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Colors.black,
),
),
Text(
"¥0.0",
style: TextStyle(
fontSize: 16.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF32A060),
),
),
],
)),
GestureDetector(
onTap: () {
},
child: RoundButton(
width: 103.w,
height: 54.h,
text: S.current.jiesuan,
textColor: Colors.white,
fontWeight: MyFontWeight.regular,
backgroup: Color(0xFF32A060),
radius: 0,
fontSize: 16.sp,
padding: EdgeInsets.symmetric(vertical: 5.h),
),
),
],
),
),
Container(
height: 54.h,
color: Colors.white,
child: Row(
children: [
Spacer(),
Padding(padding: EdgeInsets.only(top: 7,right: 16),
child:Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
S.of(context).heji,
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.regular,
color: Colors.black,
),
),
Text(
S.of(context).jifen_(widget.arguments["price"]),
style: TextStyle(
fontSize: 16.sp,
fontWeight: MyFontWeight.medium,
color: Color(0xFF32A060),
),
),
],
)),
GestureDetector(
onTap: () {
if (!storeIsSelected) return;
creditOrder();
},
child: RoundButton(
width: 103.w,
height: 54.h,
text: S.current.duihuan,
textColor: Colors.white,
fontWeight: MyFontWeight.regular,
backgroup: Color(0xFF32A060),
radius: 0,
fontSize: 16.sp,
padding: EdgeInsets.symmetric(vertical: 5.h),
),
),
],
),
),
],
),
// Expanded(
// child:
// ),
],
) ,),
);
}
Widget checkPayView(var index) {
return Container(
padding: EdgeInsets.only(right: 16.w),
alignment: Alignment.center,
child: Image.asset(
checkIndex != index
? "assets/image/icon_radio_unselected.png"
: "assets/image/icon_radio_selected.png",
width: 15.w,
height: 15.h,
),
);
}
@ -425,10 +864,44 @@ class _ExchangeOrderPage extends State<ExchangeOrderPage> {
"goodsId": widget.arguments["goodsId"],
"number": 1,
"useTyped": widget.arguments["useTyped"],
"payChannel":checkIndex == 3?"1":"4",
if (widget.arguments["useTyped"] == 1) "storeId": storeId,
if (widget.arguments["useTyped"] == 2) "userAddressId": userAddressId,
});
if (baseDate.isSuccess) {
if(checkIndex == 3){
if (!(await Min.isInitialize())) {
// app的充值支付使用同一个WXPayEntryActivity回调
// getPackage空指针
//
await Min.initialize();
}
WxPay wxPay = WxPay.fromJson(baseDate.data);
await registerWxApi(
appId: wxPay.appId,
doOnAndroid: true,
universalLink: "https://hx.lotus-wallet.com/app/",
);
payWithWeChat(
appId: wxPay.appId,
partnerId: wxPay.partnerId,
prepayId: wxPay.prepayId,
packageValue: wxPay.packageValue,
nonceStr: wxPay.nonceStr,
timeStamp: int.tryParse(wxPay.timeStamp),
sign: wxPay.sign,
);
weChatResponseEventHandler.listen((event) async {
print("payCallback: ${event.errCode}");
Navigator.of(context).popAndPushNamed(
'/router/order_details',
arguments: {
"id": widget.arguments["goodsId"],
},
);
});
return;
}
await Navigator.of(context)
.pushNamed('/router/exchange_order_success_page', arguments: {
"price": widget.arguments["price"],

1
lib/order/order_view/order_status.dart

@ -90,6 +90,7 @@ class _OrderStatus extends State<OrderStatus> {
fontSize: 15.sp,
),
),
if(widget.payStatus != 0)
Image.asset(
statusPicture(widget.title),
height: 66.h,

114
lib/retrofit/data/category_select_list.dart

@ -0,0 +1,114 @@
/// id : "1452472226421932032"
/// createTime : "2021-10-25 11:08:59"
/// createUser : "1"
/// updateTime : "2021-10-25 11:08:59"
/// updateUser : "1"
/// name : "4444"
/// isTop : true
/// sort : 0
/// isDelete : 0
class CategorySelectList {
CategorySelectList({
String id,
String createTime,
String createUser,
String updateTime,
String updateUser,
String name,
bool isTop,
int sort,
int isDelete,}){
_id = id;
_createTime = createTime;
_createUser = createUser;
_updateTime = updateTime;
_updateUser = updateUser;
_name = name;
_isTop = isTop;
_sort = sort;
_isDelete = isDelete;
}
CategorySelectList.fromJson(dynamic json) {
_id = json['id'];
_createTime = json['createTime'];
_createUser = json['createUser'];
_updateTime = json['updateTime'];
_updateUser = json['updateUser'];
_name = json['name'];
_isTop = json['isTop'];
_sort = json['sort'];
_isDelete = json['isDelete'];
}
String _id;
String _createTime;
String _createUser;
String _updateTime;
String _updateUser;
String _name;
bool _isTop;
int _sort;
int _isDelete;
String get id => _id;
String get createTime => _createTime;
String get createUser => _createUser;
String get updateTime => _updateTime;
String get updateUser => _updateUser;
String get name => _name;
bool get isTop => _isTop;
int get sort => _sort;
int get isDelete => _isDelete;
set id(String value) {
_id = value;
}
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = _id;
map['createTime'] = _createTime;
map['createUser'] = _createUser;
map['updateTime'] = _updateTime;
map['updateUser'] = _updateUser;
map['name'] = _name;
map['isTop'] = _isTop;
map['sort'] = _sort;
map['isDelete'] = _isDelete;
return map;
}
set createTime(String value) {
_createTime = value;
}
set createUser(String value) {
_createUser = value;
}
set updateTime(String value) {
_updateTime = value;
}
set updateUser(String value) {
_updateUser = value;
}
set name(String value) {
_name = value;
}
set isTop(bool value) {
_isTop = value;
}
set sort(int value) {
_sort = value;
}
set isDelete(int value) {
_isDelete = value;
}
}

136
lib/retrofit/data/chapter.dart

@ -0,0 +1,136 @@
/// id : "1452530820865589248"
/// createTime : "2021-10-25 15:01:49"
/// createUser : "1"
/// updateTime : "2021-11-02 17:09:56"
/// updateUser : "1"
/// courseId : "1452472611438067712"
/// name : "111"
/// content : {"coverImg":"https://pos.upload.gznl.top/0000/2021/11/3e014154-57cc-441e-9d02-aa53975979f5.png","remark":"11111111","fileUrl":"https://pos.upload.gznl.top/0000/2021/11/d87dd996-e269-46eb-b7ef-f8ceddfabef2.mp4"}
/// sort : 0
/// isDelete : 0
class Chapter {
Chapter({
String id,
String createTime,
String createUser,
String updateTime,
String updateUser,
String courseId,
String name,
Content content,
int sort,
int isDelete,}){
_id = id;
_createTime = createTime;
_createUser = createUser;
_updateTime = updateTime;
_updateUser = updateUser;
_courseId = courseId;
_name = name;
_content = content;
_sort = sort;
_isDelete = isDelete;
}
Chapter.fromJson(dynamic json) {
_id = json['id'];
_createTime = json['createTime'];
_createUser = json['createUser'];
_updateTime = json['updateTime'];
_updateUser = json['updateUser'];
_courseId = json['courseId'];
_name = json['name'];
_content = json['content'] != null ? Content.fromJson(json['content']) : null;
_sort = json['sort'];
_isDelete = json['isDelete'];
}
String _id;
String _createTime;
String _createUser;
String _updateTime;
String _updateUser;
String _courseId;
String _name;
Content _content;
int _sort;
int _isDelete;
String get id => _id;
String get createTime => _createTime;
String get createUser => _createUser;
String get updateTime => _updateTime;
String get updateUser => _updateUser;
String get courseId => _courseId;
String get name => _name;
Content get content => _content;
int get sort => _sort;
int get isDelete => _isDelete;
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = _id;
map['createTime'] = _createTime;
map['createUser'] = _createUser;
map['updateTime'] = _updateTime;
map['updateUser'] = _updateUser;
map['courseId'] = _courseId;
map['name'] = _name;
if (_content != null) {
map['content'] = _content.toJson();
}
map['sort'] = _sort;
map['isDelete'] = _isDelete;
return map;
}
}
/// coverImg : "https://pos.upload.gznl.top/0000/2021/11/3e014154-57cc-441e-9d02-aa53975979f5.png"
/// remark : "11111111"
/// fileUrl : "https://pos.upload.gznl.top/0000/2021/11/d87dd996-e269-46eb-b7ef-f8ceddfabef2.mp4"
class Content {
Content({
String coverImg,
String remark,
String fileUrl,}){
_coverImg = coverImg;
_remark = remark;
_fileUrl = fileUrl;
}
Content.fromJson(dynamic json) {
_coverImg = json['coverImg'];
_remark = json['remark'];
_fileUrl = json['fileUrl'];
}
String _coverImg;
String _remark;
String _fileUrl;
String get coverImg => _coverImg;
String get remark => _remark;
String get fileUrl => _fileUrl;
set coverImg(String value) {
_coverImg = value;
}
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['coverImg'] = _coverImg;
map['remark'] = _remark;
map['fileUrl'] = _fileUrl;
return map;
}
set remark(String value) {
_remark = value;
}
set fileUrl(String value) {
_fileUrl = value;
}
}

114
lib/retrofit/data/collect_class_list.dart

@ -0,0 +1,114 @@
/// id : "1454326699855446016"
/// createTime : "2021-10-30 13:58:00"
/// createUser : "1"
/// updateTime : "2021-10-30 13:58:00"
/// updateUser : "1"
/// name : "111"
/// sort : 0
/// enabled : true
/// isDelete : 0
class CollectClassList {
CollectClassList({
String id,
String createTime,
String createUser,
String updateTime,
String updateUser,
String name,
int sort,
bool enabled,
int isDelete,}){
_id = id;
_createTime = createTime;
_createUser = createUser;
_updateTime = updateTime;
_updateUser = updateUser;
_name = name;
_sort = sort;
_enabled = enabled;
_isDelete = isDelete;
}
CollectClassList.fromJson(dynamic json) {
_id = json['id'];
_createTime = json['createTime'];
_createUser = json['createUser'];
_updateTime = json['updateTime'];
_updateUser = json['updateUser'];
_name = json['name'];
_sort = json['sort'];
_enabled = json['enabled'];
_isDelete = json['isDelete'];
}
String _id;
String _createTime;
String _createUser;
String _updateTime;
String _updateUser;
String _name;
int _sort;
bool _enabled;
int _isDelete;
String get id => _id;
String get createTime => _createTime;
String get createUser => _createUser;
String get updateTime => _updateTime;
String get updateUser => _updateUser;
String get name => _name;
int get sort => _sort;
bool get enabled => _enabled;
int get isDelete => _isDelete;
set id(String value) {
_id = value;
}
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = _id;
map['createTime'] = _createTime;
map['createUser'] = _createUser;
map['updateTime'] = _updateTime;
map['updateUser'] = _updateUser;
map['name'] = _name;
map['sort'] = _sort;
map['enabled'] = _enabled;
map['isDelete'] = _isDelete;
return map;
}
set createTime(String value) {
_createTime = value;
}
set createUser(String value) {
_createUser = value;
}
set updateTime(String value) {
_updateTime = value;
}
set updateUser(String value) {
_updateUser = value;
}
set name(String value) {
_name = value;
}
set sort(int value) {
_sort = value;
}
set enabled(bool value) {
_enabled = value;
}
set isDelete(int value) {
_isDelete = value;
}
}

222
lib/retrofit/data/course_details.dart

@ -0,0 +1,222 @@
/// id : "1455102859841372160"
/// createTime : "2021-11-01 17:22:11"
/// createUser : "1"
/// updateTime : "2021-11-01 17:22:11"
/// updateUser : "1"
/// categoryId : "1452472226421932032"
/// subject : "后会无期"
/// tags : ["11"]
/// coverImg : "https://pos.upload.gznl.top/0000/2021/11/d8305d15-1a39-4b08-a172-eba7f18b9968.jpg"
/// author : {"name":"1","avatar":"1"}
/// introduce : "1"
/// viewers : 0
/// likes : 0
/// state : true
/// isDelete : 0
class CourseDetails {
CourseDetails({
String id,
String createTime,
String createUser,
String updateTime,
String updateUser,
String categoryId,
String subject,
List<String> tags,
String coverImg,
Author author,
String introduce,
int viewers,
int likes,
bool selfLiked,
bool state,
int isDelete,}){
_id = id;
_createTime = createTime;
_createUser = createUser;
_updateTime = updateTime;
_updateUser = updateUser;
_categoryId = categoryId;
_subject = subject;
_tags = tags;
_coverImg = coverImg;
_author = author;
_introduce = introduce;
_viewers = viewers;
_likes = likes;
_selfLiked = selfLiked;
_state = state;
_isDelete = isDelete;
}
CourseDetails.fromJson(dynamic json) {
_id = json['id'];
_createTime = json['createTime'];
_createUser = json['createUser'];
_updateTime = json['updateTime'];
_updateUser = json['updateUser'];
_categoryId = json['categoryId'];
_subject = json['subject'];
_tags = json['tags'] != null ? json['tags'].cast<String>() : [];
_coverImg = json['coverImg'];
_author = json['author'] != null ? Author.fromJson(json['author']) : null;
_introduce = json['introduce'];
_viewers = json['viewers'];
_likes = json['likes'];
_selfLiked = json['selfLiked'];
_state = json['state'];
_isDelete = json['isDelete'];
}
String _id;
String _createTime;
String _createUser;
String _updateTime;
String _updateUser;
String _categoryId;
String _subject;
List<String> _tags;
String _coverImg;
Author _author;
String _introduce;
int _viewers;
int _likes;
bool _selfLiked;
bool _state;
int _isDelete;
String get id => _id;
String get createTime => _createTime;
String get createUser => _createUser;
String get updateTime => _updateTime;
String get updateUser => _updateUser;
String get categoryId => _categoryId;
String get subject => _subject;
List<String> get tags => _tags;
String get coverImg => _coverImg;
Author get author => _author;
String get introduce => _introduce;
int get viewers => _viewers;
int get likes => _likes;
bool get selfLiked => _selfLiked;
bool get state => _state;
int get isDelete => _isDelete;
set id(String value) {
_id = value;
}
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = _id;
map['createTime'] = _createTime;
map['createUser'] = _createUser;
map['updateTime'] = _updateTime;
map['updateUser'] = _updateUser;
map['categoryId'] = _categoryId;
map['subject'] = _subject;
map['tags'] = _tags;
map['coverImg'] = _coverImg;
if (_author != null) {
map['author'] = _author.toJson();
}
map['introduce'] = _introduce;
map['viewers'] = _viewers;
map['likes'] = _likes;
map['selfLiked'] = _selfLiked;
map['state'] = _state;
map['isDelete'] = _isDelete;
return map;
}
set createTime(String value) {
_createTime = value;
}
set createUser(String value) {
_createUser = value;
}
set updateTime(String value) {
_updateTime = value;
}
set updateUser(String value) {
_updateUser = value;
}
set categoryId(String value) {
_categoryId = value;
}
set subject(String value) {
_subject = value;
}
set tags(List<String> value) {
_tags = value;
}
set coverImg(String value) {
_coverImg = value;
}
set author(Author value) {
_author = value;
}
set introduce(String value) {
_introduce = value;
}
set viewers(int value) {
_viewers = value;
}
set likes(int value) {
_likes = value;
}
set selfLiked(bool value) {
_selfLiked = value;
}
set state(bool value) {
_state = value;
}
set isDelete(int value) {
_isDelete = value;
}
}
/// name : "1"
/// avatar : "1"
class Author {
Author({
String name,
String avatar,}){
_name = name;
_avatar = avatar;
}
Author.fromJson(dynamic json) {
_name = json['name'];
_avatar = json['avatar'];
}
String _name;
String _avatar;
String get name => _name;
String get avatar => _avatar;
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['name'] = _name;
map['avatar'] = _avatar;
return map;
}
}

220
lib/retrofit/data/course_list.dart

@ -0,0 +1,220 @@
/// id : "1452470112895369216"
/// createTime : "2021-10-25 11:00:35"
/// createUser : "1"
/// updateTime : "2021-10-25 11:00:35"
/// updateUser : "1"
/// categoryId : "1452453250065235968"
/// subject : "11"
/// tags : ["11"]
/// coverImg : "https://pos.upload.gznl.top/0000/2021/10/61dda29b-19cf-4d47-b6c7-c07f895beeaa.jpg"
/// author : {"name":"11","avatar":"11"}
/// introduce : "11"
/// viewers : 0
/// likes : 0
/// state : true
/// isDelete : 0
class CourseList {
CourseList({
String id,
String createTime,
String createUser,
String updateTime,
String updateUser,
String categoryId,
String subject,
List<String> tags,
String coverImg,
Author author,
String introduce,
int viewers,
int likes,
bool state,
int isDelete,}){
_id = id;
_createTime = createTime;
_createUser = createUser;
_updateTime = updateTime;
_updateUser = updateUser;
_categoryId = categoryId;
_subject = subject;
_tags = tags;
_coverImg = coverImg;
_author = author;
_introduce = introduce;
_viewers = viewers;
_likes = likes;
_state = state;
_isDelete = isDelete;
}
CourseList.fromJson(dynamic json) {
_id = json['id'];
_createTime = json['createTime'];
_createUser = json['createUser'];
_updateTime = json['updateTime'];
_updateUser = json['updateUser'];
_categoryId = json['categoryId'];
_subject = json['subject'];
_tags = json['tags'] != null ? json['tags'].cast<String>() : [];
_coverImg = json['coverImg'];
_author = json['author'] != null ? Author.fromJson(json['author']) : null;
_introduce = json['introduce'];
_viewers = json['viewers'];
_likes = json['likes'];
_state = json['state'];
_isDelete = json['isDelete'];
}
String _id;
String _createTime;
String _createUser;
String _updateTime;
String _updateUser;
String _categoryId;
String _subject;
List<String> _tags;
String _coverImg;
Author _author;
String _introduce;
int _viewers;
int _likes;
bool _state;
int _isDelete;
String get id => _id;
String get createTime => _createTime;
String get createUser => _createUser;
String get updateTime => _updateTime;
String get updateUser => _updateUser;
String get categoryId => _categoryId;
String get subject => _subject;
List<String> get tags => _tags;
String get coverImg => _coverImg;
Author get author => _author;
String get introduce => _introduce;
int get viewers => _viewers;
int get likes => _likes;
bool get state => _state;
int get isDelete => _isDelete;
set id(String value) {
_id = value;
}
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = _id;
map['createTime'] = _createTime;
map['createUser'] = _createUser;
map['updateTime'] = _updateTime;
map['updateUser'] = _updateUser;
map['categoryId'] = _categoryId;
map['subject'] = _subject;
map['tags'] = _tags;
map['coverImg'] = _coverImg;
if (_author != null) {
map['author'] = _author.toJson();
}
map['introduce'] = _introduce;
map['viewers'] = _viewers;
map['likes'] = _likes;
map['state'] = _state;
map['isDelete'] = _isDelete;
return map;
}
set createTime(String value) {
_createTime = value;
}
set createUser(String value) {
_createUser = value;
}
set updateTime(String value) {
_updateTime = value;
}
set updateUser(String value) {
_updateUser = value;
}
set categoryId(String value) {
_categoryId = value;
}
set subject(String value) {
_subject = value;
}
set tags(List<String> value) {
_tags = value;
}
set coverImg(String value) {
_coverImg = value;
}
set author(Author value) {
_author = value;
}
set introduce(String value) {
_introduce = value;
}
set viewers(int value) {
_viewers = value;
}
set likes(int value) {
_likes = value;
}
set state(bool value) {
_state = value;
}
set isDelete(int value) {
_isDelete = value;
}
}
/// name : "11"
/// avatar : "11"
class Author {
Author({
String name,
String avatar,}){
_name = name;
_avatar = avatar;
}
Author.fromJson(dynamic json) {
_name = json['name'];
_avatar = json['avatar'];
}
String _name;
String _avatar;
String get name => _name;
String get avatar => _avatar;
set name(String value) {
_name = value;
}
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['name'] = _name;
map['avatar'] = _avatar;
return map;
}
set avatar(String value) {
_avatar = value;
}
}

11
lib/retrofit/min_api.dart

@ -21,13 +21,12 @@ import 'data/shoppingCart.dart';
part 'min_api.g.dart';
const base_url = "https://pos.api.lotus-wallet.com/app/"; ///
const baseUrl = "https://pos.api.lotus-wallet.com/app/"; ///
// const base_url = "https://pos.api.lotus-wallet.com/app/"; ///
// const baseUrl = "https://pos.api.lotus-wallet.com/app/"; ///
const base_url = "http://192.168.10.236:8765/app/";///
const baseUrl = "http://192.168.10.236:8765/app/";///
// const base_url = "http://192.168.10.236:8765/app/";
///
// const baseUrl = "http://192.168.10.236:8765/app/";
///
// const base_url = "http://192.168.10.37:8766/app/";
// const baseUrl = "http://192.168.10.37:8766/app/";

2
lib/retrofit/min_api.g.dart

@ -9,7 +9,7 @@ part of 'min_api.dart';
class _MinApiService implements MinApiService {
_MinApiService(this._dio, {this.baseUrl}) {
ArgumentError.checkNotNull(_dio, '_dio');
baseUrl ??= 'https://pos.api.lotus-wallet.com/app/';
baseUrl ??= 'http://192.168.10.236:8765/app/';
}
final Dio _dio;

45
lib/retrofit/retrofit_api.dart

@ -20,6 +20,11 @@ import 'package:retrofit/retrofit.dart';
import 'data/address.dart';
import 'data/banner.dart';
import 'data/brand_data.dart';
import 'data/category_select_list.dart';
import 'data/chapter.dart';
import 'data/collect_class_list.dart';
import 'data/course_details.dart';
import 'data/course_list.dart';
import 'data/exchange_order.dart';
import 'data/follow_list.dart';
import 'data/goods.dart';
@ -40,15 +45,19 @@ import 'data/wx_pay.dart';
part 'retrofit_api.g.dart';
const base_url = "https://pos.platform.lotus-wallet.com/app/"; ///
const baseUrl = "https://pos.platform.lotus-wallet.com/app/"; ///
// const base_url = "https://pos.platform.lotus-wallet.com/app/"; ///
// const baseUrl = "https://pos.platform.lotus-wallet.com/app/"; ///
// const base_url = "http://192.168.10.236:8766/app/"; ///
// const baseUrl = "http://192.168.10.236:8766/app/"; ///
const base_url = "http://192.168.10.236:8766/app/"; ///
const baseUrl = "http://192.168.10.236:8766/app/"; ///
// const base_url = "http://192.168.10.37:8766/app/";
// const baseUrl = "http://192.168.10.37:8766/app/";
// const base_url = "http://192.168.10.130:8766/app/";///
// const baseUrl = "http://192.168.10.130:8766/app/";///
@RestApi(baseUrl: baseUrl)
abstract class ApiService {
factory ApiService(
@ -389,4 +398,32 @@ abstract class ApiService {
@GET("/member/socialInfo")
Future<BaseData<SocialInfo>> socialInfo();
///
@GET("/course/categoryList")
Future<BaseData<List<CategorySelectList>>> categoryList();
///
@GET("/course/catalogList/{courseId}")
Future<BaseData<List<Chapter>>> catalogList(@Path("courseId") String courseId);
///
@POST("/course/list")
Future<BaseData<PageInfo<CourseList>>> courseList(@Body() Map<String, dynamic> map);
///
@GET("/course/collectList")
Future<BaseData<List<CollectClassList>>> collectList();
///
@GET("/course/collect/{collectId}")
Future<BaseData<List<CourseList>>> collect(@Path("collectId") String collectId);
///
@GET("/course/{id}")
Future<BaseData<CourseDetails>> course(@Path("id") String id);
////
@GET("/course/likes/{courseId}")
Future<BaseData> courseLikes(@Path("courseId") String courseId);
}

190
lib/retrofit/retrofit_api.g.dart

@ -9,7 +9,7 @@ part of 'retrofit_api.dart';
class _ApiService implements ApiService {
_ApiService(this._dio, {this.baseUrl}) {
ArgumentError.checkNotNull(_dio, '_dio');
baseUrl ??= 'https://pos.platform.lotus-wallet.com/app/';
baseUrl ??= 'http://192.168.10.236:8766/app/';
}
final Dio _dio;
@ -346,13 +346,15 @@ class _ApiService implements ApiService {
const _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _data = <String, dynamic>{};
final _headers = <String, dynamic>{};
_headers.addAll({"Environment":"app"});
_data.addAll(param ?? <String, dynamic>{});
final _result = await _dio.request<Map<String, dynamic>>(
'/creditOrder/create',
queryParameters: queryParameters,
options: RequestOptions(
method: 'POST',
headers: <String, dynamic>{},
headers: _headers,
extra: _extra,
baseUrl: baseUrl),
data: _data);
@ -1345,4 +1347,188 @@ class _ApiService implements ApiService {
);
return value;
}
@override
Future<BaseData<List<CategorySelectList>>> categoryList() async {
const _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _data = <String, dynamic>{};
final _result = await _dio.request<Map<String, dynamic>>(
'/course/categoryList',
queryParameters: queryParameters,
options: RequestOptions(
method: 'GET',
headers: <String, dynamic>{},
extra: _extra,
baseUrl: baseUrl),
data: _data);
final value = BaseData<List<CategorySelectList>>.fromJson(
_result.data,
(json) => (json as List<dynamic>)
.map<CategorySelectList>((i) => CategorySelectList.fromJson(i as Map<String, dynamic>))
.toList());
return value;
}
@override
Future<BaseData<List<Chapter>>> catalogList(courseId) async {
ArgumentError.checkNotNull(courseId, 'courseId');
const _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _data = <String, dynamic>{};
final _result = await _dio.request<Map<String, dynamic>>(
'/course/catalogList/$courseId',
queryParameters: queryParameters,
options: RequestOptions(
method: 'GET',
headers: <String, dynamic>{},
extra: _extra,
baseUrl: baseUrl),
data: _data);
final value = BaseData<List<Chapter>>.fromJson(
_result.data,
(json) => (json as List<dynamic>)
.map<Chapter>((i) => Chapter.fromJson(i as Map<String, dynamic>))
.toList());
return value;
}
//
// @override
// Future<BaseData<dynamic>> catalogList(courseId) async {
// ArgumentError.checkNotNull(courseId, 'courseId');
// const _extra = <String, dynamic>{};
// final queryParameters = <String, dynamic>{};
// final _data = <String, dynamic>{};
// final _result = await _dio.request<Map<String, dynamic>>(
// '/course/catalogList/$courseId',
// queryParameters: queryParameters,
// options: RequestOptions(
// method: 'GET',
// headers: <String, dynamic>{},
// extra: _extra,
// baseUrl: baseUrl),
// data: _data);
// final value = BaseData<dynamic>.fromJson(
// _result.data,
// (json) => json as dynamic,
// );
// return value;
// }
@override
Future<BaseData<PageInfo<CourseList>>> courseList(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>>(
'/course/list',
queryParameters: queryParameters,
options: RequestOptions(
method: 'POST',
headers: <String, dynamic>{},
extra: _extra,
baseUrl: baseUrl),
data: _data);
final value = BaseData<PageInfo<CourseList>>.fromJson(
_result.data,
(json) => PageInfo<CourseList>.fromJson(
json,
(json) => CourseList.fromJson(json),
),
);
return value;
}
@override
Future<BaseData<List<CollectClassList>>> collectList() async {
const _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _data = <String, dynamic>{};
final _result = await _dio.request<Map<String, dynamic>>(
'/course/collectList',
queryParameters: queryParameters,
options: RequestOptions(
method: 'GET',
headers: <String, dynamic>{},
extra: _extra,
baseUrl: baseUrl),
data: _data);
final value = BaseData<List<CollectClassList>>.fromJson(
_result.data,
(json) => (json as List<dynamic>)
.map<CollectClassList>((i) => CollectClassList.fromJson(i as Map<String, dynamic>))
.toList());
return value;
}
@override
Future<BaseData<List<CourseList>>> collect(collectId) async {
ArgumentError.checkNotNull(collectId, 'collectId');
const _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _data = <String, dynamic>{};
final _result = await _dio.request<Map<String, dynamic>>(
'/course/collect/$collectId',
queryParameters: queryParameters,
options: RequestOptions(
method: 'GET',
headers: <String, dynamic>{},
extra: _extra,
baseUrl: baseUrl),
data: _data);
final value = BaseData<List<CourseList>>.fromJson(
_result.data,
(json) => (json as List<dynamic>)
.map<CourseList>((i) => CourseList.fromJson(i as Map<String, dynamic>))
.toList());
return value;
}
@override
Future<BaseData<CourseDetails>> course(id) async {
ArgumentError.checkNotNull(id, 'id');
const _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _data = <String, dynamic>{};
final _result = await _dio.request<Map<String, dynamic>>(
'/course/$id',
queryParameters: queryParameters,
options: RequestOptions(
method: 'GET',
headers: <String, dynamic>{},
extra: _extra,
baseUrl: baseUrl),
data: _data);
final value = BaseData<CourseDetails>.fromJson(
_result.data,
(json) => CourseDetails.fromJson(json),
);
return value;
}
@override
Future<BaseData<dynamic>> courseLikes(courseId) async {
ArgumentError.checkNotNull(courseId, 'courseId');
const _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _data = <String, dynamic>{};
final _result = await _dio.request<Map<String, dynamic>>(
'/course/likes/$courseId',
queryParameters: queryParameters,
options: RequestOptions(
method: 'GET',
headers: <String, dynamic>{},
extra: _extra,
baseUrl: baseUrl),
data: _data);
final value = BaseData<dynamic>.fromJson(
_result.data,
(json) => json as dynamic,
);
return value;
}
}

13
lib/settlement/settlement.dart

@ -62,7 +62,6 @@ class _Settlement extends State<Settlement> {
CouponListBean couponListBean;
PromotionInfoListBean promotion;
String mobile;
bool placeOrder = false;
@override
@ -318,7 +317,9 @@ class _Settlement extends State<Settlement> {
} else {
SmartDialog.show(
widget: Tips(
() {},
() {
toOrderDetails(placeOrderFirst.id);
},
text: "${baseData.msg}",
));
}
@ -383,10 +384,10 @@ class _Settlement extends State<Settlement> {
),
///
EditPhoneWidget(
storeInfo,
mobileChange,
),
// EditPhoneWidget(
// storeInfo,
// mobileChange,
// ),
///
SettlementOrderCommodity(

11
lib/store/store_order.dart

@ -637,18 +637,19 @@ class _StoreOrderPage extends State<StoreOrderPage>
}
///
_queryMiNiDetail(String id) async {
_queryMiNiDetail(String id,int count) async {
EasyLoading.show(status: S.current.zhengzaijiazai);
BaseData<MiNiDetail> baseData = await minService.miNiDetail(id).catchError((error){});
if (baseData != null && baseData.isSuccess) {
showStoreSelector(baseData.data, id);
showStoreSelector(baseData.data, id,count);
}
}
///
showStoreSelector(MiNiDetail miNiDetail, String id) async {
if (miNiDetail.attrList != null && miNiDetail.attrList.length == 1) {
_addShopCar(miNiDetail, [], 1);
showStoreSelector(MiNiDetail miNiDetail, String id,int count) async {
if (miNiDetail.attrList != null && miNiDetail.attrList.length == 1
&& miNiDetail.attrList[0].attrValueList.length == 1) {
_addShopCar(miNiDetail, [], count);
} else {
EasyLoading.dismiss();
dialogShowing = true;

2
lib/store/store_view/shop_car.dart

@ -8,7 +8,7 @@ import 'package:huixiang/view_widget/round_button.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class ShopCar extends StatefulWidget {
final Function(String id) queryMiNiDetail;
final Function(String id,int count) queryMiNiDetail;
final Function() clearShopCar;
final Function() toDownOrder;
final Function(ShoppingCartSkuItemListBean cart) shopCartAdd;

12
lib/store/store_view/shop_goods.dart

@ -8,7 +8,7 @@ import 'package:huixiang/view_widget/custom_image.dart';
import 'package:huixiang/view_widget/round_button.dart';
class ShopGoods extends StatefulWidget {
final Function(String id) queryMiNiDetail;
final Function(String id,int count) queryMiNiDetail;
final Function(ShoppingCartSkuItemListBean shoppingCartSkuItemListBean) add;
final Function(ShoppingCartSkuItemListBean shoppingCartSkuItemListBean)
reduce;
@ -131,7 +131,7 @@ class _ShopGoods extends State<ShopGoods> {
],
),
Spacer(),
if (!widget.isShopCart)
if (!widget.isShopCart && (widget.productListBean?.attrStyle??0) == 1)
Stack(
children: [
Container(
@ -150,7 +150,7 @@ class _ShopGoods extends State<ShopGoods> {
widget.productListBean != null
? widget.productListBean.id
: widget.shoppingCartSkuItemListBean
.productId,
.productId,0
);
},
),
@ -173,7 +173,7 @@ class _ShopGoods extends State<ShopGoods> {
),
],
),
if (widget.isShopCart)
if (widget.isShopCart || (widget.productListBean?.attrStyle??0) == 0)
InkWell(
onTap: () {
widget.reduce(widget.shoppingCartSkuItemListBean);
@ -184,7 +184,7 @@ class _ShopGoods extends State<ShopGoods> {
height: 22,
),
),
if (widget.isShopCart)
if (widget.isShopCart || (widget.productListBean?.attrStyle??0) == 0)
Container(
width: 30,
alignment: Alignment.center,
@ -197,7 +197,7 @@ class _ShopGoods extends State<ShopGoods> {
),
),
),
if (widget.isShopCart)
if (widget.isShopCart || (widget.productListBean?.attrStyle??0) == 0)
InkWell(
onTap: () {
widget.add(widget.shoppingCartSkuItemListBean);

9
lib/store/store_view/store_order_list.dart

@ -21,7 +21,7 @@ class StoreOrderListPage extends StatefulWidget {
final ScrollController controller;
final String minToken;
final String tenant;
final Function(String id) queryMiNiDetail;
final Function(String id,int count) queryMiNiDetail;
ShoppingCart shopCarGoods;
@ -232,14 +232,15 @@ class _StoreOrderListPage extends State<StoreOrderListPage> {
}
return InkWell(
onTap: () {
widget.queryMiNiDetail(productListBeans[position].id);
widget.queryMiNiDetail(productListBeans[position].id,1);
},
child: ShopGoods(
(ShoppingCartSkuItemListBean shoppingCartSkuItemListBean) {
// widget.add(productListBeans[position].id);
widget.queryMiNiDetail(productListBeans[position].id,1);
},
(ShoppingCartSkuItemListBean shoppingCartSkuItemListBean) {
// widget.reduce(productListBeans[position].id);
if(count > 0)
widget.queryMiNiDetail(productListBeans[position].id,-1);
},
productListBean: productListBeans[position],
count: count,

3
lib/union/union_page.dart

@ -1,5 +1,4 @@
import 'dart:ui';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
@ -13,7 +12,6 @@ import 'package:huixiang/main.dart';
import 'package:huixiang/retrofit/data/base_data.dart';
import 'package:huixiang/retrofit/data/store.dart';
import 'package:huixiang/retrofit/retrofit_api.dart';
import 'package:huixiang/store/scan.dart';
import 'package:huixiang/utils/event_type.dart';
import 'package:huixiang/utils/location.dart';
import 'package:huixiang/view_widget/border_text.dart';
@ -93,7 +91,6 @@ class _UnionPage extends State<UnionPage>
startLocation() async {
EasyLoading.show(status: S.current.zhengzaijiazai);
Location.getInstance()
.aMapFlutterLocation
.onResultCallback()

4
lib/view_widget/my_appbar.dart

@ -16,6 +16,7 @@ class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
final double toolbarHeight;
final bool leading;
final Brightness brightness;
final Function exit;
MyAppBar({
Key key,
@ -32,6 +33,7 @@ class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
this.titleSize = 18,
this.brightness = Brightness.light,
this.leading = true,
this.exit
}) : preferredSize = Size.fromHeight(toolbarHeight ?? kToolbarHeight),
super(key: key) {
if (actions == null)
@ -58,7 +60,9 @@ class MyAppBar extends StatelessWidget implements PreferredSizeWidget {
leading: leading
? GestureDetector(
onTap: () {
if(exit == null)
Navigator.of(context).pop();
else exit();
},
child: Container(
alignment: Alignment.centerRight,

6
lib/web/web_page.dart

@ -190,7 +190,7 @@ class _WebPage extends State<WebPage> with WidgetsBindingObserver {
///
_queryInformationLikes() async {
BaseData baseData = await apiService.informationLikes(
widget.arguments["activityId"] ?? widget.arguments["articleId"]);
widget.arguments["activityId"] ?? widget.arguments["articleId"]).catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
if (article != null) {
if (article.liked) {
@ -273,10 +273,14 @@ class _WebPage extends State<WebPage> with WidgetsBindingObserver {
commentKey,
article?.likes ?? activity?.likes ?? 0,
widget.arguments["activityId"] ?? widget.arguments["articleId"],
1,
isKeyBoardShow,
_reply,
_delCommentTips,
12.sp,
requestApiFinish: (total){setState(() {
commentTotal = total;
});},
),
],
),

50
lib/web/web_view/comment_list.dart

@ -22,10 +22,12 @@ class CommentList extends StatefulWidget {
final Function delCommentTips;
final double fontSize;
final String relationalId;
final int relationalType;
final int like;
final Function requestApiFinish;
CommentList(Key key, this.like, this.relationalId,
this.isKeyBoardShow, this.reply, this.delCommentTips, this.fontSize)
CommentList(Key key, this.like, this.relationalId,this.relationalType,
this.isKeyBoardShow, this.reply, this.delCommentTips, this.fontSize,{this.requestApiFinish})
: super(key: key);
@override
@ -159,23 +161,23 @@ class CommentListState extends State<CommentList> {
),
),
),
if (memberList == null || memberList.length == 0)
Container(
width: double.infinity,
height: MediaQuery.of(context).size.height - kToolbarHeight
- MediaQuery.of(context).padding.top - 160.h,
alignment: Alignment.topCenter,
color: Color(0xFFF2F2F2),
padding: EdgeInsets.only(top: 22.h),
child: Text(
S.of(context).zanwupinglun,
style: TextStyle(
fontSize: widget.fontSize + 2,
fontWeight: FontWeight.bold,
color: Color(0xFFA0A0A0),
),
),
),
// if (memberList == null || memberList.length == 0)
// Container(
// width: double.infinity,
// height: MediaQuery.of(context).size.height - kToolbarHeight
// - MediaQuery.of(context).padding.top - 160.h,
// alignment: Alignment.topCenter,
// color: Color(0xFFF2F2F2),
// padding: EdgeInsets.only(top: 22.h),
// child: Text(
// S.of(context).zanwupinglun,
// style: TextStyle(
// fontSize: widget.fontSize + 2,
// fontWeight: FontWeight.bold,
// color: Color(0xFFA0A0A0),
// ),
// ),
// ),
],
),
),
@ -197,6 +199,8 @@ class CommentListState extends State<CommentList> {
//
queryMemberCommentList() async {
if(widget?.relationalId == null || widget.relationalId.isEmpty)
return;
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
if (apiService == null)
apiService = ApiService(
@ -210,13 +214,17 @@ class CommentListState extends State<CommentList> {
"pageNum": 1,
"pageSize": 100,
"relationalId": widget.relationalId,
"relationalType": 1,
"relationalType": widget.relationalType,
}).catchError((error) {});
if (baseData != null && baseData.isSuccess) {
setState(() {
memberList.clear();
commentTotal = baseData.data.size;
memberList = baseData.data.list;
widget.requestApiFinish(commentTotal);
memberList.addAll(baseData.data.list);
contentHeight();
setState(() {});
});
}
}

Loading…
Cancel
Save