修改图片压缩第三方,增加更新提示红点,评价有奖功能

This commit is contained in:
CYH 2023-11-22 12:08:39 +08:00
parent b19a9357a0
commit 2eb774988e
35 changed files with 1167 additions and 177 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -1,5 +1,3 @@
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -8,15 +6,11 @@ import 'package:get/get.dart';
import '../../components/my_app_bar.dart';
import 'logic.dart';
class AboutappPage extends StatelessWidget {
AboutappPage({Key? key}) : super(key: key);
final logic = Get.find<AboutappLogic>();
final state = Get
.find<AboutappLogic>()
.state;
final state = Get.find<AboutappLogic>().state;
@override
Widget build(BuildContext context) {
@ -30,7 +24,9 @@ class AboutappPage extends StatelessWidget {
),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: const MyAppBar(centerTitle: '关于微乐园',),
appBar: const MyAppBar(
centerTitle: '关于微乐园',
),
body: Scaffold(
backgroundColor: Colors.transparent,
// Replace with your desired color
@ -39,18 +35,19 @@ class AboutappPage extends StatelessWidget {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(onTap: (){
// showToast("13");
},
child:Image.asset(
getBaseImage("ic_launcher"), // Replace with your image path
width: 100.sp,
height: 100.sp,
fit: BoxFit.contain,
) ,)
,
GestureDetector(
onTap: () {
// showToast("13");
},
child: Image.asset(
getBaseImage(
"ic_launcher"), // Replace with your image path
width: 100.sp,
height: 100.sp,
fit: BoxFit.contain,
),
),
SizedBox(height: 20.sp),
Text(
logic.currentVersion,
@ -105,57 +102,58 @@ class AboutappPage extends StatelessWidget {
SizedBox(height: 20.sp),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){
onTap: () {
navigateToUserAgreement();
},
child: Row(
children: [
Text(
'用户协议',
style: TextStyle(
color: const Color(0xFFF7FAFA),
fontSize: 16.sp,
},
child: Row(
children: [
Text(
'用户协议',
style: TextStyle(
color: const Color(0xFFF7FAFA),
fontSize: 16.sp,
),
),
),
const Spacer(),
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
height: 24.sp,
fit: BoxFit.fill,
),
],
),),
const Spacer(),
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
height: 24.sp,
fit: BoxFit.fill,
),
],
),
),
SizedBox(height: 20.sp),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){
onTap: () {
navigateToPrivacyPolicy();
},
child: Row(
children: [
Text(
'隐私政策',
style: TextStyle(
color: const Color(0xFFF7FAFA),
fontSize: 16.sp,
},
child: Row(
children: [
Text(
'隐私政策',
style: TextStyle(
color: const Color(0xFFF7FAFA),
fontSize: 16.sp,
),
),
),
const Spacer(),
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
height: 24.sp,
fit: BoxFit.fill,
),
],
),)
,
const Spacer(),
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
height: 24.sp,
fit: BoxFit.fill,
),
],
),
),
SizedBox(height: 20.sp),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){
logic.getUpVersion();
onTap: () {
logic.getUpVersion();
},
child: Row(
children: [
@ -167,23 +165,23 @@ class AboutappPage extends StatelessWidget {
),
),
const Spacer(),
logic.isUpdate? Container(
width: 6.sp,
height: 5.sp,
margin: EdgeInsets.only(top: 1.sp, right: 8.sp),
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(3.sp),
),
):Container(),
logic.isUpdate
? Container(
width: 10.sp,
height: 10.sp,
margin: EdgeInsets.only(right: 4.sp),
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle),
)
: Container(),
Text(
"",
logic.isUpdate ? '有新版本啦' : "",
style: TextStyle(
color: const Color(0xFFB7BECC),
fontSize: 12.sp,
fontSize: 14.sp,
),
),
SizedBox(width: 8.sp),
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
@ -194,13 +192,13 @@ class AboutappPage extends StatelessWidget {
),
),
],
),)
),),
),
)),
),
);
});
}
// String url = 'https://www.baidu.com'; // Replace with your desired URL
//
// void _openBrowser() async {
@ -210,5 +208,4 @@ class AboutappPage extends StatelessWidget {
// throw 'Could not launch $url';
// }
// }
}

View File

