From e06515881765b41734e4f67727251d8b2947b209 Mon Sep 17 00:00:00 2001 From: YangYuhao Date: Wed, 28 Jun 2023 18:25:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=96=8A=E8=AF=9D=E7=9B=B8=E5=85=B3=20?= =?UTF-8?q?=E8=BF=98=E6=9C=89=E4=BA=9B=E7=BD=91=E7=BB=9C=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E7=9A=84head=E5=8F=82=E6=95=B0=20app=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/assets/images/base/icon_login.png | Bin 0 -> 14379 bytes circle_app/assets/images/mine/icon_play.png | Bin 0 -> 5241 bytes circle_app/lib/app/aboutapp/logic.dart | 27 ++ circle_app/lib/app/aboutapp/state.dart | 1 + circle_app/lib/app/aboutapp/view.dart | 14 +- circle_app/lib/app/call_out/logic.dart | 240 ++++++++++++--- circle_app/lib/app/call_out/state.dart | 11 +- circle_app/lib/app/call_out/view.dart | 273 +++++++++++++++--- circle_app/lib/app/circle/logic.dart | 16 +- circle_app/lib/app/circle/view.dart | 198 +++++++++++++ circle_app/lib/app/feedback/logic.dart | 3 +- .../app/login/complete_material/logic.dart | 8 +- circle_app/lib/app/setup/logic.dart | 31 ++ circle_app/lib/app/setup/view.dart | 177 ++++++------ circle_app/lib/app/splash/logic.dart | 5 +- circle_app/lib/app/util/device.dart | 1 + circle_app/lib/common/config.dart | 10 + circle_app/lib/network/api.dart | 4 + circle_app/lib/network/dio_manager.dart | 4 +- circle_app/lib/util/CacheUtil.dart | 104 +++++++ circle_app/lib/util/device.dart | 26 +- circle_app/pubspec.yaml | 10 +- 22 files changed, 978 insertions(+), 185 deletions(-) create mode 100644 circle_app/assets/images/base/icon_login.png create mode 100644 circle_app/assets/images/mine/icon_play.png create mode 100644 circle_app/lib/app/util/device.dart create mode 100644 circle_app/lib/common/config.dart create mode 100644 circle_app/lib/util/CacheUtil.dart diff --git a/circle_app/assets/images/base/icon_login.png b/circle_app/assets/images/base/icon_login.png new file mode 100644 index 0000000000000000000000000000000000000000..75d4218265ae5c05c14caf9dd925b2ae69a310bd GIT binary patch literal 14379 zcmV+`IMm09P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/circle_app/lib/app/aboutapp/logic.dart b/circle_app/lib/app/aboutapp/logic.dart index 4ab86d9..d13ff7c 100644 --- a/circle_app/lib/app/aboutapp/logic.dart +++ b/circle_app/lib/app/aboutapp/logic.dart @@ -1,7 +1,34 @@ import 'package:get/get.dart'; +import '../../util/device.dart'; import 'state.dart'; +import 'package:package_info_plus/package_info_plus.dart'; class AboutappLogic extends GetxController { final AboutappState state = AboutappState(); + String version = ""; + @override + void onInit() { + // TODO: implement onInit + super.onInit(); + getVersion(); + // getAppVersion(); + + } + getVersion() async { + final info = await PackageInfo.fromPlatform(); + version = info.version; + update(); + return version; + } + + + Future getAppVersion() async { + final info = await PackageInfo.fromPlatform(); + print(info.appName); + print(info.packageName); + print(info.version); + print(info.buildNumber); + + } } diff --git a/circle_app/lib/app/aboutapp/state.dart b/circle_app/lib/app/aboutapp/state.dart index ef106da..7bc6c49 100644 --- a/circle_app/lib/app/aboutapp/state.dart +++ b/circle_app/lib/app/aboutapp/state.dart @@ -2,4 +2,5 @@ class AboutappState { AboutappState() { ///Initialize variables } + } diff --git a/circle_app/lib/app/aboutapp/view.dart b/circle_app/lib/app/aboutapp/view.dart index 6e35036..967a118 100644 --- a/circle_app/lib/app/aboutapp/view.dart +++ b/circle_app/lib/app/aboutapp/view.dart @@ -41,12 +41,12 @@ class AboutappPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ - // Image.asset( - // getHomeImage("mine_circle"), // Replace with your image path - // width: double.infinity, - // height: double.infinity, - // fit: BoxFit.contain, - // ), + Image.asset( + getBaseImage("icon_login"), // Replace with your image path + width: 100.sp, + height: 100.sp, + fit: BoxFit.contain, + ), SizedBox(height: 20.sp), Text( '圈子', @@ -161,7 +161,7 @@ class AboutappPage extends StatelessWidget { ), ), Text( - '1.0.0', + logic.version, style: TextStyle( color: Color(0xFFB7BECC), fontSize: 12.sp, diff --git a/circle_app/lib/app/call_out/logic.dart b/circle_app/lib/app/call_out/logic.dart index c3ae4ef..52aa99d 100644 --- a/circle_app/lib/app/call_out/logic.dart +++ b/circle_app/lib/app/call_out/logic.dart @@ -1,4 +1,6 @@ +import 'dart:async'; import 'dart:io'; +import 'dart:typed_data'; import 'package:circle_app/util/util.dart'; import 'package:flutter/cupertino.dart'; @@ -6,6 +8,8 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart'; +import 'package:video_player/video_player.dart'; +import 'package:video_thumbnail/video_thumbnail.dart'; import '../../network/api.dart'; import '../../network/dio_manager.dart'; @@ -13,6 +17,7 @@ import '../../router/app_routers.dart'; import '../login/complete_material/logic.dart'; import '../select_circle/logic.dart'; import 'state.dart'; +import '../../common/config.dart'; class Call_outLogic extends GetxController { final Call_outState state = Call_outState(); @@ -23,10 +28,24 @@ class Call_outLogic extends GetxController { final ImagePicker _picker = ImagePicker(); var storage = Storage(); var quToken = ''; + VideoPlayerController? videoPlayerController; + List numbers = []; @override - void onInit() async{ + void onClose() { + super.onClose(); + videoPlayerController?.dispose(); + } + + @override + void dispose() { + videoPlayerController?.dispose(); + super.dispose(); + } + + @override + void onInit() async { super.onInit(); var data = await DioManager.instance.get(url: Api.getCircleList, params: {}); @@ -34,24 +53,66 @@ class Call_outLogic extends GetxController { data, (data) => ConfigBean.fromJson(data)); configBean = bean.data!; - - - var quniuData = await DioManager.instance.get(url: Api.getqiniuToken, params: {}); + var quniuData = + await DioManager.instance.get(url: Api.getqiniuToken, params: {}); var qiniuBean = BaseResponse.fromJson( quniuData, (quniuData) => QnTokenData.fromJson(quniuData)); quToken = qiniuBean.data!.token.toString(); - - } - List numbers = []; + + sendShout() async { + if (numbers.isEmpty) { + showToast("选择圈子"); + return; + } + if (textEditingController.text.isEmpty) { + showToast("请输入喊话内容"); + return; + } + if (state.imaglist.isEmpty || state.videolist.isEmpty) { + if (textEditingController.text.length < 50) { + showToast("内容不丰富"); + return; + } + } else { + if (!state.imaglist.isEmpty) { + if (textEditingController.text.length < 10) { + showToast("内容不丰富"); + return; + } + } + if (!state.videolist.isEmpty) { + if (textEditingController.text.length < 10) { + showToast("内容不丰富"); + return; + } + } + } + + List myBean = []; + if (!state.imaglist.isEmpty){ + state.imaglist.forEach((element) { + myBean.add(MyBean(type: 1, url: element).toJson()); + }); + } + if (!state.videolist.isEmpty){ + myBean.add(MyBean(type: 1, url: state.videolist[0]).toJson()); + } +print(myBean.toString()); + var data = await DioManager.instance.post(url: Api.SendShout, params: { + 'album': myBean, + 'content': textEditingController.text, + 'interest_id': numbers[0].id, + 'useQueen': isCheck, + }); + + //Navigator.pop(context, numbers); + } + startSelectCircleActivity() async { - var data = await Get.toNamed(AppRoutes.SelectCircleActivity, - arguments: { - "interestMap": - configBean.interestMap, - "isRodio": true - }); - if(null!=data){ + var data = await Get.toNamed(AppRoutes.SelectCircleActivity, + arguments: {"interestMap": configBean.interestMap, "isRodio": true}); + if (null != data) { numbers = data; circleName = numbers[0].name; @@ -59,30 +120,56 @@ class Call_outLogic extends GetxController { update(); } } + showImg() async { try { - if(state.imaglist.length==9){ - showToast("最多上传9张图片哦~"); + if (state.videolist.isNotEmpty) { + showToast("已添加图片,无法添加图片。"); return; } - final XFile? pickedFile = await _picker.pickImage(source: ImageSource.gallery,); - // setState(() { + if (state.imaglist.length == 6) { + showToast("最多上传6张图片哦~"); + return; + } + final XFile? pickedFile = await _picker.pickImage( + source: ImageSource.gallery, + ); _setImageFileListFromFile(pickedFile!); - // }); } catch (e) { print(e); - // setState(() { - // _pickImageError = e; - // }); } } + Future getFirstPic(url) async { + Uint8List? bytes = await VideoThumbnail.thumbnailData(video: url); + final Completer completer = Completer(); + if (bytes != null) { + int _imageDataSize = bytes.length; + print("image size: $_imageDataSize"); + + final _image = Image.memory(bytes); + _image.image + .resolve(ImageConfiguration()) + .addListener(ImageStreamListener((ImageInfo info, bool _) { + completer.complete(ThumbnailResult( + image: _image, + dataSize: _imageDataSize, + height: info.image.height, + width: info.image.width, + )); + })); + } + + return completer.future; + } + void _setImageFileListFromFile(XFile pickedFile) { SmartDialog.showLoading(); + String imgPath = CONFIG.CALL_OUT_IMAGE + pickedFile.name; PutController putController = PutController(); putController.addStatusListener((StorageStatus status) { if (status == StorageStatus.Success) { - var headUrl = "http://qiniuyun.ikuayou.com/" + pickedFile.name; + var headUrl = CONFIG.IMAGE_HEAD + imgPath; state.imaglist.add(headUrl); update(); @@ -91,28 +178,113 @@ class Call_outLogic extends GetxController { print('状态变化: 当前任务状态:$status'); }); storage.putFile(File(pickedFile.path), quToken, - options: PutOptions(controller: putController, key: pickedFile.name)); + options: PutOptions( + controller: putController, + key: imgPath)); } + showVideo() async { - if(state.imaglist.length!=0){ - showToast("不可以和图片一起上传哦~"); + if (state.imaglist.length != 0) { + showToast("已添加图片,无法添加视频。"); + return; + } + if (state.videolist.length == 6) { + showToast("最多上传6个视频哦~"); return; } try { final XFile? pickedFile = await _picker.pickVideo( source: ImageSource.gallery, ); - // setState(() { - _setImageFileListFromFile(pickedFile!); - // }); - } catch (e) { - // setState(() { - // _pickImageError = e; - // }); - } + print(pickedFile!.path.toString()); + videoPlayerController = VideoPlayerController.file( + File(pickedFile!.path), + videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true), + ); + await videoPlayerController?.initialize(); + final Duration videoDuration = videoPlayerController!.value.duration; + final double durationInSeconds = videoDuration.inSeconds.toDouble(); + print(durationInSeconds.toString()); + if (durationInSeconds >= 5 && durationInSeconds <= 30) { + videoPlayerController?.setLooping(true); + videoPlayerController?.addListener(() { + if (!videoPlayerController!.value.isPlaying) { + // Navigator.pop(context); + } + }); + + _setVideoFileListFromFile(pickedFile!); + }else{ + showToast("请上传5-30秒的视频"); + } + + } catch (e) {} } + void _setVideoFileListFromFile(XFile pickedFile) { + SmartDialog.showLoading(); + String videoPath = CONFIG.CALL_OUT_VIDEO + pickedFile.name; + PutController putController = PutController(); + putController.addStatusListener((StorageStatus status) async { + print('状态变化: 当前任务状态:$status'); + if (status == StorageStatus.Success) { + // var img = await getFirstPic(CONFIG.IMAGE_HEAD + pickedFile.name); + state.videolist.add(CONFIG.IMAGE_HEAD + videoPath); + //state.videoThumbnaillist =img; + print(CONFIG.IMAGE_HEAD + videoPath); + + + update(); + SmartDialog.dismiss(); + } + }); + storage.putFile(File(pickedFile.path), quToken, + options: PutOptions( + controller: putController, + key: CONFIG.CALL_OUT_VIDEO + pickedFile.name)); + } + + Future _loadCaptions(BuildContext context) async { + final String fileContents = await DefaultAssetBundle.of(context) + .loadString('assets/bumble_bee_captions.vtt'); + return WebVTTCaptionFile( + fileContents); // For vtt files, use WebVTTCaptionFile + } +} + +class MyBean { + int type; + String url; + + MyBean({required this.type, required this.url}); + + factory MyBean.fromJson(Map json) { + return MyBean( + type: json['type'], + url: json['url'], + ); + } + + Map toJson() { + return { + 'type': type, + 'url': url, + }; + } +} + +class ThumbnailResult { + final Image image; + final int dataSize; + final int height; + final int width; + + const ThumbnailResult( + {required this.image, + required this.dataSize, + required this.height, + required this.width}); } diff --git a/circle_app/lib/app/call_out/state.dart b/circle_app/lib/app/call_out/state.dart index 4db8ab8..91bd948 100644 --- a/circle_app/lib/app/call_out/state.dart +++ b/circle_app/lib/app/call_out/state.dart @@ -1,13 +1,10 @@ +import 'logic.dart'; + class Call_outState { Call_outState() { ///Initialize variables } - List imaglist = ["https://book.flutterchina.club/assets/img/logo.png", - "https://book.flutterchina.club/assets/img/logo.png", - "https://book.flutterchina.club/assets/img/logo.png", - "https://book.flutterchina.club/assets/img/logo.png", - "https://book.flutterchina.club/assets/img/logo.png", - "https://book.flutterchina.club/assets/img/logo.png",]; - + List imaglist = []; + List videolist = []; } diff --git a/circle_app/lib/app/call_out/view.dart b/circle_app/lib/app/call_out/view.dart index 3409575..d742299 100644 --- a/circle_app/lib/app/call_out/view.dart +++ b/circle_app/lib/app/call_out/view.dart @@ -3,6 +3,7 @@ import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:video_player/video_player.dart'; import '../../router/app_routers.dart'; import 'logic.dart'; @@ -36,7 +37,9 @@ class Call_outPage extends StatelessWidget { width: 54.sp, ), onPressed: () { - showToast('111'); + // + //showToast('111'); + logic.sendShout(); }, ), body: SafeArea( @@ -117,7 +120,8 @@ class Call_outPage extends StatelessWidget { maxLength: 200, decoration: InputDecoration( hintStyle: TextStyle( - color: Color.fromRGBO(255, 255, 255, 0.6), + color: Color.fromRGBO( + 255, 255, 255, 0.6), fontSize: 14.sp), hintText: '请输入...(左下角上传图片或视频哦)', border: InputBorder.none, @@ -128,16 +132,19 @@ class Call_outPage extends StatelessWidget { ), Positioned( right: 15.sp, - top: 190.sp, + top: 190.sp, child: Text( '${controller.textEditingController.text.length}/200', style: TextStyle( color: Colors.white, fontSize: 12.sp), )), + Container( + margin: EdgeInsets.only(top: 220.sp), + child: _imageAdapter(controller)), + Container( + margin: EdgeInsets.only(top: 220.sp,left: 15.sp,right: 15.sp), - Container( - margin: EdgeInsets.only(top: 220.sp), - child: _imageAdapter(controller)) + child:_showVideo(controller) ,) ], ), @@ -216,8 +223,56 @@ class Call_outPage extends StatelessWidget { )), ); }); - } + + Widget _showVideo(Call_outLogic controller) { + 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, + ), + )) + + // ClosedCaption(text: controller.videoPlayerController!.value.caption.text), + // _ControlsOverlay(controller: controller.videoPlayerController), + // VideoProgressIndicator(controller.videoPlayerController!, allowScrubbing: true), + ], + ), + ), + ), + ); + } + } + Widget _imageAdapter(Call_outLogic controller) { return GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( @@ -225,18 +280,17 @@ class Call_outPage extends StatelessWidget { ), itemCount: controller.state.imaglist.length, // 项目的总数量,包括固定图片和接口获取的项目 itemBuilder: (BuildContext context, int index) { - return Container( - margin: EdgeInsets.all(5.sp), - child: Center( - child: _buildImageItem( - controller.state.imaglist[index], - controller,index)), - ); - + return Container( + margin: EdgeInsets.all(5.sp), + child: Center( + child: _buildImageItem( + controller.state.imaglist[index], controller, index)), + ); }, ); } - Widget _buildImageItem(String url, Call_outLogic controller,int index) { + + Widget _buildImageItem(String url, Call_outLogic controller, int index) { return Stack( children: [ ClipRRect( @@ -249,8 +303,8 @@ class Call_outPage extends StatelessWidget { child: GestureDetector( onTap: () { Get.toNamed(AppRoutes.Swiper, arguments: { - 'imaglist':controller.state.imaglist, - 'index':index + 'imaglist': controller.state.imaglist, + 'index': index }); }, child: Image.network( @@ -259,28 +313,170 @@ class Call_outPage extends StatelessWidget { ), ), ), - ) - , + ), ), - Positioned( - top: 0, - right: 0, - child: GestureDetector( - onTap: () { - // showToast("删除"); - _showDelImgDialog(Get.context!,controller,index); - - }, - child: Image( - image: AssetImage(getMineImage("icon_img_del")), - width: 20.sp, - height: 20.sp, - ), - )) + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () { + // showToast("删除"); + _showDelImgDialog(Get.context!, controller, index); + }, + child: Image( + image: AssetImage(getMineImage("icon_img_del")), + width: 20.sp, + height: 20.sp, + ), + )) ], ); } - void _showDelImgDialog(BuildContext context,Call_outLogic controller,int index) { + + void _showDelImgDialog( + BuildContext context, Call_outLogic controller, int index) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 160.sp, + padding: EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: LinearGradient( + colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.all(1.sp), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: LinearGradient( + colors: [Color(0xFF4C3E5F), Color(0xFF324140)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 24.sp), + child: Column( + children: [ + Center( + child: Text( + "提示", + style: + TextStyle(color: Colors.white, fontSize: 16.sp), + ), + ), + Container( + margin: EdgeInsets.only( + top: 12.sp, left: 14.sp, right: 14.sp), + alignment: Alignment.center, + child: Text( + "是否确认删除该照片。", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xCCF7FAFA), fontSize: 16.sp), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Container( + margin: EdgeInsets.only(top: 30.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: LinearGradient( + colors: [ + Color(0x26FFFFFF), + Color(0x26FFFFFF), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 10.sp, + bottom: 10.sp, + left: 52.sp, + right: 52.sp), + child: Text( + "否", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ), + SizedBox(width: 24.sp), + GestureDetector( + onTap: () { + Navigator.pop(context); + controller.state.imaglist.removeAt(index); + controller.update(); + }, + child: Container( + margin: EdgeInsets.only(top: 24.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 10.sp, + bottom: 10.sp, + left: 52.sp, + right: 52.sp), + child: Text( + "是", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ) + ], + ) + ], + ), + ) + ], + ), + ), + ); + }, + ); + } + + + + + void _showDelVideoDialog( + BuildContext context, Call_outLogic controller) { showDialog( context: context, builder: (BuildContext context) { @@ -330,7 +526,7 @@ class Call_outPage extends StatelessWidget { top: 12.sp, left: 14.sp, right: 14.sp), alignment: Alignment.center, child: Text( - "是否确认删除该形象照。", + "是否确认删除该视频。", textAlign: TextAlign.center, style: TextStyle( color: Color(0xCCF7FAFA), fontSize: 16.sp), @@ -375,9 +571,8 @@ class Call_outPage extends StatelessWidget { GestureDetector( onTap: () { Navigator.pop(context); - controller.state.imaglist.removeAt(index); + controller.videoPlayerController=null; controller.update(); - }, child: Container( margin: EdgeInsets.only(top: 24.sp), diff --git a/circle_app/lib/app/circle/logic.dart b/circle_app/lib/app/circle/logic.dart index 8011a75..01496dd 100644 --- a/circle_app/lib/app/circle/logic.dart +++ b/circle_app/lib/app/circle/logic.dart @@ -7,7 +7,8 @@ import '../../network/dio_manager.dart'; import 'state.dart'; class CircleLogic extends GetxController { - PageController pageController = PageController(initialPage: 1, viewportFraction: 0.8); + PageController pageController = + PageController(initialPage: 1, viewportFraction: 0.8); InterestsBean circle = InterestsBean(lists: []); final CircleState state = CircleState(); int page = 1; @@ -33,19 +34,24 @@ class CircleLogic extends GetxController { update(); } - - outCircle(String interest_id,bool isStatus) async{ - var data = await DioManager.instance.post(url: Api.outCrrcle+interest_id+"/join", params: {"status": isStatus?"0":"1"}); + outCircle(String interest_id, bool isStatus) async { + var data = await DioManager.instance.post( + url: Api.outCrrcle + interest_id + "/join", + params: {"status": isStatus ? "0" : "1"}); var bean = BaseResponse.fromJson(data, (data) => data); if (bean.code == 200) { circle.lists.forEach((element) { - if(element.id.toString()==interest_id.toString()){ + if (element.id.toString() == interest_id.toString()) { element.isJoin = !isStatus; } }); } showToast(bean.msg); } + + getCircleIndexId() { + return circle.lists[state.index].id; + } } class InterestsBean { diff --git a/circle_app/lib/app/circle/view.dart b/circle_app/lib/app/circle/view.dart index df18421..fa797e9 100644 --- a/circle_app/lib/app/circle/view.dart +++ b/circle_app/lib/app/circle/view.dart @@ -284,4 +284,202 @@ class _CirclePageState extends State ); } + void _showTextContentDialog(BuildContext context, String msg) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 300.sp, + padding: EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: LinearGradient( + colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.all(1.sp), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: LinearGradient( + colors: [Color(0xFF4C3E5F), Color(0xFF324140)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 24.sp), + child: Column( + children: [ + Container( + margin: EdgeInsets.only( + top: 12.sp, left: 14.sp, right: 14.sp), + alignment: Alignment.center, + child: Text( + msg, + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xCCF7FAFA), fontSize: 16.sp), + ), + ), + ], + ), + ) + ], + ), + ), + ); + }, + ); + } + + void _showOutCircleDialog( + BuildContext context, CircleLogic controller, Circle bean) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 160.sp, + padding: EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: LinearGradient( + colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.all(1.sp), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: LinearGradient( + colors: [Color(0xFF4C3E5F), Color(0xFF324140)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + Container( + margin: EdgeInsets.only(top: 24.sp), + child: Column( + children: [ + Center( + child: Text( + "提示", + style: + TextStyle(color: Colors.white, fontSize: 16.sp), + ), + ), + Container( + margin: EdgeInsets.only( + top: 12.sp, left: 14.sp, right: 14.sp), + alignment: Alignment.center, + child: Text( + "是否确认退出该圈子。", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0xCCF7FAFA), fontSize: 16.sp), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Container( + margin: EdgeInsets.only(top: 30.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: LinearGradient( + colors: [ + Color(0x26FFFFFF), + Color(0x26FFFFFF), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 10.sp, + bottom: 10.sp, + left: 52.sp, + right: 52.sp), + child: Text( + "否", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ), + SizedBox(width: 24.sp), + GestureDetector( + onTap: () { + Navigator.pop(context); + logic.outCircle(bean.id.toString(), bean.isJoin); + }, + child: Container( + margin: EdgeInsets.only(top: 24.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 10.sp, + bottom: 10.sp, + left: 52.sp, + right: 52.sp), + child: Text( + "是", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ) + ], + ) + ], + ), + ) + ], + ), + ), + ); + }, + ); + } + } diff --git a/circle_app/lib/app/feedback/logic.dart b/circle_app/lib/app/feedback/logic.dart index fecdada..16869ec 100644 --- a/circle_app/lib/app/feedback/logic.dart +++ b/circle_app/lib/app/feedback/logic.dart @@ -33,6 +33,7 @@ class FeedbackLogic extends GetxController { putController.addStatusListener((StorageStatus status) { print('状态变化: 当前任务状态:$status'); }); - storage.putFile(File(pickedFile.path), "",options: PutOptions(controller: putController)); + // storage.putFile(File(pickedFile.path), quToken, + // options: PutOptions(controller: putController, key: CONFIG.USER_INFO_HEAD+pickedFile.name)); } } diff --git a/circle_app/lib/app/login/complete_material/logic.dart b/circle_app/lib/app/login/complete_material/logic.dart index 5f8758b..2bd9396 100644 --- a/circle_app/lib/app/login/complete_material/logic.dart +++ b/circle_app/lib/app/login/complete_material/logic.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:math'; import 'package:circle_app/network/dio_manager.dart'; import 'package:circle_app/router/app_routers.dart'; @@ -9,6 +10,7 @@ import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart'; +import '../../../common/config.dart'; import '../../../network/api.dart'; import '../../../util/device.dart'; import '../../select_circle/logic.dart'; @@ -79,7 +81,7 @@ class Complete_materialLogic extends GetxController { PutController putController = PutController(); putController.addStatusListener((StorageStatus status) { if (status == StorageStatus.Success) { - headUrl = "http://qiniuyun.ikuayou.com/" + pickedFile.name; + headUrl = CONFIG.IMAGE_HEAD + pickedFile.name; print(headUrl); update(); SmartDialog.dismiss(); @@ -87,7 +89,7 @@ class Complete_materialLogic extends GetxController { print('状态变化: 当前任务状态:$status'); }); storage.putFile(File(pickedFile.path), quToken, - options: PutOptions(controller: putController, key: pickedFile.name)); + options: PutOptions(controller: putController, key: CONFIG.USER_INFO_AVATAR+pickedFile.name)); } checkInfo() async { @@ -143,6 +145,8 @@ class Complete_materialLogic extends GetxController { var bean = BaseResponse.fromJson(data, (data) => data); if (bean.code == 200) { Get.offAllNamed(AppRoutes.Home); + }else{ + showToast(bean.msg); } } diff --git a/circle_app/lib/app/setup/logic.dart b/circle_app/lib/app/setup/logic.dart index b64326f..3f1a595 100644 --- a/circle_app/lib/app/setup/logic.dart +++ b/circle_app/lib/app/setup/logic.dart @@ -1,7 +1,38 @@ import 'package:get/get.dart'; +import '../../util/CacheUtil.dart'; import 'state.dart'; class SetupLogic extends GetxController { final SetupState state = SetupState(); + + String cache = ""; + + @override + void onInit() async { + super.onInit(); + + // + } + + @override + void onReady() async { + // TODO: implement onReady + super.onReady(); + getCache(); + } + + getCache() async { + cache = await CacheUtil.loadCache(); + print(cache); + update(); + } + + startCaching() async { + CacheUtil.clearCache((result) { + cache = result; + update(); + }); + + } } diff --git a/circle_app/lib/app/setup/view.dart b/circle_app/lib/app/setup/view.dart index 4b8e3b6..e3236a5 100644 --- a/circle_app/lib/app/setup/view.dart +++ b/circle_app/lib/app/setup/view.dart @@ -1,4 +1,3 @@ - import 'package:circle_app/components/my_app_bar.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; @@ -14,95 +13,103 @@ import 'logic.dart'; class SetupPage extends StatelessWidget { SetupPage({Key? key}) : super(key: key); - final logic = Get.find(); - final state = Get.find().state; @override Widget build(BuildContext context) { - // _getFormat(context); - return Container( - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage(getBaseImage("home_back")), - fit: BoxFit.cover, + // _getFormat(context); + return GetBuilder(builder: (logic) { + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), ), - ), - child: Scaffold( - backgroundColor: Colors.transparent, - appBar: MyAppBar(centerTitle: '设置',), - body: SafeArea( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: MyAppBar(centerTitle: '设置',), + body: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - // GestureDetector( - // onTap: () { - // - // }, - // child: Image.asset( - // getNavigatorImage("back"), // 将 @mipmap/icon_back 替换为相应的图像路径 - // width: 24, // 将 @dimen/dp_24 替换为相应的值 - // height: 24, // 将 @dimen/dp_24 替换为相应的值 - // ), - // ), - // Spacer(), - // Text( - // '设置', - // style: TextStyle( - // color: Color(0xFFF7FAFA), // 将 #fff7fafa 替换为相应的颜色值 - // fontSize: 18.sp, // 将 18sp 替换为相应的值 - // ), - // ), - // Spacer(), + Row( + children: [ + // GestureDetector( + // onTap: () { + // + // }, + // child: Image.asset( + // getNavigatorImage("back"), // 将 @mipmap/icon_back 替换为相应的图像路径 + // width: 24, // 将 @dimen/dp_24 替换为相应的值 + // height: 24, // 将 @dimen/dp_24 替换为相应的值 + // ), + // ), + // Spacer(), + // Text( + // '设置', + // style: TextStyle( + // color: Color(0xFFF7FAFA), // 将 #fff7fafa 替换为相应的颜色值 + // fontSize: 18.sp, // 将 18sp 替换为相应的值 + // ), + // ), + // Spacer(), + ], + ), + SizedBox(height: 16.sp), // 将 @dimen/dp_16 替换为相应的值 + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Get.toNamed(AppRoutes.AccountActivity); + // controller.state.hearUrl + + }, + child: _buildItemRow('账号中心', getHomeImage("icon_in")), + ), + + SizedBox(height: 16.sp), + // _buildItemRow('隐私设置', getHomeImage("icon_in")), + // SizedBox(height: 16.sp), + // _buildItemRow('聊天设置', getHomeImage("icon_in")), + // SizedBox(height: 16.sp), + + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Get.toNamed(AppRoutes.BlackActivity); + }, + child: _buildItemRow('黑名单', getHomeImage("icon_in")), + ), + SizedBox(height: 16.sp), + // _buildItemRow('系统权限管理', getHomeImage("icon_in")), + // SizedBox(height: 16.sp), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + logic.startCaching(); + }, + child: _buildCacheItemRow('清除缓存', getHomeImage("icon_in"), context, logic), + ), + + SizedBox(height: 16.sp), + + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Get.toNamed(AppRoutes.AboutAppActivity); + }, + child: _buildItemRow('关于圈子', getHomeImage("icon_in")), + ), ], ), - SizedBox(height: 16.sp), // 将 @dimen/dp_16 替换为相应的值 - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - Get.toNamed(AppRoutes.AccountActivity); - // controller.state.hearUrl - - }, - child: _buildItemRow('账号中心', getHomeImage("icon_in")), - ), - - SizedBox(height: 16.sp), - // _buildItemRow('隐私设置', getHomeImage("icon_in")), - // SizedBox(height: 16.sp), - // _buildItemRow('聊天设置', getHomeImage("icon_in")), - // SizedBox(height: 16.sp), - - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - Get.toNamed(AppRoutes.BlackActivity); - }, - child: _buildItemRow('黑名单', getHomeImage("icon_in")), - ), - SizedBox(height: 16.sp), - // _buildItemRow('系统权限管理', getHomeImage("icon_in")), - // SizedBox(height: 16.sp), - _buildCacheItemRow('清除缓存', getHomeImage("icon_in"),context), - SizedBox(height: 16.sp), - - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - Get.toNamed(AppRoutes.AboutAppActivity); - }, - child: _buildItemRow('关于圈子', getHomeImage("icon_in")), - ), - ], - ), - ),), - ); + ),), + ); + }); } Widget _buildItemRow(String text, String imagePath) { return Container( - padding: EdgeInsets.symmetric(horizontal: 16.sp), // 将 @dimen/dp_16 替换为相应的值 + padding: EdgeInsets.symmetric(horizontal: 16.sp), + // 将 @dimen/dp_16 替换为相应的值 child: Row( children: [ Text( @@ -123,9 +130,11 @@ class SetupPage extends StatelessWidget { ); } - Widget _buildCacheItemRow(String text, String imagePath,BuildContext context) { + Widget _buildCacheItemRow(String text, String imagePath, BuildContext context, + SetupLogic logic) { return Container( - padding: EdgeInsets.symmetric(horizontal: 16.sp), // 将 @dimen/dp_16 替换为相应的值 + padding: EdgeInsets.symmetric(horizontal: 16.sp), + // 将 @dimen/dp_16 替换为相应的值 child: Row( children: [ Text( @@ -136,9 +145,9 @@ class SetupPage extends StatelessWidget { ), ), Spacer(), - // _getFormat(context), + // _getFormat(context), Text( - 'XXX', // 将 'XXX' 替换为相应的缓存大小值 + logic.cache, // 将 'XXX' 替换为相应的缓存大小值 style: TextStyle( color: Color(0xFFB7BECC), // 将 #ffb7becc 替换为相应的颜色值 fontSize: 14.sp, // 将 14sp 替换为相应的值 @@ -156,6 +165,4 @@ class SetupPage extends StatelessWidget { } - - } \ No newline at end of file diff --git a/circle_app/lib/app/splash/logic.dart b/circle_app/lib/app/splash/logic.dart index 8203839..c17d69c 100644 --- a/circle_app/lib/app/splash/logic.dart +++ b/circle_app/lib/app/splash/logic.dart @@ -34,7 +34,10 @@ class SplashLogic extends GetxController { return; } showToast(bean.msg.toString()); - + if(bean.code == 500){ + await Future.delayed(Duration(seconds: 5)); + onInit(); + } diff --git a/circle_app/lib/app/util/device.dart b/circle_app/lib/app/util/device.dart new file mode 100644 index 0000000..b9f78bb --- /dev/null +++ b/circle_app/lib/app/util/device.dart @@ -0,0 +1 @@ +// TODO Implement this library. \ No newline at end of file diff --git a/circle_app/lib/common/config.dart b/circle_app/lib/common/config.dart new file mode 100644 index 0000000..90a71ba --- /dev/null +++ b/circle_app/lib/common/config.dart @@ -0,0 +1,10 @@ +class CONFIG{ + static const IMAGE_HEAD = 'http://qiniuyun.ikuayou.com/'; + + + static const CALL_OUT_VIDEO = 'call_out_video/'; + + static const CALL_OUT_IMAGE = 'call_out_image/'; + + static const USER_INFO_AVATAR = 'user_info_avatar/'; +} \ No newline at end of file diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index da857b9..d5e068c 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -37,4 +37,8 @@ class Api { //入圈出圈 static const outCrrcle = 'up-service/interest/'; + + + //发布喊话 + static const SendShout = 'up-service/callout'; } \ No newline at end of file diff --git a/circle_app/lib/network/dio_manager.dart b/circle_app/lib/network/dio_manager.dart index fbab001..3e16868 100644 --- a/circle_app/lib/network/dio_manager.dart +++ b/circle_app/lib/network/dio_manager.dart @@ -130,7 +130,9 @@ class DioManager { Options options = Options( method: methodValues[method], headers: { "Authorization": await getAuthorization(), - 'version': await getDeviceId(), + 'versionName': await getVersionName(), + 'versionCode': await getVersionCode(), + 'osVersion': await getDeviceId(), 'platform': Platform.isIOS ? '1' : '0', 'imei': await getImei(), 'brand': await getBrand(), diff --git a/circle_app/lib/util/CacheUtil.dart b/circle_app/lib/util/CacheUtil.dart new file mode 100644 index 0000000..69ad037 --- /dev/null +++ b/circle_app/lib/util/CacheUtil.dart @@ -0,0 +1,104 @@ +import 'dart:io'; +import 'package:circle_app/util/util.dart'; +import 'package:get/get.dart'; +import 'package:path_provider/path_provider.dart'; + +class CacheUtil { + static dynamic loadCache() async { + try { + final _tempDir = await getTemporaryDirectory(); + double value = await _getTotalSizeOfFilesInDir(_tempDir); + /*tempDir.list(followLinks: false,recursive: true).listen((file){ + //打印每个缓存文件的路径 + print(file.path); + });*/ + print('临时目录大小: ' + value.toString()); + return _renderSize(value); + } catch (err) { + print(err); + } + } + + ///递归方式删除目录 + static Future delDir(FileSystemEntity file) async { + try { + if (file is Directory) { + final List children = file.listSync(); + for (final FileSystemEntity child in children) { + await delDir(child); + } + } + await file.delete(); + } catch (e) { + print(e); + } + } + + static Future _getTotalSizeOfFilesInDir( + final FileSystemEntity file) async { + try { + if (file is File) { + int length = await file.length(); + return double.parse(length.toString()); + } + if (file is Directory) { + final List children = file.listSync(); + double total = 0; + if (children != null) + for (final FileSystemEntity child in children) + total += await _getTotalSizeOfFilesInDir(child); + return total; + } + return 0; + } catch (e) { + print(e); + return 0; + } + } + + ///格式化文件大小 + static _renderSize(double value) { + List unitArr = [] + ..add('B') + ..add('K') + ..add('M') + ..add('G'); + int index = 0; + while (value > 1024) { + index++; + value = value / 1024; + } + String size = value.toStringAsFixed(2); + return size + unitArr[index]; + } + + static clearCache(MyCallback callback) async { + //此处展示加载loading + try { + final _tempDir = await getTemporaryDirectory(); + double value = await _getTotalSizeOfFilesInDir(_tempDir); + print("$value"); + if (value.toInt() <= 0) { + showToast("暂无缓存"); + + // Get.back(); + } else if (value >= 0) { + // Get.back(); + showToast("正在清理中···"); + Future.delayed(Duration(seconds: 2), () async { + //删除缓存目录 + await delDir(_tempDir); + await loadCache(); + showToast("清理缓存成功"); + callback("0KB"); + }); + return "正在清理中···"; + } + } catch (e) { + print(e); + showToast("清除缓存失败"); + + } + } +} +typedef void MyCallback(String result); \ No newline at end of file diff --git a/circle_app/lib/util/device.dart b/circle_app/lib/util/device.dart index 43bba95..f596ed7 100644 --- a/circle_app/lib/util/device.dart +++ b/circle_app/lib/util/device.dart @@ -3,7 +3,8 @@ import 'dart:io'; import 'package:device_info/device_info.dart'; import 'package:geolocator/geolocator.dart'; import 'package:shared_preferences/shared_preferences.dart'; - +import 'package:package_info_plus/package_info_plus.dart'; +//手机系统版本 Future getDeviceId() async { String deviceId = ""; final DeviceInfoPlugin deviceInfoPlugin = new DeviceInfoPlugin(); @@ -23,6 +24,27 @@ Future getDeviceId() async { return deviceId; } + +Future getVersion() async { + String version = ""; + final info = await PackageInfo.fromPlatform(); + version = info.version; + return version; +} + +Future getVersionName() async { + String versionName = ""; + final info = await PackageInfo.fromPlatform(); + versionName = info.version; + return versionName; +} +Future getVersionCode() async { + String versionCode = ""; + final info = await PackageInfo.fromPlatform(); + versionCode = info.buildNumber; + return versionCode; +} +//imei Future getImei() async { String imei = ""; DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); @@ -37,7 +59,7 @@ Future getImei() async { } return imei; } - +//手机型号 Future getBrand() async { String brand = ''; DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index cd1a222..9fc502f 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -68,8 +68,16 @@ dependencies: permission_handler: ^10.3.0 #loading flutter_smart_dialog: 4.9.2 - #获取位置信息 + #获取位置信息 geolocator: ^9.0.2 + #获取视频第一帧 + video_thumbnail: ^0.5.3 + #获取应用程序信息 + package_info_plus: ^1.4.3+1 + #视频播放器 + video_player: ^2.6.1 + + dev_dependencies: flutter_test: