diff --git a/circle_app/lib/app/call_out/logic.dart b/circle_app/lib/app/call_out/logic.dart index 497a59d..f66f695 100644 --- a/circle_app/lib/app/call_out/logic.dart +++ b/circle_app/lib/app/call_out/logic.dart @@ -15,6 +15,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:video_player/video_player.dart'; import 'package:video_thumbnail/video_thumbnail.dart'; +import '../../common/Widgets/open_vip_tip/view.dart'; import '../../common/errorcode.dart'; import '../../network/api.dart'; import '../../network/dio_manager.dart'; @@ -35,7 +36,7 @@ class Call_outLogic extends GetxController { var quToken = ''; VideoPlayerController? videoPlayerController; List numbers = []; - List myConfigData= Get.arguments['numbers']; + List myConfigData = Get.arguments['numbers']; int vip = 0; @override @@ -47,20 +48,20 @@ class Call_outLogic extends GetxController { @override void onInit() async { super.onInit(); - if(myConfigData!=null){ - // print(myConfigData.name); + if (myConfigData != null) { + // print(myConfigData.name); numbers.addAll(myConfigData); circleName = numbers[0].name; SharedPreferences prefs = await SharedPreferences.getInstance(); - vip = prefs.getInt("vip")??0; - if(vip == 2){ - isCheck = true; - } + vip = prefs.getInt("vip") ?? 0; + if (vip == 2) { + isCheck = true; + } update(); } - - var data = await DioManager.instance.get(url: Api.getCircleList, params: {}); + var data = + await DioManager.instance.get(url: Api.getCircleList, params: {}); var bean = BaseResponse.fromJson( data, (data) => ConfigBean.fromJson(data)); if (bean.isSuccess()) { @@ -74,7 +75,15 @@ class Call_outLogic extends GetxController { var qiniuBean = BaseResponse.fromJson( quniuData, (quniuData) => QnTokenData.fromJson(quniuData)); quToken = qiniuBean.data!.token.toString(); - + } + showRechargeDialog(){ + Get.bottomSheet( + Scaffold( + backgroundColor: Colors.transparent, + body: Open_vip_tipPage(), + ), + isScrollControlled: true, + enableDrag: false); } @@ -124,147 +133,163 @@ class Call_outLogic extends GetxController { 'useQueen': isCheck, }); - var beandata = BaseResponse.fromJson(data, (jsonData) => jsonData,); + var beandata = BaseResponse.fromJson( + data, + (jsonData) => jsonData, + ); if (beandata.isSuccess()) { showToast(beandata.msg); // Navigator.pop(Get.context!, numbers); Get.back(); - }else if(beandata.code == 30503){ - if(beandata.data ==null){ - return ; + } else if (beandata.code == 30503) { + if (beandata.data == null) { + return; } showToast(beandata.msg); var callOutBean = BaseResponse>.fromJson( data, - (jsonData) => List.from(jsonData), + (jsonData) => List.from(jsonData), ); - textEditingController.text = filterSensitiveWords(textEditingController.text , callOutBean.data!); - print(filterSensitiveWords(textEditingController.text , callOutBean.data!)); + textEditingController.text = + filterSensitiveWords(textEditingController.text, callOutBean.data!); + print( + filterSensitiveWords(textEditingController.text, callOutBean.data!)); update(); - } else if(beandata.code == 30505){ - var callOutBean = BaseResponse.fromJson(data, (jsonData) => CirclePaymentBean.fromJson(jsonData),); + } else if (beandata.code == 30505) { + var callOutBean = BaseResponse.fromJson( + data, + (jsonData) => CirclePaymentBean.fromJson(jsonData), + ); showDialog(); - // tipWdiget() - }else{ + // tipWdiget() + } else { showToast(beandata.msg); } } - void showDialog(){ - Get.bottomSheet(Scaffold( - backgroundColor: Colors.transparent, - body: Container( - width: Get.width, - height: Get.height, - child: Center( - child: Container( - width: 339.sp, - height: 330.sp, - decoration: BoxDecoration( - image: DecorationImage( - fit: BoxFit.fill, - image: AssetImage(getCircleImage('add_tip_bg')))), - child: Stack( - alignment: Alignment.center, - children: [ - Positioned( - top: 5.sp, - right: 12.sp, - child: GestureDetector( - onTap: () { - Get.back(); - }, - child: Image.asset( - getCircleImage('close'), - width: 24.sp, - ), - )), - Positioned( - top: 24.sp, - child: Text( - '解锁圈子才能发布喊话', - style: TextStyle(color: Colors.white, fontSize: 16.sp), - )), - Positioned( - left: 17.sp, - top: 64.sp, - child: Text( - '为什么要解锁圈子?', - style: TextStyle(color: Colors.white, fontSize: 16.sp), - )), - Positioned( - top: 98.sp, - child: Container( - width: 339.sp, - padding: EdgeInsets.only(left: 17.sp, right: 17.sp), - child: Text( - '为打造纯净的社交环境,更好地服务大家,基于以下几方面考虑:1、平台升级为全天24小时人工审核,保证用户真实,避免骗子、酒托、虚假人士等扰乱平台 ;2、杜绝未入圈用户随意骚扰或影响已入圈的跨友;3、谢绝只会白嫖的猎奇人士。', - style: TextStyle( - color: Color.fromRGBO(247, 250, 250, 0.8), - fontSize: 12.sp)), - )), - Positioned( - bottom: 18.sp, - child: Container( - width: 168.sp, - height: 42.sp, - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(21.sp), - gradient: const LinearGradient( - begin: Alignment.centerLeft, - end: Alignment.centerRight, - colors: [Color(0xff0AFCFF), Color(0xffD739EA)])), - child: Text( - '立即解锁', - style: TextStyle(color: Colors.white, fontSize: 16.sp), - ), - )), - Positioned( - bottom: 72.sp, - child: Container( - child: Row( - children: [ - Text( - '¥18', - style: TextStyle( - color: Color(0xffE845FF), - fontSize: 16.sp, - fontWeight: FontWeight.w600), + + void showDialog() { + Get.bottomSheet( + Scaffold( + backgroundColor: Colors.transparent, + body: Container( + width: Get.width, + height: Get.height, + child: Center( + child: Container( + width: 339.sp, + height: 330.sp, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage(getCircleImage('add_tip_bg')))), + child: Stack( + alignment: Alignment.center, + children: [ + Positioned( + top: 5.sp, + right: 12.sp, + child: GestureDetector( + onTap: () { + Get.back(); + }, + child: Image.asset( + getCircleImage('close'), + width: 24.sp, ), - SizedBox( - width: 2.sp, + )), + Positioned( + top: 24.sp, + child: Text( + '解锁圈子才能发布喊话', + style: + TextStyle(color: Colors.white, fontSize: 16.sp), + )), + Positioned( + left: 17.sp, + top: 64.sp, + child: Text( + '为什么要解锁圈子?', + style: + TextStyle(color: Colors.white, fontSize: 16.sp), + )), + Positioned( + top: 98.sp, + child: Container( + width: 339.sp, + padding: EdgeInsets.only(left: 17.sp, right: 17.sp), + child: Text( + '为打造纯净的社交环境,更好地服务大家,基于以下几方面考虑:1、平台升级为全天24小时人工审核,保证用户真实,避免骗子、酒托、虚假人士等扰乱平台 ;2、杜绝未入圈用户随意骚扰或影响已入圈的跨友;3、谢绝只会白嫖的猎奇人士。', + style: TextStyle( + color: Color.fromRGBO(247, 250, 250, 0.8), + fontSize: 12.sp)), + )), + Positioned( + bottom: 18.sp, + child: Container( + width: 168.sp, + height: 42.sp, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21.sp), + gradient: const LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [ + Color(0xff0AFCFF), + Color(0xffD739EA) + ])), + child: Text( + '立即解锁', + style: + TextStyle(color: Colors.white, fontSize: 16.sp), ), - Text( - '(原价60)', - style: TextStyle( - color: Colors.white70, - fontSize: 16.sp, - fontWeight: FontWeight.w400, - decoration: TextDecoration.lineThrough, - decorationColor: Colors.white70, - ), + )), + Positioned( + bottom: 72.sp, + child: Container( + child: Row( + children: [ + Text( + '¥18', + style: TextStyle( + color: Color(0xffE845FF), + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + width: 2.sp, + ), + Text( + '(原价60)', + style: TextStyle( + color: Colors.white70, + fontSize: 16.sp, + fontWeight: FontWeight.w400, + decoration: TextDecoration.lineThrough, + decorationColor: Colors.white70, + ), + ), + ], ), - ], - ), - )) - ], + )) + ], + ), + ), ), ), ), - ), - ), - isScrollControlled: true, - enableDrag: false - ); + isScrollControlled: true, + enableDrag: false); } startSelectCircleActivity() async { - var data = await Get.toNamed(AppRoutes.SelectCircleActivity, - arguments: {"interestMap": configBean.interestMap, - 'selectCircle':numbers, - "isRodio": true}); + var data = await Get.toNamed(AppRoutes.SelectCircleActivity, arguments: { + "interestMap": configBean.interestMap, + 'selectCircle': numbers, + "isRodio": true + }); if (null != data) { numbers = data; circleName = numbers[0].name; @@ -276,7 +301,7 @@ class Call_outLogic extends GetxController { showImg() async { try { - if (state.videolist.length!=0) { + if (state.videolist.length != 0) { showToast("已添加视频,无法添加图片。"); return; } @@ -287,24 +312,16 @@ class Call_outLogic extends GetxController { final XFile? pickedFile = await _picker.pickImage( source: ImageSource.gallery, ); + if(null==pickedFile){ + return; + } + SmartDialog.showLoading(); - var path = await getApplicationSupportDirectoryPath(); - CompressObject compressObject = CompressObject( - imageFile:File(pickedFile!.path), //image - path:path, //compress to path - quality: 80,//first compress quality, default 80 - step: 9,//compress quality step, The bigger the fast, Smaller is more accurate, default 6 - mode: CompressMode.LARGE2SMALL,//default AUTO - ); - Luban.compressImage(compressObject).then((_path) { - updataQiniu(pickedFile!,CONFIG.CALL_OUT_IMAGE,quToken,(result){ - state.imaglist.add(result); - update(); - }); + upDataImage(quToken,pickedFile!,CONFIG.CALL_OUT_IMAGE,(result){ + SmartDialog.dismiss(); + state.imaglist.add(result); + update(); }); - - - } catch (e) { print(e); } @@ -333,14 +350,12 @@ class Call_outLogic extends GetxController { return completer.future; } - - showVideo() async { if (state.imaglist.length != 0) { showToast("已添加图片,无法添加视频。"); return; } - if (state.videolist.length!=0) { + if (state.videolist.length != 0) { showToast("最多上传1个视频哦~"); return; } @@ -348,9 +363,12 @@ class Call_outLogic extends GetxController { final XFile? pickedFile = await _picker.pickVideo( source: ImageSource.gallery, ); + if(null==pickedFile){ + return; + } SmartDialog.showLoading(); var path = await getApplicationSupportDirectoryPath(); - compressVideo(pickedFile!.path,path,(result) async{ + compressVideo(pickedFile!.path, path, (result) async { print(result); videoPlayerController = VideoPlayerController.file( File(result), @@ -368,20 +386,20 @@ class Call_outLogic extends GetxController { } }); - upVideoQiniu(result,pickedFile.name,CONFIG.CALL_OUT_VIDEO,quToken,(result){ + updataQiniu(result, pickedFile.name, CONFIG.CALL_OUT_VIDEO, quToken, + (result) { + SmartDialog.dismiss(); state.videolist.add(result); update(); }); } else { + SmartDialog.dismiss(); showToast("请上传5-30秒的视频"); } }); - } catch (e) {} } - - Future _loadCaptions(BuildContext context) async { final String fileContents = await DefaultAssetBundle.of(context) .loadString('assets/bumble_bee_captions.vtt'); @@ -424,7 +442,6 @@ class ThumbnailResult { required this.width}); } - class CirclePaymentBean { final int id; final String title; @@ -447,4 +464,3 @@ class CirclePaymentBean { ); } } - diff --git a/circle_app/lib/app/call_out/view.dart b/circle_app/lib/app/call_out/view.dart index 69e80b2..ee25469 100644 --- a/circle_app/lib/app/call_out/view.dart +++ b/circle_app/lib/app/call_out/view.dart @@ -6,6 +6,7 @@ import 'package:get/get.dart'; import 'package:video_player/video_player.dart'; import '../../router/app_routers.dart'; +import '../circle/widgets/video_item.dart'; import 'logic.dart'; class Call_outPage extends StatelessWidget { @@ -29,6 +30,7 @@ class Call_outPage extends StatelessWidget { fit: BoxFit.fill, image: AssetImage(getBaseImage('home_back')))), child: Scaffold( + resizeToAvoidBottomInset: false, backgroundColor: Colors.transparent, appBar: MyAppBar( centerTitle: '世界喊话', @@ -179,8 +181,13 @@ class Call_outPage extends StatelessWidget { Expanded( child: GestureDetector( onTap: () { - controller.isCheck = !controller.isCheck; - controller.update(); + if(controller.vip ==2){ + controller.isCheck = !controller.isCheck; + controller.update(); + }else{ + controller.showRechargeDialog(); + } + }, child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -229,48 +236,88 @@ class Call_outPage extends StatelessWidget { if (controller.videoPlayerController == null) { return Container(); } else { - return Container( - width:controller.videoPlayerController!.value.size.width < controller.videoPlayerController!.value.size.height ? 135.sp : 240.sp, - height:controller.videoPlayerController!.value.size.width < controller.videoPlayerController!.value.size.height ? 240.sp :135.sp, - child: GestureDetector( - onTap: () { - if(controller.videoPlayerController!.value.isPlaying){ - controller.videoPlayerController!.pause(); - }else{ - controller.videoPlayerController!.play(); - } - controller.update(); - }, - child: AspectRatio( - aspectRatio: controller.videoPlayerController!.value.aspectRatio, - child: Stack( - children: [ - VideoPlayer(controller.videoPlayerController!), - Center(child:controller.videoPlayerController!.value.isPlaying ? Container() : Image(image: AssetImage(getMineImage("icon_play")),width: 30.sp,height: 30.sp,),), - Positioned( - top: 0, - right: 0, - child: GestureDetector( - onTap: () { - // showToast("删除"); - _showDelVideoDialog(Get.context!, controller); - }, - child: Image( - image: AssetImage(getMineImage("icon_img_del")), - width: 20.sp, - height: 20.sp, - ), - )) + return _mixVideo(controller); - // ClosedCaption(text: controller.videoPlayerController!.value.caption.text), - // _ControlsOverlay(controller: controller.videoPlayerController), - // VideoProgressIndicator(controller.videoPlayerController!, allowScrubbing: true), - ], - ), + + + } + } + + Widget _maxVideo(Call_outLogic controller){ + return Container( + width:controller.videoPlayerController!.value.size.width < controller.videoPlayerController!.value.size.height ? 9*15.sp : 16*15.sp, + height:controller.videoPlayerController!.value.size.width < controller.videoPlayerController!.value.size.height ? 16*15.sp :9*15.sp, + + child: Stack( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(6.sp), + child: VideoItemWidget(controller.state.videolist[0])), + // Center(child:controller.videoPlayerController!.value.isPlaying ? Container() : Image(image: AssetImage(getMineImage("icon_play")),width: 30.sp,height: 30.sp,),), + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () { + // showToast("删除"); + _showDelVideoDialog(Get.context!, controller); + }, + child: Image( + image: AssetImage(getMineImage("icon_img_del")), + width: 20.sp, + height: 20.sp, + ), + )) + + // ClosedCaption(text: controller.videoPlayerController!.value.caption.text), + // _ControlsOverlay(controller: controller.videoPlayerController), + // VideoProgressIndicator(controller.videoPlayerController!, allowScrubbing: true), + ], + ), + ); + } + Widget _mixVideo(Call_outLogic controller){ + return Container( + width:controller.videoPlayerController!.value.size.width < controller.videoPlayerController!.value.size.height ? 135.sp : 240.sp, + height:controller.videoPlayerController!.value.size.width < controller.videoPlayerController!.value.size.height ? 240.sp :135.sp, + child: GestureDetector( + onTap: () { + if(controller.videoPlayerController!.value.isPlaying){ + controller.videoPlayerController!.pause(); + }else{ + controller.videoPlayerController!.play(); + } + controller.update(); + }, + child: AspectRatio( + aspectRatio: controller.videoPlayerController!.value.aspectRatio, + child: Stack( + children: [ + VideoPlayer(controller.videoPlayerController!), + Center(child:controller.videoPlayerController!.value.isPlaying ? Container() : Image(image: AssetImage(getMineImage("icon_play")),width: 30.sp,height: 30.sp,),), + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () { + // showToast("删除"); + _showDelVideoDialog(Get.context!, controller); + }, + child: Image( + image: AssetImage(getMineImage("icon_img_del")), + width: 20.sp, + height: 20.sp, + ), + )) + + // ClosedCaption(text: controller.videoPlayerController!.value.caption.text), + // _ControlsOverlay(controller: controller.videoPlayerController), + // VideoProgressIndicator(controller.videoPlayerController!, allowScrubbing: true), + ], ), ), - ); - } + ), + ); } Widget _imageAdapter(Call_outLogic controller) { @@ -571,7 +618,7 @@ class Call_outPage extends StatelessWidget { GestureDetector( onTap: () { Navigator.pop(context); - + controller.videoPlayerController?.dispose(); controller.videoPlayerController=null; controller.state.videolist = []; controller.update(); diff --git a/circle_app/lib/app/circle/widgets/info_list_view.dart b/circle_app/lib/app/circle/widgets/info_list_view.dart index b7cd06f..da5a285 100644 --- a/circle_app/lib/app/circle/widgets/info_list_view.dart +++ b/circle_app/lib/app/circle/widgets/info_list_view.dart @@ -467,7 +467,7 @@ class InfoListView extends StatelessWidget { fit: BoxFit.fill, ), ), - )) + ) ], )), Expanded( @@ -632,10 +632,7 @@ class InfoListView extends StatelessWidget { ) ], ), - ) - ], - ), - ); + )])); } ///普通图文喊话 diff --git a/circle_app/lib/app/login/complete_material/logic.dart b/circle_app/lib/app/login/complete_material/logic.dart index b92d6de..5b84b9a 100644 --- a/circle_app/lib/app/login/complete_material/logic.dart +++ b/circle_app/lib/app/login/complete_material/logic.dart @@ -97,25 +97,19 @@ class Complete_materialLogic extends GetxController { final XFile? pickedFile = await _picker.pickImage( source: ImageSource.gallery, ); - var path = await getApplicationSupportDirectoryPath(); - CompressObject compressObject = CompressObject( - imageFile:File(pickedFile!.path), //image - path:path, //compress to path - quality: 80,//first compress quality, default 80 - step: 9,//compress quality step, The bigger the fast, Smaller is more accurate, default 6 - mode: CompressMode.LARGE2SMALL,//default AUTO - ); - Luban.compressImage(compressObject).then((_path) { - updataQiniu(pickedFile!,CONFIG.USER_INFO_AVATAR,quToken,(result){ - headUrl = result; - update(); - }); + if(null==pickedFile){ + return; + } + SmartDialog.showLoading(); + upDataImage(quToken,pickedFile!,CONFIG.USER_INFO_AVATAR,(result){ + SmartDialog.dismiss(); + headUrl = result; + update(); }); - } catch (e) { print(e); } diff --git a/circle_app/lib/app/login/complete_material/view.dart b/circle_app/lib/app/login/complete_material/view.dart index a946b74..dd01cb0 100644 --- a/circle_app/lib/app/login/complete_material/view.dart +++ b/circle_app/lib/app/login/complete_material/view.dart @@ -1,3 +1,4 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/components/my_app_bar.dart'; import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/util.dart'; @@ -61,9 +62,9 @@ class Complete_materialPage extends StatelessWidget { height: 86.sp, ) : ClipOval( - child: Image.network( + child: CachedNetworkImage( fit: BoxFit.fill, - controller.headUrl, + imageUrl: controller.headUrl, width: 86.sp, height: 86.sp, ), @@ -300,27 +301,41 @@ class Complete_materialPage extends StatelessWidget { width: 240.sp, child: ListView.builder( itemCount: controller.numbers.length, - // 替换为实际的 item 数量 scrollDirection: Axis.horizontal, - // 设置为水平方向 padding: EdgeInsets.symmetric(vertical: 18.sp), - // 替换为实际的边距值 itemBuilder: (context, index) { return Container( margin: EdgeInsets.only(right: 11.sp), // 替换为实际的 item 间距 child: Container( - height: 34.sp, - padding: EdgeInsets.only(left: 15.sp, right: 15.sp), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17.0.sp), // 设置圆角半径 - border: Border.all(color: Colors.white, width: 1.sp), + borderRadius: BorderRadius.circular(17.0), // 设置圆角半径 + gradient: LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + ), color: Color(0xFF392D53), ), - child: Text( - controller.numbers[index].name, - style: TextStyle( - fontSize: 12.0.sp, - color: Colors.white, + child: Container( + margin: EdgeInsets.all(0.5.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.0), + // shape: BoxShape.circle, + color: Color(0xFF392D53), + ), + child: Padding( + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 15.sp, right: 15.sp), + child: Center( + child: Text( + controller.numbers[index].name, + style: TextStyle( + fontSize: 11.0, + color: Colors.white, + ), + ), + ), ), ), ), // 替换为实际的列表项小部件 @@ -328,24 +343,9 @@ class Complete_materialPage extends StatelessWidget { }, ), ); - - // return Container( - // height: 21.sp, - // padding: EdgeInsets.only(left: 12.sp, right: 12.sp), - // margin: EdgeInsets.only(left: 10.sp), - // alignment: Alignment.center, - // decoration: BoxDecoration( - // border: Border.all(width: 1, color: Colors.white), - // borderRadius: BorderRadius.circular(21.sp), - // ), - // child: Text( - // interest, - // style: TextStyle( - // color: Colors.white, fontSize: 11.sp, fontWeight: FontWeight.w500), - // ), - // ); } + showSexPiker(context, Complete_materialLogic controller) { Pickers.showSinglePicker(context, pickerStyle: DefaultPickerStyle.dark(), diff --git a/circle_app/lib/app/minefragment/view.dart b/circle_app/lib/app/minefragment/view.dart index aecd7fa..2081712 100644 --- a/circle_app/lib/app/minefragment/view.dart +++ b/circle_app/lib/app/minefragment/view.dart @@ -1,3 +1,4 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/router/app_routers.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -399,8 +400,8 @@ class MinefragmentPage extends StatelessWidget { child:logic.userInfoBean==null ? Container( width: 65.sp, height: 65.sp, - ): Image.network( - logic.userInfoBean!=null ? logic.userInfoBean!.avatar!: "", + ): CachedNetworkImage( + imageUrl: logic.userInfoBean!=null ? logic.userInfoBean!.avatar!: "", width: 65.sp, height: 65.sp, ), diff --git a/circle_app/lib/app/report/logic.dart b/circle_app/lib/app/report/logic.dart index 822cdfd..a0120f5 100644 --- a/circle_app/lib/app/report/logic.dart +++ b/circle_app/lib/app/report/logic.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; @@ -5,6 +6,7 @@ import 'state.dart'; class ReportLogic extends GetxController { final ReportState state = ReportState(); + TextEditingController textEditingController = TextEditingController(); List arrList = [ MyObject("涉嫌欺诈", false), MyObject("色情低俗", false), diff --git a/circle_app/lib/app/report/view.dart b/circle_app/lib/app/report/view.dart index 451fa42..1ea94cc 100644 --- a/circle_app/lib/app/report/view.dart +++ b/circle_app/lib/app/report/view.dart @@ -80,6 +80,7 @@ class ReportPage extends StatelessWidget { Container( margin: EdgeInsets.only(left: 16, right: 16), height: 200, + width: double.infinity, decoration: BoxDecoration( color: Color(0xFF4C3E5F), borderRadius: BorderRadius.circular(10), @@ -87,23 +88,62 @@ class ReportPage extends StatelessWidget { padding: EdgeInsets.all(16.sp), child: Stack( children: [ - TextField( - decoration: InputDecoration.collapsed( - hintText: '违规补充说明,帮助审核处理,选填', - hintStyle: TextStyle( - color: Color(0xFFB7BECC), - fontSize: 12, - ), - ), - maxLines: null, - maxLength: 200, - style: TextStyle( - color: Color(0xFF000000), - fontSize: 12, + Container( + height: 200.sp, + child: TextField( + controller: controller.textEditingController, + onChanged: (value) { + controller.update(); + }, + style: TextStyle( + color: Colors.white, fontSize: 14.0.sp), + maxLines: 32, + maxLength: 200, + decoration: InputDecoration( + hintStyle: TextStyle( + color: Color.fromRGBO( + 255, 255, 255, 0.6), + fontSize: 14.sp), + hintText: '违规补充说明,帮助审核处理,选填', + border: InputBorder.none, + + counter: Text('')), ), ), + Positioned( + right: 15.sp, + top: 160.sp, + child: Text( + '${controller.textEditingController.text.length}/200', + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + )), + + + ], - ), + ) + + + // Stack( + // children: [ + // TextField( + // decoration: InputDecoration.collapsed( + // hintText: '违规补充说明,帮助审核处理,选填', + // border: InputBorder.none, + // hintStyle: TextStyle( + // color: Color(0xFFB7BECC), + // fontSize: 12, + // ), + // ), + // maxLength: 200, + // style: TextStyle( + // color: Color(0xFFFFFFFF), + // fontSize: 12, + // ), + // ), + // ], + // ), ), ], ), diff --git a/circle_app/lib/app/text/view.dart b/circle_app/lib/app/text/view.dart index 9c331e3..92e0684 100644 --- a/circle_app/lib/app/text/view.dart +++ b/circle_app/lib/app/text/view.dart @@ -317,7 +317,7 @@ class _MyTabbedScreenState extends State children: [ GestureDetector( onTap: () { - showToast("鼓掌"); + // showToast("鼓掌"); _showBottomSheet(context); }, child: Image( diff --git a/circle_app/lib/app/userinfo/logic.dart b/circle_app/lib/app/userinfo/logic.dart index d0f3aef..5c0a00d 100644 --- a/circle_app/lib/app/userinfo/logic.dart +++ b/circle_app/lib/app/userinfo/logic.dart @@ -1,9 +1,16 @@ +import 'dart:io'; + +import 'package:flutter_luban/flutter_luban.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; +import '../../common/config.dart'; import '../../network/api.dart'; import '../../network/dio_manager.dart'; +import '../../util/qiniu.dart'; import '../../util/util.dart'; +import '../login/complete_material/logic.dart'; import 'state.dart'; class UserinfoLogic extends GetxController { @@ -15,22 +22,24 @@ class UserinfoLogic extends GetxController { var isVip = 0; var onLineCity = ""; var isLikeFoMsg = ''; - + var quToken = ''; +bool isMe = false; @override void onInit() async { super.onInit(); if (userId == '') { + isMe = true; var data = await DioManager.instance.get(url: Api.getUserInfo); var bean = BaseResponse.fromJson( data, (data) => ResponseBean.fromJson(data)); if(bean.isSuccess()){ - isLikeFoMsg = bean.data.imageUrgeCount.toString()+"位圈友感兴趣,其中"+bean.data.likeMeCount.toString()+"位已催您更新"; + isLikeFoMsg = "${bean.data.imageUrgeCount}位圈友感兴趣,其中${bean.data.likeMeCount}位已催您更新"; userInfoBean = bean.data.user; isVip = userInfoBean!.vip; onLineCity = userInfoBean!.isOnline == true? "在线":"离线"; if(userInfoBean!.city != null) { - onLineCity = onLineCity + "·" + userInfoBean!.city.toString(); + onLineCity = "$onLineCity·${userInfoBean!.city}"; } ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age, userInfoBean!.role, userInfoBean!.orientation); }else{ @@ -39,16 +48,17 @@ class UserinfoLogic extends GetxController { } else { - var data = await DioManager.instance.get(url: Api.getUserInfoTA); + isMe = false; + var data = await DioManager.instance.get(url: Api.getUserInfoTA+userId+"/home"); var bean = BaseResponse.fromJson( data, (data) => ResponseBean.fromJson(data)); if(bean.isSuccess()){ - isLikeFoMsg = bean.data.imageUrgeCount.toString()+"位圈友感兴趣,其中"+bean.data.likeMeCount.toString()+"位已催您更新"; - userInfoBean = bean.data!; + isLikeFoMsg = "${bean.data.imageUrgeCount}位圈友感兴趣,其中${bean.data.likeMeCount}位已催您更新"; + userInfoBean = bean.data!.user; isVip = userInfoBean!.vip; onLineCity = userInfoBean!.isOnline == true? "在线":"离线"; if(userInfoBean!.city != null){ - onLineCity = onLineCity +"·"+userInfoBean!.city.toString(); + onLineCity = "$onLineCity·${userInfoBean!.city}"; } ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age, userInfoBean!.role, userInfoBean!.orientation); @@ -58,6 +68,18 @@ class UserinfoLogic extends GetxController { } update(); + + + var data = + await DioManager.instance.get(url: Api.getqiniuToken, params: {}); + var bean = BaseResponse.fromJson( + data, (data) => QnTokenData.fromJson(data)); + quToken = bean.data!.token.toString(); + + + } + updataImage(){ + showToast(""+state.updataimaglist.toString()); } Future getImageFile() async { @@ -65,13 +87,18 @@ class UserinfoLogic extends GetxController { final XFile? pickedFile = await _picker.pickImage( source: ImageSource.gallery, ); - // setState(() { - // _setImageFileListFromFile(pickedFile); - // }); + if(null==pickedFile){ + return; + } + SmartDialog.showLoading(); + upDataImage(quToken,pickedFile!,CONFIG.USER_ALBUM_IMAGE,(result){ + SmartDialog.dismiss(); + state.imaglist.add(result); + state.updataimaglist.add(result); + update(); + }); } catch (e) { - // setState(() { - // _pickImageError = e; - // }); + } } } diff --git a/circle_app/lib/app/userinfo/state.dart b/circle_app/lib/app/userinfo/state.dart index b63fe67..50d127b 100644 --- a/circle_app/lib/app/userinfo/state.dart +++ b/circle_app/lib/app/userinfo/state.dart @@ -4,4 +4,5 @@ class UserinfoState { ///Initialize variables } List imaglist = []; + List updataimaglist = []; } diff --git a/circle_app/lib/app/userinfo/view.dart b/circle_app/lib/app/userinfo/view.dart index fad9f1f..1f8af58 100644 --- a/circle_app/lib/app/userinfo/view.dart +++ b/circle_app/lib/app/userinfo/view.dart @@ -1,3 +1,4 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -121,7 +122,7 @@ class _MyTabbedScreenState extends State children: [ GestureDetector( onTap: () { - showToast("鼓掌"); + // showToast("鼓掌"); _showBottomSheet(context); }, child: Image( @@ -288,13 +289,13 @@ class _MyTabbedScreenState extends State }, ), ), - titleTab(), + titleTab(controller), Container( margin: EdgeInsets.only(top: 18.sp, bottom: 14.sp), - child: Text( + child: controller.isMe? Text( controller.isLikeFoMsg, style: TextStyle(color: Colors.white30), - )), + ) :Container()) , Expanded( child: Container( // color: Colors.blue, @@ -310,7 +311,7 @@ class _MyTabbedScreenState extends State ), ); } - Widget titleTab(){ + Widget titleTab(UserinfoLogic controller){ return Container( alignment: Alignment.centerLeft, height: 27.sp, @@ -332,28 +333,31 @@ class _MyTabbedScreenState extends State Tab(text: "喊话") ], ), - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17), - gradient: LinearGradient( - colors: [ - Color(0xFF06F9FA), - Color(0xFFDC5BFD), - ], - begin: Alignment.centerLeft, - end: Alignment.centerRight, - ), - ), - padding: EdgeInsets.only( - top: 2.sp, bottom: 2.sp, left: 12.sp, right: 12.sp), - child: Text( - "完成", - style: TextStyle( - color: Colors.white, - fontSize: 12, - ), - ), - ), + GestureDetector(onTap: (){ + controller.updataImage(); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: LinearGradient( + colors: [ + controller.state.updataimaglist.length==0 && controller.isMe? Color(0xFF4A3E5D):Color(0xFF06F9FA), + controller.state.updataimaglist.length==0 && controller.isMe? Color(0xFF344143):Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 12.sp, right: 12.sp), + child: Text( + controller.isMe? "完成" : "催更", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ),), ], )); } @@ -363,34 +367,44 @@ class _MyTabbedScreenState extends State gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, // 每行显示的项目数量 ), - itemCount: controller.state.imaglist.length+1, // 项目的总数量,包括固定图片和接口获取的项目 + itemCount:controller.isMe? controller.state.imaglist.length+1: controller.state.imaglist.length, // 项目的总数量,包括固定图片和接口获取的项目 itemBuilder: (BuildContext context, int index) { - if (index == 0) { - // 第一个项目,显示固定的图片 - return GestureDetector( - onTap: () { - controller.getImageFile(); + if(controller.isMe){ + if (index == 0) { + // 第一个项目,显示固定的图片 + return GestureDetector( + onTap: () { + controller.getImageFile(); - }, - child: Container( - margin: EdgeInsets.all(5.sp), - child: Image( - image: AssetImage(getMineImage("icon_img_add")), + }, + child: Container( + margin: EdgeInsets.all(5.sp), + child: Image( + image: AssetImage(getMineImage("icon_img_add")), + ), ), - ), - ); - } else { - // 后续项目,根据接口获取数据 - // 假设通过接口获取到的数据存储在一个名为 data 的列表中 - // var itemData = data[index - 1]; // 减去第一个固定图片的索引 + ); + } else { + return Container( + margin: EdgeInsets.all(5.sp), + child: Center( + child: _buildImageItem( + controller.state.imaglist[index-1], + controller,index-1)), + ); + } + }else{ return Container( margin: EdgeInsets.all(5.sp), child: Center( child: _buildImageItem( - controller.state.imaglist[index-1], - controller,index-1)), + controller.state.imaglist[index], + controller,index)), ); } + + + }, ); } @@ -497,8 +511,8 @@ class _MyTabbedScreenState extends State 'index': 0 }); }, - child: Image.network( - controller.userInfoBean != null + child: CachedNetworkImage( + imageUrl: controller.userInfoBean != null ? controller.userInfoBean!.avatar : "", width: 66.sp, @@ -512,19 +526,22 @@ class _MyTabbedScreenState extends State Widget _buildImageItem(String url, UserinfoLogic controller,int index) { return Stack( children: [ - ClipRRect( - borderRadius: BorderRadius.circular(0.0), - child: GestureDetector( - onTap: () { - // Get.toNamed(AppRoutes.Swiper,arguments:controller.state.imaglist); - - Get.toNamed(AppRoutes.Swiper, arguments: { - 'imaglist':controller.state.imaglist, - 'index':index - }); - }, - child: Image.network( - url, + Container( + width: double.infinity, // 设置容器宽度为屏幕宽度 + height: double.infinity, + child: ClipRRect( + borderRadius: BorderRadius.circular(0.0), + child: GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.Swiper, arguments: { + 'imaglist':controller.state.imaglist, + 'index':index + }); + }, + child: Image.network( + fit: BoxFit.cover, + url, + ), ), ), ), @@ -727,7 +744,9 @@ class _MyTabbedScreenState extends State GestureDetector( onTap: () { Navigator.pop(context); + controller.state.updataimaglist.remove(controller.state.updataimaglist[index]); controller.state.imaglist.removeAt(index); + controller.update(); }, diff --git a/circle_app/lib/common/config.dart b/circle_app/lib/common/config.dart index 90a71ba..3b165a3 100644 --- a/circle_app/lib/common/config.dart +++ b/circle_app/lib/common/config.dart @@ -7,4 +7,6 @@ class CONFIG{ static const CALL_OUT_IMAGE = 'call_out_image/'; static const USER_INFO_AVATAR = 'user_info_avatar/'; + + static const USER_ALBUM_IMAGE = 'user_album_image/'; } \ No newline at end of file diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index 4bc080c..9146f9a 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -55,5 +55,5 @@ class Api { //他人信息 - static const getUserInfoTA = 'user-service/user/1/home'; + static const getUserInfoTA = 'user-service/user/'; } \ No newline at end of file diff --git a/circle_app/lib/router/app_pages.dart b/circle_app/lib/router/app_pages.dart index 8fa3f36..5d5f599 100644 --- a/circle_app/lib/router/app_pages.dart +++ b/circle_app/lib/router/app_pages.dart @@ -104,7 +104,7 @@ class AppPages { ), GetPage( name: AppRoutes.UserInfoActivity, - page: () => UserinfoPage(), + page: () => FlutterSmartDialog(child: UserinfoPage()), binding: UserinfoBinding(), ), GetPage( diff --git a/circle_app/lib/util/qiniu.dart b/circle_app/lib/util/qiniu.dart index 29d4e73..c74f516 100644 --- a/circle_app/lib/util/qiniu.dart +++ b/circle_app/lib/util/qiniu.dart @@ -2,6 +2,8 @@ import 'dart:convert'; import 'dart:io'; import 'dart:math'; +import 'package:circle_app/util/util.dart'; +import 'package:flutter_luban/flutter_luban.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:image_picker/image_picker.dart'; import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart'; @@ -11,35 +13,9 @@ import '../common/config.dart'; typedef void MyCallback(String result); -void updataQiniu(XFile pickedFile,String path ,String quToken,MyCallback myCallback) { - SmartDialog.showLoading(); - var storage = Storage(); - DateTime now = DateTime.now(); - String yearMonth = DateFormat('yyyyMM').format(now); - String imgPath = path +yearMonth+"/"+generateRandomString(16)+ pickedFile.name; - PutController putController = PutController(); - putController.addStatusListener((StorageStatus status) { - if (status == StorageStatus.Success) { - var headUrl = CONFIG.IMAGE_HEAD + imgPath; - myCallback(headUrl); - SmartDialog.dismiss(); - } - print('状态变化: 当前任务状态:$status'); - }); - putController.addProgressListener((double status) { - - print('上传进度: $status'); - }); - - storage.putFile(File(pickedFile.path), quToken, - options: PutOptions(controller: putController, key: imgPath)); -} - - - -void upVideoQiniu(String filePath,String name,String path ,String quToken,MyCallback myCallback) { - SmartDialog.showLoading(); +//上传七牛云 +void updataQiniu(String filePath,String name,String path ,String quToken,MyCallback myCallback) { var storage = Storage(); DateTime now = DateTime.now(); String yearMonth = DateFormat('yyyyMM').format(now); @@ -49,7 +25,7 @@ void upVideoQiniu(String filePath,String name,String path ,String quToken,MyCall if (status == StorageStatus.Success) { var headUrl = CONFIG.IMAGE_HEAD + imgPath; myCallback(headUrl); - SmartDialog.dismiss(); + } print('状态变化: 当前任务状态:$status'); }); @@ -64,6 +40,27 @@ void upVideoQiniu(String filePath,String name,String path ,String quToken,MyCall } +//封装上传图片 +void upDataImage(String quToken ,XFile pickedFile,String updataRoute,MyCallback myCallback) async{ + + var path = await getApplicationSupportDirectoryPath(); + + CompressObject compressObject = CompressObject( + imageFile:File(pickedFile.path), //image + path:path, //compress to path + quality: 80,//first compress quality, default 80 + step: 9,//compress quality step, The bigger the fast, Smaller is more accurate, default 6 + mode: CompressMode.LARGE2SMALL,//default AUTO + ); + Luban.compressImage(compressObject).then((_path) { + updataQiniu(_path.toString(),pickedFile.name,updataRoute,quToken,(result){ + myCallback(result); + + }); + }); +} + + String generateRandomString(int length) { var random = Random.secure(); var values = List.generate(length, (index) => random.nextInt(256));