@ -349,8 +349,8 @@ class Call_outLogic extends GetxController {
}
});
uploadQiniu(
pickedFile.path, pickedFile.name, CONFIG.CALL_OUT_VIDEO, quToken,
uploadQiniuVideo(
File(pickedFile.path), pickedFile.name, CONFIG.CALL_OUT_VIDEO, quToken,
(result) {
SmartDialog.dismiss();
state.videolist.add(result);

View File

@ -118,7 +118,7 @@ class _Call_outPageState extends State<Call_outPage> {
child: Stack(
children: [
SizedBox(
height: 200.sp,
height: 100.sp,
child: TextField(
controller:
controller.textEditingController,
@ -130,7 +130,7 @@ class _Call_outPageState extends State<Call_outPage> {
setState(() {});
},
style: TextStyle(
color: Colors.white, fontSize: 14.0.sp),
color: Colors.white, fontSize: 17.0.sp),
maxLines: 32,
maxLength: 200,
decoration: InputDecoration(
@ -147,18 +147,18 @@ class _Call_outPageState extends State<Call_outPage> {
),
Positioned(
right: 15.sp,
top: 190.sp,
top: 100.sp,
child: Text(
'${controller.textEditingController.text.length}/200',
style: TextStyle(
color: Colors.white, fontSize: 12.sp),
)),
Container(
margin: EdgeInsets.only(top: 220.sp),
margin: EdgeInsets.only(top: 130.sp),
child: _imageAdapter(controller)),
Container(
margin: EdgeInsets.only(
top: 220.sp, left: 15.sp, right: 15.sp),
top: 130.sp, left: 15.sp, right: 15.sp),
child: _showVideo(controller),
)
],
@ -347,8 +347,8 @@ class _Call_outPageState extends State<Call_outPage> {
: 240.sp,
height: controller.videoPlayerController!.value.size.width <
controller.videoPlayerController!.value.size.height
? 240.sp
: 135.sp,
? 135.sp / controller.videoPlayerController!.value.aspectRatio
: 240.sp / controller.videoPlayerController!.value.aspectRatio,
child: GestureDetector(
onTap: () {
if (controller.videoPlayerController!.value.isPlaying) {

View File

@ -174,7 +174,7 @@ class _ChatPageState extends State<ChatPage> {
var data = await Get.toNamed(AppRoutes.UserInfoActivity,arguments: con.userID.toString().split('_').last,preventDuplicates: false);
},
child: Text('TA的主页',style: TextStyle(color: const Color(0xFF00FFF4),fontSize:12.sp,fontWeight: FontWeight.w500),),
child: Text('查看主页',style: TextStyle(color: const Color(0xFF00FFF4),fontSize:12.sp,fontWeight: FontWeight.w500),),
),
onPressed: () {},
),

View File

@ -252,13 +252,26 @@ class InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClien
pushChatPage(data['data']['account_id'].toString().split("_").last,data['data']['account_id'], bean.user!.nickname!);
await Future.delayed(Duration(seconds: 1));
SharedPreferences sharedPreferences =await SharedPreferences.getInstance();
// SharedPreferencesHelper.getInstance().then((sharedPreferences) {
int userId = sharedPreferences.getInt(SharedPreferencesHelper.USERID)??0;
String avatar = sharedPreferences.getString(SharedPreferencesHelper.AVATAR)??"";
String name = sharedPreferences.getString(SharedPreferencesHelper.NAME)??"";
bean.chat!.users!.add(Users(avatar: avatar,id: userId,nickname: name));
widget.logic.update();
bool isContain = false;
for (var info in bean.chat!.users!) {
if (info.id == userId) {
isContain = true;
}
}
if (!isContain) {
bean.chat!.users!.add(Users(avatar: avatar,id: userId,nickname: name));
bean.chat!.count = bean.chat!.count! + 1;
widget.logic.update();
}
}
}

View File

@ -265,8 +265,22 @@ class _LikeViewState extends State<LikeView>
sharedPreferences.getString(SharedPreferencesHelper.AVATAR) ?? "";
String name =
sharedPreferences.getString(SharedPreferencesHelper.NAME) ?? "";
// bean.chat!.users!.add(Users(avatar: avatar,id: userId,nickname: name));
// widget.logic.update();
bool isContain = false;
for (var info in bean.chat!.users!) {
if (info.id == userId) {
isContain = true;
}
}
if (!isContain) {
bean.chat!.users!.add(Users(avatar: avatar,id: userId,nickname: name));
bean.chat!.count = bean.chat!.count + 1;
setState(() {
});
}
}
}

View File

@ -2,7 +2,7 @@ import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_install_app/flutter_install_app.dart';
// import 'package:flutter_install_app/flutter_install_app.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:url_launcher/url_launcher.dart';
@ -260,7 +260,7 @@ class _CustomDialogState extends State<UpdateDialog> {
// SmartDialog.dismiss();
print(error);
});
await AppInstaller.installApk(filePath, actionRequired: false);
// await AppInstaller.installApk(filePath, actionRequired: false);
}
}

View File

@ -0,0 +1,10 @@
import 'package:get/get.dart';
import 'logic.dart';
class ExternalshareBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => ExternalshareLogic());
}
}

View File

@ -0,0 +1,67 @@
import 'dart:convert';
import 'package:circle_app/app/login/login/logic.dart';
import 'package:circle_app/util/util.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 'state.dart';
class ExternalshareLogic extends GetxController {
final ExternalshareState state = ExternalshareState();
final ImagePicker _picker = ImagePicker();
var quToken = '';
@override
void onInit() async{
super.onInit();
var data =
await DioManager.instance.get(url: Api.getqiniuToken, params: {});
if(data['cpde'] == 200){
quToken = data['data']['token'];
}
}
updateExternalShare()async{
if(state.imaglist==0){
showOKToast("请上传图片");
return ;
}
String jsonString = jsonEncode(state.imaglist);
var data = await DioManager.instance.post(url:' Api.UPDATE_EXTERNAL_SHARE', params: {
'picUrl':jsonString
});
if(data["code"]==200){
Get.back();
}
showOKToast(data["msg"]);
}
Future getImageFile() async {
try {
final XFile? pickedFile = await _picker.pickImage(
source: ImageSource.gallery,
);
if(null==pickedFile){
return;
}
SmartDialog.showLoading();
uploadImage(quToken,pickedFile,CONFIG.USER_ALBUM_IMAGE,(result){
SmartDialog.dismiss(force: true);
state.imaglist.add(result);
update();
});
} catch (_) {
}
}
}

View File

@ -0,0 +1,6 @@
class ExternalshareState {
ExternalshareState() {
///Initialize variables
}
List<String> imaglist = [];
}

View File

@ -0,0 +1,257 @@
import 'package:circle_app/common/colors/app_color.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../components/my_app_bar.dart';
import '../../router/app_routers.dart';
import '../../util/util.dart';
import 'logic.dart';
class ExternalsharePage extends StatelessWidget {
ExternalsharePage({Key? key}) : super(key: key);
final logic = Get.find<ExternalshareLogic>();
final state = Get.find<ExternalshareLogic>().state;
@override
Widget build(BuildContext context) {
// _getFormat(context);
return GetBuilder<ExternalshareLogic>(builder: (logic) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getBaseImage("bg")),
fit: BoxFit.cover,
),
),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: const MyAppBar(
centerTitle: '站外分享',
),
body: Container(
height: Get.height,
child: Stack(
children: [
SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"温馨提示:站外分享除了能享受'邀请有奖'的各种奖励,还能获得下述的奖励哦~",
style: TextStyle(
color: Colors.white,
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 18),
Text(
"奖励说明",
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
),
),
SizedBox(height: 8.sp),
buildRichText(
"1. 站外平台粉丝达到1000人以上发新动态置顶一天可获得1000豆子"),
SizedBox(height: 8.sp),
buildRichText("2. 邀请海报发到微信朋友圈或QQ动态删除无效可获得100豆子"),
SizedBox(height: 8.sp),
buildRichText(
"3. 分享到圈内群聊QQ、微信、B站、快手、抖音、微博、推特或其他平台均有效群里有多少人点击就获得多少豆子。"),
SizedBox(height: 24.sp),
buildRichText("*上传分享截图"),
SizedBox(height: 8.sp),
buildRichText("截图时间跟发布时间需要间隔1小时以上才有效", fontSize: 14.sp),
SizedBox(height: 8.sp),
Container(
height: 380.sp,
// margin: EdgeInsets.only(left: 16.sp, right: 16.sp),
child: GridView.builder(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3, //
),
itemCount: logic.state.imaglist.length < 9
? logic.state.imaglist.length + 1
: logic.state.imaglist.length,
// Replace with your item count
itemBuilder: (context, index) {
if (index == 0 &&
logic.state.imaglist.length < 9) {
//
return GestureDetector(
onTap: () {
logic.getImageFile();
},
child: Container(
margin: EdgeInsets.all(5.sp),
child: Image(
image: AssetImage(
getMineImage("icon_img_add")),
),
),
);
} else {
//
// data
// var itemData = data[index - 1]; //
return Container(
// margin: EdgeInsets.all(5.sp),
child: Center(
child: _buildImageItem(
logic.state.imaglist.length < 9
? logic.state.imaglist[index - 1]
: logic.state.imaglist[index],
// Replace with your item count
logic,
logic.state.imaglist.length < 9
? index - 1
: index),
),
);
}
},
),
),
],
)),
),
Positioned(
bottom: 0,
left: 20.sp,
right: 20.sp,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
//TODO
// Expanded(
// child: Container(
// margin: EdgeInsets.only(bottom: 35),
// child: ElevatedButton(
// onPressed: () {
// // TODO:
// },
// style: ElevatedButton.styleFrom(
// primary: Color(0xFF21BEAB),
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(20), //
// ),
// ),
// child: Text(
// "获取邀请海报",
// style: TextStyle(
// color: Colors.white,
// fontSize: 12,
// ),
// ),
// ),
// ),
// ),
// SizedBox(width: 30.sp,),
Expanded(
child: Container(
margin: EdgeInsets.only(bottom: 35, left: 20, right: 20),
child: ElevatedButton(
onPressed: () {
logic.updateExternalShare();
},
style: ElevatedButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20), //
),
padding: EdgeInsets.zero, // Remove default button padding
elevation: 0, // Remove button shad
backgroundColor: Colors.transparent,
primary: null, // Remove background color
),
child: Ink(
decoration: BoxDecoration(
gradient:AppColor.mainVerLinearGradient,
borderRadius: BorderRadius.circular(20), //
),
child: Container(
padding: EdgeInsets.symmetric(horizontal: 50, vertical: 10),
child: Text(
"提交奖励申请",
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
),
),
),
),
),
),
),
],
),
),
],
),
),
),
);
});
}
Widget _buildImageItem(String url, ExternalshareLogic logic, int index) {
return Stack(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(0.0),
child: Container(
width: double.infinity, //
height: double.infinity, //
child: ClipRRect(
borderRadius: BorderRadius.circular(0.0),
child: GestureDetector(
onTap: () {
Get.toNamed(AppRoutes.Swiper, arguments: {
'imaglist': logic.state.imaglist,
'index': index
});
},
child: Image.network(
fit: BoxFit.cover,
url,
),
),
),
),
),
Positioned(
top: 0,
right: 0,
child: GestureDetector(
onTap: () {
logic.state.imaglist.removeAt(index);
logic.update();
},
child: Image(
image: AssetImage(getMineImage("icon_img_del")),
width: 20.sp,
height: 20.sp,
),
))
],
);
}
Widget buildRichText(String text, {double fontSize = 16}) {
return RichText(
text: TextSpan(
text: text,
style: TextStyle(color: Colors.white, fontSize: fontSize),
),
);
}
}

View File

@ -0,0 +1,10 @@
import 'package:get/get.dart';
import 'logic.dart';
class Good_reviewsBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => Good_reviewsLogic());
}
}

View File

@ -0,0 +1,79 @@
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
import 'package:circle_app/common/config.dart';
import 'package:circle_app/network/api.dart';
import 'package:circle_app/network/dio_manager.dart';
import 'package:circle_app/util/qiniu.dart';
import 'package:circle_app/util/util.dart';
class Good_reviewsLogic extends GetxController {
List imgUrl = [];
List<String> tipImgUrl = [];
final ImagePicker _picker = ImagePicker();
var quToken = '';
@override
void onInit() {
// TODO: implement onInit
super.onInit();
loadToken();
loadTipImgUrl();
}
Future getImageFile() async {
try {
final XFile? pickedFile = await _picker.pickImage(
source: ImageSource.gallery,
);
if (null == pickedFile) {
return;
}
SmartDialog.showLoading();
uploadImage(quToken, pickedFile, CONFIG.USER_INFO_AVATAR, (result) async {
imgUrl.add(result);
update();
SmartDialog.dismiss();
});
} catch (e) {}
}
void loadTipImgUrl() async {
// var result =
// await DioManager.instance.get(url: 'Api.queryPositiveFeesBackExample', params: {});
// if (result['code'] == 10000) {
// List list = result['list'];
// for (var element in list) {
// tipImgUrl.add(element);
// }
// update();
// }
}
void loadToken() async {
var qiniudata =
await DioManager.instance.get(url: Api.getqiniuToken, params: {});
if (qiniudata['code'] == 200) {
quToken = qiniudata['data']['token'].toString();
}
}
void sendGoodReview() async {
var albumList = [];
for (var url in imgUrl) {
Map info = {'type':1,'url':url};
albumList.add(info);
}
var result =
await DioManager.instance.post(url: Api.getFeedBack, params: {'type':2,'album':albumList});
if (result['code'] == 200) {
showOKToast('提交成功,等待审核');
Get.back();
print(result);
}
}
}

View File

@ -0,0 +1,163 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.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';
import 'logic.dart';
class Good_reviewsPage extends StatelessWidget {
Good_reviewsPage({Key? key}) : super(key: key);
final logic = Get.find<Good_reviewsLogic>();
@override
Widget build(BuildContext context) {
return GetBuilder<Good_reviewsLogic>(builder: (logic) {
List<Widget> widgets = [];
List<Widget> tipwidgets = [];
if (logic.imgUrl.isEmpty) {
widgets.add(GestureDetector(
onTap: () {
logic.getImageFile();
},
child: Image.asset(
getMineImage(
'icon_upload',
),
width: 100.sp,
),
));
} else {
for (var element in logic.imgUrl) {
widgets.add(Stack(
children: [
ClipRRect(
borderRadius: BorderRadius.circular(8.sp),
child: Image.network(
element,
width: 100.sp,
height: 100.sp,
fit: BoxFit.cover,
)),
Positioned(
top: 0,
right: 0,
child: GestureDetector(
onTap: () {
// showToast("删除");
logic.imgUrl.remove(element);
logic.update();
},
child: Image(
image: AssetImage(getMineImage("icon_img_del")),
width: 20.sp,
height: 20.sp,
),
))
],
));
widgets.add(SizedBox(width: 10.sp,));
}
if (logic.imgUrl.length < 3) {
widgets.add(GestureDetector(
onTap: () {
logic.getImageFile();
},
child: Image.asset(
getMineImage(
'icon_upload',
),
width: 100.sp,
),
));
}
}
for (var element in logic.tipImgUrl) {
tipwidgets.add(
GestureDetector(
onTap: () {
Get.toNamed(AppRoutes.Swiper,arguments: {
'imaglist': logic.tipImgUrl,
'index': logic.tipImgUrl.indexOf(element)
});
},
child: ClipRRect(
borderRadius: BorderRadius.circular(8.sp),
child: Image.network(
element,
width: 100.sp,
height: 100.sp,
fit: BoxFit.cover,
)),
),
);
tipwidgets.add(SizedBox(width: 10.sp,));
}
return Scaffold(
backgroundColor: Colors.black,
appBar: MyAppBar(
centerTitle: '反馈截图',
actionWdiget: GestureDetector(
onTap: () {
if (logic.imgUrl.isEmpty) {
showOKToast('请上传评价截图:(至少一张)');
} else {
logic.sendGoodReview();
}
},
child: Text(
'提交',
style: TextStyle(color: Colors.white, fontSize: 16.sp),
),
),
),
body: Padding(
padding: EdgeInsets.only(left: 15.sp, right: 15.sp, top: 15.sp),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'感谢您的支持请填写评价反馈我们将在您提交反馈之后的24小时之内核实并发放奖励。',
style: TextStyle(color: Color(0xFFF7FAFA), fontSize: 16.sp),
),
SizedBox(
height: 12.sp,
),
Text(
'请上传评价截图:(至少一张)',
style: TextStyle(color: Color(0xFFF7FAFA), fontSize: 16.sp),
),
Container(
margin: EdgeInsets.only(top: 10),
height: 100.sp,
child: Row(
children: widgets,
),
),
// SizedBox(
// height: 20.sp,
// ),
//
// Text(
// '示例:',
// style: TextStyle(color: Color(0xFFF7FAFA), fontSize: 14.sp),
// ),
// Container(
// margin: EdgeInsets.only(top: 10),
// height: 100.sp,
// child: Row(
// children: tipwidgets,
// ),
// )
],
),
),
);
});
}
}

View File

@ -1,6 +1,7 @@
import 'package:circle_app/app/circle/logic.dart';
import 'package:get/get.dart';
import '../minefragment/logic.dart';
import 'logic.dart';
class HomeBinding extends Bindings {
@ -8,5 +9,6 @@ class HomeBinding extends Bindings {
void dependencies() {
Get.lazyPut(() => HomeLogic());
Get.lazyPut(() => CircleLogic());
Get.lazyPut(() => MinefragmentLogic());
}
}

View File

@ -28,7 +28,7 @@ import '../minefragment/view.dart';
import '../msg/view.dart';
import 'state.dart';
class HomeLogic extends GetxController {
class HomeLogic extends GetxController with WidgetsBindingObserver {
late TabController tabController;
int currentIndex = 0;
@ -43,6 +43,11 @@ class HomeLogic extends GetxController {
final RxBool showcirlceUnred = false.obs;
late V2TimSimpleMsgListener msgListener;
InterestsBean mycircle = InterestsBean(lists: []);
StreamSubscription? sub;
bool isUpdateVersion = false;
@override
void onClose() {
@ -50,7 +55,8 @@ class HomeLogic extends GetxController {
super.onClose();
TencentImSDKPlugin.v2TIMManager
.v2TIMMessageManager.removeAdvancedMsgListener();
WidgetsBinding.instance.removeObserver(this);
sub!.cancel();
}
@override
@ -66,14 +72,21 @@ class HomeLogic extends GetxController {
tabs.add(MsgPage());
tabs.add(MinefragmentPage());
// EventBusManager.on<RefreshUnread>().listen((event) {
// getUnreadSize();
// });
sub = EventBusManager.on<RefreshUnread>().listen((event) {
getUnreadSize();
});
// getUnreadSize();
WidgetsBinding.instance.addObserver(this);
addMsgListener();
checkVersion();
loadMyCircleData();
}
void addMsgListener() {
msgListener = V2TimSimpleMsgListener(onRecvC2CTextMessage: (
msgID,
userInfo,
@ -151,11 +164,31 @@ class HomeLogic extends GetxController {
_messageService.addSimpleMsgListener(listener: msgListener);
checkVersion();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.inactive:
break;
case AppLifecycleState.resumed: //
break;
case AppLifecycleState.paused: //
addBadge();
break;
case AppLifecycleState.detached: // APP结束时调用
break;
}
}
Future<void> checkVersion() async {
var data = await DioManager.instance.get(url: Api.APP_VERSION);
@ -165,6 +198,7 @@ class HomeLogic extends GetxController {
showReportDialog(Get.context!, bean.data.constraint == 0, bean.data);
}
}
setLike(String userId) async {
var data = await DioManager.instance.post(
url: "${Api.setLike + userId}/follow",
@ -197,12 +231,12 @@ class HomeLogic extends GetxController {
unreadSIze.value = getTotalUnreadMessageCountRes.data.toString();
}
if (Platform.isAndroid) {
setOfflinePushStatus(status: AppStatus.foreground);
}
}
} catch (e) {}
}
}
@ -235,6 +269,12 @@ class HomeLogic extends GetxController {
}
addBadge() {
if (Platform.isAndroid) {
setOfflinePushStatus(status: AppStatus.foreground);
}
}
void showReportDialog(
BuildContext context, bool isDismiss, UpdateInfo updateInfo) {
showDialog(
@ -284,4 +324,52 @@ class HomeLogic extends GetxController {
}
loadMyCircleData() async {
var data = await DioManager.instance
.get(url: Api.getMyCircleAll);
// var bean = BaseResponse<InterestsBean>.fromJson(
// data, (data) => InterestsBean.fromJson(data));
if (data['code'] == 200) {
List circleList = data['data'];
if (circleList.isNotEmpty) {
List<Circle> infoList = [];
circleList.forEach((element) {
var info = Circle.fromJson(element);
infoList.add(info);
});
mycircle.lists = infoList;
if (currentIndex >= mycircle.lists.length - 1) {
currentIndex = mycircle.lists.length -1;
}
loadCalloutsNew();
}
}
}
loadCalloutsNew() async {
List<String> idList = [];
mycircle.lists.forEach((element) {
idList.add(element.id.toString());
});
var data = await DioManager.instance.post(
url:Api.calloutsNew,
params: {"interestIds":idList});
if (data['code'] == 200) {
List infoList = data['data'];
bool isHasNew = false;
if (infoList.isNotEmpty) {
infoList.forEach((element) {
if (element['hasNew']) {
isHasNew = true;
}
});
}
showcirlceUnred.value = isHasNew;
}
}
}

View File

@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../main.dart';
import 'logic.dart';
class HomePage extends StatefulWidget {
@ -18,7 +19,7 @@ class HomePage extends StatefulWidget {
}
class _HomePageState extends State<HomePage>
with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin {
with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin,RouteAware {
@override
bool get wantKeepAlive => true;
@ -34,6 +35,39 @@ class _HomePageState extends State<HomePage>
animationDuration: Duration.zero);
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
///
routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute);
}
void didPopNext() {
print('didPopNext');
logic.getUnreadSize();
}
///
void didPush() {
print('didPopNext');
}
void didPop() {
print('didPop');
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
routeObserver.unsubscribe(this);
}
@override
Widget build(BuildContext context) {
return GetBuilder(builder: (HomeLogic controller) {

View File

@ -54,6 +54,7 @@ class _LikePageState extends State<LikePage> with RouteAware {
print('didPopNext');
}
void didPop() {
print('didPop');
}
@ -151,18 +152,18 @@ class _LikePageState extends State<LikePage> with RouteAware {
},
child: Image.asset(
getCircleImage('send_msg'),
width: 60.sp,
width: 70.sp,
)))
],
);
}
goDetailPage(Circle bean,int index) async {
if (!bean.isJoin) {
await logic.outCircle(
bean.id.toString(),
bean.isJoin);
}
// if (!bean.isJoin) {
// await logic.outCircle(
// bean.id.toString(),
// bean.isJoin);
// }
var result = await Get.toNamed(AppRoutes.Signal_circle_list, arguments: bean.id);
var data = await DioManager.instance.get(

View File

@ -240,7 +240,7 @@ class Complete_materialLogic extends GetxController {
}
});
if(genderTagList.isEmpty){
showOKToast("选择你想认识的人");
showOKToast("点击选择你想认识的人");
return;
}
@ -319,7 +319,7 @@ class Complete_materialLogic extends GetxController {
}
});
if(genderTagList.isEmpty){
showOKToast("选择你想认识的人");
showOKToast("点击选择你想认识的人");
return;
}

View File

@ -103,11 +103,16 @@ class _Complete_materialPageState extends State<Complete_materialPage> {
height: 86.sp,
)
: ClipOval(
child: CachedNetworkImage(
fit: BoxFit.cover,
imageUrl: controller.headUrl,
width: 86.sp,
height: 86.sp,
child: Container(
decoration: BoxDecoration(
gradient: AppColor.mainVerLinearGradient
),
child: CachedNetworkImage(
fit: BoxFit.cover,
imageUrl: controller.headUrl,
width: 86.sp,
height: 86.sp,
),
),
),
),

View File

@ -6,6 +6,7 @@ import '../../network/dio_manager.dart';
import '../../util/SharedPreferencesHelper.dart';
import '../../util/eventBus.dart';
import '../../util/util.dart';
import '../dialog/UpdateDialog.dart';
import 'state.dart';
import 'package:shared_preferences/shared_preferences.dart';
@ -29,7 +30,7 @@ class MinefragmentLogic extends GetxController {
int orientation = -1;
bool has_pwd = false;
bool isUpdateVersion = false;
String enterHomeInfoMsg = "进入主页";
String joinedCircle = "";
String vipMsg = "十几种专属特权等你领取";
@ -45,12 +46,23 @@ class MinefragmentLogic extends GetxController {
}
getMode();
checkVersion();
EventBusManager.on<CommentVipEvent>().listen((event) {
isVip.value = event.vip;
// update();
});
}
Future<void> checkVersion() async {
var data = await DioManager.instance.get(url: Api.APP_VERSION);
var bean = BaseResponse<UpdateInfo>.fromJson(
data, (data) => UpdateInfo.fromJson(data));
if (bean.isSuccess()) {
isUpdateVersion = bean.data.update == 1;
update();
}
}
getMode() async {
var data = await DioManager.instance.get(url: Api.getUserMine);
var bean = BaseResponse<MineResponseBean>.fromJson(

View File

@ -7,12 +7,15 @@ import 'package:circle_app/app/circle/view.dart';
import 'package:circle_app/app/msg/view.dart';
import 'package:circle_app/router/app_routers.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../common/Widgets/open_vip_tip/view.dart';
import '../../main.dart';
import '../../util/SharedPreferencesHelper.dart';
import '../../util/util.dart';
import 'logic.dart';
@ -31,16 +34,54 @@ const MyImageWidget1 = Image(
fit: BoxFit.fill,
);
class MinefragmentPage extends StatelessWidget {
class MinefragmentPage extends StatefulWidget {
MinefragmentPage({Key? key}) : super(key: key);
@override
State<MinefragmentPage> createState() => _MinefragmentPageState();
}
class _MinefragmentPageState extends State<MinefragmentPage> with RouteAware {
final logic = Get.lazyPut(() => MinefragmentLogic());
final mineLogic = Get.find<MinefragmentLogic>();
final state = Get
.find<MinefragmentLogic>()
.state;
@override
void dispose() {
// TODO: implement dispose
super.dispose();
routeObserver.unsubscribe(this);
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
///
routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute);
}
void didPopNext() {
print('didPopNext');
mineLogic.checkVersion();
}
///
void didPush() {
print('didPopNext');
}
void didPop() {
print('didPop');
}
@override
Widget build(BuildContext context) {
double statusBarHeight = MediaQuery
@ -121,7 +162,7 @@ class MinefragmentPage extends StatelessWidget {
Widget _circleLiveView(MinefragmentLogic logic) {
return Column(
children: [_circleItemView(logic),_invienItemView(), _helpItemView(),_setUpItemView()],
children: [_circleItemView(logic),_invienItemView(),_editGoodReviewItemView(), _helpItemView(),_setUpItemView()],
);
}
@ -154,11 +195,24 @@ class MinefragmentPage extends StatelessWidget {
),
Row(
children: [
mineLogic.isUpdateVersion
? Container(
width: 10.sp,
height: 10.sp,
margin: EdgeInsets.only(right: 4.sp),
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle),
)
: Container(),
if (mineLogic.isUpdateVersion)
Text('有新版本啦',style: TextStyle(color: Colors.white60),),
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
height: 24.sp,
),
],
)
],
@ -243,6 +297,14 @@ class MinefragmentPage extends StatelessWidget {
),
Row(
children: [
Container(
width: 10.sp,
height: 10.sp,
margin: EdgeInsets.only(right: 4.sp),
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle),
),
const Text(
"免费领取会员",
style: TextStyle(color: Colors.white60),
@ -261,6 +323,104 @@ class MinefragmentPage extends StatelessWidget {
);
}
Widget _editGoodReviewItemView() {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
showTipPop();
},
child: Container(
margin: EdgeInsets.only(top: 18.sp),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Image(
image: AssetImage(getMineImage("edit_good_review")),
width: 24.sp,
height: 24.sp,
),
SizedBox(width: 10.sp),
const Text(
"评价微乐园",
style: TextStyle(color: Colors.white),
),
],
),
Row(
children: [
Container(
width: 10.sp,
height: 10.sp,
margin: EdgeInsets.only(right: 4.sp),
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle),
),
const Text(
"+3天会员时长",
style: TextStyle(color: Colors.white60),
),
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
height: 24.sp,
),
],
)
],
),
),
);
}
Widget _shareItemView() {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
Get.toNamed(AppRoutes.ExternalsharePage);
// controller.state.hearUrl
},
child: Container(
margin: EdgeInsets.only(top: 18.sp),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Image(
image: AssetImage(getMineImage("share")),
width: 24.sp,
height: 24.sp,
),
SizedBox(width: 10.sp),
const Text(
"站外分享",
style: TextStyle(color: Colors.white),
),
],
),
Row(
children: [
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
height: 24.sp,
),
],
)
],
),
),
);
}
Widget _circleItemView(MinefragmentLogic logic) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
@ -644,4 +804,40 @@ class MinefragmentPage extends StatelessWidget {
}
showTipPop() {
Get.bottomSheet(
CupertinoActionSheet(
//
//
actions: <Widget>[
//
CupertinoActionSheetAction(
onPressed: () async {
Get.back();
//
await launch('https://apps.apple.com/cn/app/%E5%BE%AE%E4%B9%90%E5%9B%AD-%E4%BA%9A%E6%96%87%E5%8C%96%E5%A4%9A%E5%85%83%E4%BA%A4%E5%8F%8B%E5%9F%BA%E5%9C%B0/id6459449499', forceSafariVC: false);
},
child: Text('立即评价'),
),
CupertinoActionSheetAction(
onPressed: () {
Get.back();
Get.toNamed(AppRoutes.Good_Reviews);
},
child: Text('反馈截图'),
),
],
cancelButton: CupertinoActionSheetAction(
//
onPressed: () {
Get.back();
},
child: Text('取消'),
),
),
isScrollControlled: true);
}
}

View File

@ -44,15 +44,18 @@ class Sys_notify_listLogic extends GetxController {
// lists.addAll(bean.data.lists);
// }
List bean = data['data']['lists'];
if (bean.length > 0) {
bean.forEach((element) {
lists.add(Lists.fromJson(element));
});
}
if (bean.length < 10) {
isMore = false;
if (data['code'] == 200) {
List bean = data['data']['lists'];
if (bean.length > 0) {
bean.forEach((element) {
lists.add(Lists.fromJson(element));
});
}
if (bean.length < 10) {
isMore = false;
}
}
isLoad = false;
update();
if (page == 0) {

View File

@ -244,7 +244,7 @@ class _MsgPageState extends State<MsgPage> with AutomaticKeepAliveClientMixin {
tipWidget() {
return Container(
margin: EdgeInsets.only(top: 18.sp, bottom: 15.sp),
padding: EdgeInsets.only(left: 16.sp, right: 18.sp),
padding: EdgeInsets.only(left: 16.sp, right: 12.sp),
width: Get.width,
height: 20,
child: Row(

View File

@ -1,3 +1,4 @@
import 'package:circle_app/app/minefragment/logic.dart';
import 'package:circle_app/components/my_app_bar.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart';
@ -128,6 +129,8 @@ class SetupPage extends StatelessWidget {
}
Widget _buildItemRow(String text, String imagePath) {
var mineLogic = Get.find<MinefragmentLogic>();
return Container(
padding: EdgeInsets.symmetric(horizontal: 16.sp),
// @dimen/dp_16
@ -141,6 +144,17 @@ class SetupPage extends StatelessWidget {
),
),
const Spacer(),
if (mineLogic.isUpdateVersion && text == '关于微乐园')
Container(
width: 10.sp,
height: 10.sp,
margin: EdgeInsets.only(right: 4.sp),
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle),
),
if (mineLogic.isUpdateVersion && text == '关于微乐园')
Text('有新版本啦',style: TextStyle(color: Colors.white60,fontSize: 14.sp),),
Image.asset(
imagePath,
width: 20.sp, //

View File

@ -9,4 +9,5 @@ class CONFIG{
static const USER_INFO_AVATAR = 'user_info_avatar/';
static const USER_ALBUM_IMAGE = 'user_album_image/';
}

View File

@ -232,7 +232,6 @@ class DioManager {
pushLoginPage();
} else {
switch (responseMap["code"]) {
case 1001:
case 4000:
case 4001:
case 4002:

View File

@ -69,6 +69,10 @@ import 'package:get/get_navigation/src/routes/get_route.dart';
import '../app/blacklist/view.dart';
import '../app/circle/binding.dart';
import '../app/externalshare/binding.dart';
import '../app/externalshare/view.dart';
import '../app/good_reviews/binding.dart';
import '../app/good_reviews/view.dart';
import '../app/privacy/binding.dart';
import '../app/splash/view.dart';
import '../app/visitorlist/binding.dart';
@ -238,5 +242,15 @@ class AppPages {
page: () => Reset_pwdPage(),
binding: Reset_pwdBinding(),
),
GetPage(
name: AppRoutes.ExternalsharePage,
page: () => ExternalsharePage(),
binding: ExternalshareBinding(),
),
GetPage(
name: AppRoutes.Good_Reviews,
page: () => Good_reviewsPage(),
binding: Good_reviewsBinding(),
),
];
}

View File

@ -41,6 +41,10 @@ abstract class AppRoutes {
static const EditPwd = '/mine/EditPwd';
static const ResetPwd = '/mine/EditPwd/ResetPwd';
static const ExternalsharePage = '/ExternalsharePage';
static const Good_Reviews = '/Good_Reviews';
}

View File

@ -1,9 +1,10 @@
import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'dart:typed_data';
import 'package:circle_app/util/util.dart';
import 'package:flutter_luban/flutter_luban.dart';
import 'package:flutter_image_compress/flutter_image_compress.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';
@ -17,7 +18,7 @@ import 'package:image/image.dart' as img;
typedef void MyCallback(String result);
//
void uploadQiniu(String filePath, String name, String path, String quToken,
void uploadQiniuVideo(File file, String name, String path, String quToken,
MyCallback myCallback) {
var storage = Storage();
DateTime now = DateTime.now();
@ -36,7 +37,32 @@ void uploadQiniu(String filePath, String name, String path, String quToken,
print('上传进度: $status');
});
storage.putFile(File(filePath), quToken,
storage.putFile(file, quToken,
options: PutOptions(controller: putController, key: imgPath));
}
//
void uploadQiniu(Uint8List bytes, String name, String path, String quToken,
MyCallback myCallback) {
var storage = Storage();
DateTime now = DateTime.now();
String yearMonth = DateFormat('yyyyMM').format(now);
String imgPath = "$path$yearMonth/${generateRandomString(16)}$name";
PutController putController = PutController();
putController.addStatusListener((StorageStatus status) {
if (status == StorageStatus.Success) {
var headUrl = CONFIG.IMAGE_HEAD + imgPath;
myCallback(headUrl);
}
print('状态变化: 当前任务状态:$status');
});
putController.addProgressListener((double status) {
print('上传进度: $status');
});
storage.putBytes(bytes, quToken,
options: PutOptions(controller: putController, key: imgPath));
}
@ -65,30 +91,20 @@ void uploadImage(String quToken, XFile pickedFile, String updataRoute,
}
}
if(isImageJpgOrPng(pickedFile.path)){
var path = await getApplicationSupportDirectoryPath();
CompressObject compressObject = CompressObject(
imageFile: File(pickedFile.path),
path: path,
quality: 80,
step: 9,
mode: CompressMode.AUTO,
);
Luban.compressImage(compressObject).then((_path) {
uploadQiniu(_path.toString(), pickedFile.name, updataRoute, quToken,
(result) {
myCallback(result);
});
}).catchError((error) {
print(error);
showOKToast("图片上传失败");
SmartDialog.dismiss(force: true);
});
} else {
uploadQiniu(pickedFile.path, pickedFile.name, updataRoute, quToken, (result) {
myCallback(result);
});
}
var result = await FlutterImageCompress.compressWithFile(
pickedFile.path,
minWidth: 2300,
minHeight: 1500,
quality: 94,
);
var size = await pickedFile.length();
print(size);
print(result!.length);
uploadQiniu(result!, pickedFile.name, updataRoute, quToken, (result) {
myCallback(result);
});
}
void convertImageFormat(

View File

@ -599,21 +599,13 @@ packages:
source: hosted
version: "2.2.2"
flutter_image_compress:
dependency: transitive
dependency: "direct main"
description:
name: flutter_image_compress
sha256: "37f1b26399098e5f97b74c1483f534855e7dff68ead6ddaccf747029fb03f29f"
url: "https://pub.dev"
source: hosted
version: "1.1.3"
flutter_install_app:
dependency: "direct main"
description:
name: flutter_install_app
sha256: "9b117006d17c900e671c26bcbc9b15c7b8efd15d6f9b4442ad5d576de20fab53"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
flutter_intl:
dependency: "direct main"
description:
@ -651,14 +643,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_luban:
dependency: "direct main"
description:
name: flutter_luban
sha256: "42c01fbc1d0dd14f4d573372b79d6747415749552a8e996cf989018cc70cf2a8"
url: "https://pub.dev"
source: hosted
version: "0.1.13"
flutter_markdown:
dependency: transitive
description:

View File

@ -80,8 +80,6 @@ dependencies:
video_player: ^2.6.1
#时间戳
flutter_intl: ^0.0.1
#图片压缩
flutter_luban: any
#视频压缩
video_compress: ^3.1.2
#图片缓存
@ -95,7 +93,7 @@ dependencies:
#event_bus:
event_bus: ^2.0.0
#安装apk
flutter_install_app: 1.3.0
# flutter_install_app: 1.3.0
#闪屏页
flutter_native_splash: 2.2.16
#腾讯离线推送
@ -111,6 +109,9 @@ dependencies:
#腾讯bugly
flutter_bugly: ^0.4.4
#图片压缩
flutter_image_compress: ^1.1.3
dev_dependencies:
flutter_test:
sdk: flutter