1.3.2代码提交

This commit is contained in:
CYH 2023-11-15 18:55:49 +08:00
parent 7b7f01ae93
commit b19a9357a0
34 changed files with 1494 additions and 860 deletions

View File

@ -71,8 +71,8 @@ android {
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21
targetSdkVersion flutter.targetSdkVersion
versionCode 22
versionName "1.3.0"
versionCode 25
versionName "1.3.2"
manifestPlaceholders = [
vivo_APPID: "105669716",
vivo_APPKEY:"84f750207787376b310ca5b0d5969122",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 587 KiB

After

Width:  |  Height:  |  Size: 514 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -313,7 +313,7 @@ class AccountPage extends StatelessWidget {
});
}
Future<void> getAuthorization() async {
pushLoginPage();
getAuthorization() async {
await pushLoginPage();
}
}

View File

@ -9,6 +9,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_setting_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:video_player/video_player.dart';
import 'package:video_thumbnail/video_thumbnail.dart';
@ -42,6 +44,8 @@ class Call_outLogic extends GetxController {
bool isZfbPrice = true;
final TUISettingModel settingModel = serviceLocator<TUISettingModel>();
@override
void onClose() {
super.onClose();

View File

@ -8,226 +8,325 @@ import 'package:video_player/video_player.dart';
import '../../router/app_routers.dart';
import 'logic.dart';
class Call_outPage extends StatelessWidget {
class Call_outPage extends StatefulWidget {
Call_outPage({Key? key}) : super(key: key);
@override
State<Call_outPage> createState() => _Call_outPageState();
}
class _Call_outPageState extends State<Call_outPage> {
final logic = Get.find<Call_outLogic>();
final state = Get.find<Call_outLogic>().state;
bool isShowKeyboard = false;
@override
Widget build(BuildContext context) {
return GetBuilder<Call_outLogic>(builder: (logic) {
return GetBuilder<Call_outLogic>(builder: (controller) {
var keyboardSize = MediaQuery.of(context).viewInsets.bottom;
return GestureDetector(
onTap: () {
FocusManager.instance.primaryFocus?.unfocus();
},
child: Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image: AssetImage(getBaseImage('home_back')))),
child: Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: Colors.transparent,
appBar: MyAppBar(
centerTitle: '圈内喊话',
actionWdiget: Image.asset(
getCircleImage('push'),
width: 54.sp,
onTap: () {
FocusManager.instance.primaryFocus?.unfocus();
},
child: Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image: AssetImage(getBaseImage('home_back')))),
child: Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: Colors.transparent,
appBar: MyAppBar(
centerTitle: '圈内喊话',
actionWdiget: Image.asset(
getCircleImage('push'),
width: 54.sp,
),
onPressed: () {
logic.sendShout();
},
),
onPressed: () {
//
//showToast('111');
logic.sendShout();
},
),
body: SafeArea(
child: GetBuilder(builder: (Call_outLogic controller) {
return Column(
body: SafeArea(
child: Stack(
fit: StackFit.expand,
children: [
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () async {
logic.startSelectCircleActivity();
},
child: Container(
height: 45.sp,
padding: EdgeInsets.only(left: 17.sp, right: 17.sp),
child: Row(
children: [
Text(
'选择圈子:',
style: TextStyle(
color: Colors.white, fontSize: 16.sp),
Column(
children: [
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () async {
logic.startSelectCircleActivity();
},
child: Container(
height: 45.sp,
padding:
EdgeInsets.only(left: 17.sp, right: 17.sp),
child: Row(
children: [
Text(
'选择圈子:',
style: TextStyle(
color: Colors.white, fontSize: 16.sp),
),
Expanded(child: Container()),
logic.circleName == ''
? Container()
: Container(
padding: EdgeInsets.only(
left: 7.sp, right: 7.sp),
height: 21.sp,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(
21 * 0.5.sp),
gradient: const LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [
Color(0xff0AFCFF),
Color(0xffD739EA)
])),
child: Text(
logic.circleName,
style: TextStyle(
color: Colors.white,
fontSize: 12.sp),
),
),
Image.asset(
getHomeImage('icon_in'),
width: 24.sp,
),
],
),
Expanded(child: Container()),
logic.circleName == ''
? Container()
: Container(
padding: EdgeInsets.only(
left: 7.sp, right: 7.sp),
height: 21.sp,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
21 * 0.5.sp),
gradient: const LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [
Color(0xff0AFCFF),
Color(0xffD739EA)
])),
child: Text(
logic.circleName,
style: TextStyle(
color: Colors.white,
fontSize: 12.sp),
),
),
Image.asset(
getCircleImage('line'),
width: Get.width,
fit: BoxFit.fill,
),
Expanded(
child: Container(
padding: EdgeInsets.only(top: 15.sp),
child: Stack(
children: [
SizedBox(
height: 200.sp,
child: TextField(
controller:
controller.textEditingController,
onChanged: (value) {
controller.update();
},
onTap: () {
isShowKeyboard = true;
setState(() {});
},
style: TextStyle(
color: Colors.white, fontSize: 14.0.sp),
maxLines: 32,
maxLength: 200,
decoration: InputDecoration(
hintStyle: TextStyle(
color: const Color.fromRGBO(
255, 255, 255, 0.6),
fontSize: 14.sp),
hintText: '请输入...(左下角上传图片或视频哦)',
border: InputBorder.none,
contentPadding: EdgeInsets.only(
left: 17.sp, right: 17.sp),
counter: const Text('')),
),
),
Positioned(
right: 15.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),
child: _showVideo(controller),
)
],
),
)),
if (!isShowKeyboard)
Container(
height: 60.sp,
padding: EdgeInsets.only(
left: 17.sp, right: 17.sp, bottom: 5.sp),
child: Row(
children: [
GestureDetector(
onTap: () {
logic.showImg();
},
child: Image.asset(
getCircleImage('photo'),
width: 30.sp,
),
),
const SizedBox(
width: 16,
),
GestureDetector(
onTap: () {
logic.showVideo();
},
child: Image.asset(
getCircleImage('video'),
width: 30.sp,
),
),
Expanded(
child: GestureDetector(
onTap: () {
if (controller.vip == 2) {
controller.isCheck =
!controller.isCheck;
controller.update();
} else {
showOKToast("至尊喊话为年会员特权,开通年会员即可享受哦~");
controller.showRechargeDialog();
}
},
child: Row(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Image.asset(
getCircleImage(controller.isCheck
? 'check'
: 'uncheck'),
width: 17.5.sp,
),
SizedBox(
width: 4.sp,
),
Text(
'使用至尊喊话',
style: TextStyle(
color: Colors.white,
fontSize: 16.sp),
)
],
),
),
),
GestureDetector(
onTap: () {
navigateToContentGuidelines();
},
child: Text(
'内容规范',
style: TextStyle(
color: const Color(0xff00FFF4),
fontSize: 14.sp),
),
)
],
),
)
],
),
if (isShowKeyboard)
Positioned(
bottom: keyboardSize,
child: Container(
width: Get.width,
height: 60.sp,
padding: EdgeInsets.only(
left: 17.sp, right: 17.sp, bottom: 5.sp),
child: Row(
children: [
GestureDetector(
onTap: () {
logic.showImg();
},
child: Image.asset(
getCircleImage('photo'),
width: 30.sp,
),
),
const SizedBox(
width: 16,
),
GestureDetector(
onTap: () {
logic.showVideo();
},
child: Image.asset(
getCircleImage('video'),
width: 30.sp,
),
),
Expanded(
child: GestureDetector(
onTap: () {
if (controller.vip == 2) {
controller.isCheck =
!controller.isCheck;
controller.update();
} else {
showOKToast("至尊喊话为年会员特权,开通年会员即可享受哦~");
controller.showRechargeDialog();
}
},
child: Row(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Image.asset(
getCircleImage(controller.isCheck
? 'check'
: 'uncheck'),
width: 17.5.sp,
),
SizedBox(
width: 4.sp,
),
Text(
'使用至尊喊话',
style: TextStyle(
color: Colors.white,
fontSize: 16.sp),
)
],
),
),
Image.asset(
getHomeImage('icon_in'),
width: 24.sp,
),
],
),
),
),
Image.asset(
getCircleImage('line'),
width: Get.width,
fit: BoxFit.fill,
),
Expanded(
child: Container(
padding: EdgeInsets.only(top: 15.sp),
child: Stack(
children: [
SizedBox(
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: const Color.fromRGBO(
255, 255, 255, 0.6),
fontSize: 14.sp),
hintText: '请输入...(左下角上传图片或视频哦)',
border: InputBorder.none,
contentPadding: EdgeInsets.only(
left: 17.sp, right: 17.sp),
counter: const Text('')),
),
),
Positioned(
right: 15.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),
child:_showVideo(controller) ,)
],
),
)),
Container(
height: 60.sp,
padding: EdgeInsets.only(
left: 17.sp, right: 17.sp, bottom: 5.sp),
child: Row(
children: [
GestureDetector(
onTap: () {
logic.showImg();
},
child: Image.asset(
getCircleImage('photo'),
width: 30.sp,
),
),
const SizedBox(
width: 16,
),
GestureDetector(
onTap: () {
logic.showVideo();
},
child: Image.asset(
getCircleImage('video'),
width: 30.sp,
),
),
Expanded(
child: GestureDetector(
onTap: () {
if(controller.vip ==2){
controller.isCheck = !controller.isCheck;
controller.update();
}else{
showOKToast("至尊喊话为年会员特权,开通年会员即可享受哦~");
controller.showRechargeDialog();
}
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
getCircleImage(controller.isCheck
? 'check'
: 'uncheck'),
width: 17.5.sp,
),
SizedBox(
width: 4.sp,
),
Text(
'使用至尊喊话',
),
GestureDetector(
onTap: () {
navigateToContentGuidelines();
},
child: Text(
'内容规范',
style: TextStyle(
color: Colors.white,
fontSize: 16.sp),
)
],
),
color: const Color(0xff00FFF4),
fontSize: 14.sp),
),
)
],
),
),
GestureDetector(
onTap: (){
navigateToContentGuidelines();
},
child: Text(
'内容规范',
style: TextStyle(
color: const Color(0xff00FFF4),
fontSize: 14.sp),
),
)
],
),
)
))
],
);
}),
),
)),
);
),
),
)));
});
}
@ -240,47 +339,21 @@ class Call_outPage extends StatelessWidget {
}
// Widget _maxVideo(Call_outLogic controller){
// return SizedBox(
// 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){
Widget _mixVideo(Call_outLogic controller) {
return SizedBox(
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,
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){
if (controller.videoPlayerController!.value.isPlaying) {
controller.videoPlayerController!.pause();
}else{
} else {
controller.videoPlayerController!.play();
}
controller.update();
@ -290,7 +363,15 @@ class Call_outPage extends StatelessWidget {
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,),),
Center(
child: controller.videoPlayerController!.value.isPlaying
? Container()
: Image(
image: AssetImage(getMineImage("icon_play")),
width: 30.sp,
height: 30.sp,
),
),
Positioned(
top: 0,
right: 0,
@ -515,11 +596,7 @@ class Call_outPage extends StatelessWidget {
);
}
void _showDelVideoDialog(
BuildContext context, Call_outLogic controller) {
void _showDelVideoDialog(BuildContext context, Call_outLogic controller) {
showDialog(
context: context,
builder: (BuildContext context) {
@ -561,7 +638,7 @@ class Call_outPage extends StatelessWidget {
child: Text(
"提示",
style:
TextStyle(color: Colors.white, fontSize: 16.sp),
TextStyle(color: Colors.white, fontSize: 16.sp),
),
),
Container(
@ -615,7 +692,7 @@ class Call_outPage extends StatelessWidget {
onTap: () {
Navigator.pop(context);
controller.videoPlayerController?.dispose();
controller.videoPlayerController=null;
controller.videoPlayerController = null;
controller.state.videolist = [];
controller.update();
},
@ -658,111 +735,4 @@ class Call_outPage extends StatelessWidget {
},
);
}
// tipWdiget() {
// return 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),
// ),
// SizedBox(
// width: 2.sp,
// ),
// Text(
// '(原价60)',
// style: TextStyle(
// color: Colors.white70,
// fontSize: 16.sp,
// fontWeight: FontWeight.w400,
// decoration: TextDecoration.lineThrough,
// decorationColor: Colors.white70,
// ),
// ),
// ],
// ),
// ))
// ],
// ),
// ),
// ),
// );
// }
}

View File

@ -220,23 +220,23 @@ class InfoListViewState extends State<InfoListView> with AutomaticKeepAliveClien
void pushMsgPage(Lists bean, String cicleId) async {
// if (widget.bean.is_limit&&widget.bean.amount>0) {
// showJoinCiclePiker(cicleId,widget.bean.amount.toString(),widget.bean.oldAmount.toString(),2,(payResult){
// widget.bean.is_limit = false;
// if (Get.isRegistered<CircleLogic>()) {
// var logic = Get.find<CircleLogic>();
// for (var element in logic.circle.lists) {
// if (element.id == widget.bean.id) {
// element.is_limit = false;
// element.isJoin = true;
// }
// }
// logic.update();
// }
// Get.back();
// },widget.bean.ios_item);
// return;
// }
if (widget.bean.is_limit&&widget.bean.amount>0) {
showJoinCiclePiker(cicleId,widget.bean.amount.toString(),widget.bean.oldAmount.toString(),2,(payResult){
widget.bean.is_limit = false;
if (Get.isRegistered<CircleLogic>()) {
var logic = Get.find<CircleLogic>();
for (var element in logic.circle.lists) {
if (element.id == widget.bean.id) {
element.is_limit = false;
element.isJoin = true;
}
}
logic.update();
}
Get.back();
},widget.bean.ios_item);
return;
}
var sp = await SharedPreferencesHelper.getInstance();
String myUserId = sp.getMyUserId();

View File

@ -20,6 +20,8 @@ import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../common/Widgets/base_tip_widget.dart';
class LikeView extends StatefulWidget {
@override
_LikeViewState createState() => _LikeViewState();
@ -220,13 +222,13 @@ class _LikeViewState extends State<LikeView>
}
void pushMsgPage(var bean, String cicleId) async {
// if (widget.bean.is_limit&&widget.bean.amount>0) {
// showJoinCiclePiker(cicleId,widget.bean.amount.toString(),widget.bean.oldAmount.toString(),2,(payResult){
// widget.bean.is_limit = false;
// if (bean.is_limit&&bean.amount>0) {
// showJoinCiclePiker(cicleId,bean.amount.toString(),bean.oldAmount.toString(),2,(payResult){
// bean.is_limit = false;
// if (Get.isRegistered<CircleLogic>()) {
// var logic = Get.find<CircleLogic>();
// for (var element in logic.circle.lists) {
// if (element.id == widget.bean.id) {
// if (element.id == bean.id) {
// element.is_limit = false;
// element.isJoin = true;
// }
@ -234,7 +236,7 @@ class _LikeViewState extends State<LikeView>
// logic.update();
// }
// Get.back();
// },widget.bean.ios_item);
// },bean.ios_item);
// return;
// }

View File

@ -81,7 +81,7 @@ class _ScreenBottomSheetDialogState extends State<ScreenBottomSheetDialog> {
height: 220.0,
width: double.infinity,
child: Container(
margin: EdgeInsets.symmetric( vertical: 20.sp),
margin: EdgeInsets.only(top: 10.sp),
child: Column(
children: [
Row(

View File

@ -13,11 +13,13 @@ import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import '../../util/SharedPreferencesHelper.dart';
import '../../util/eventBus.dart';
import '../../view/notice.dart';
import '../circle/view.dart';
@ -54,10 +56,10 @@ class HomeLogic extends GetxController {
@override
void onInit() async {
super.onInit();
unreadSIze.value = '0';
getIMData();
setFirstData();
tabs.add(CirclePage());
tabs.add(LikePage());
@ -67,7 +69,7 @@ class HomeLogic extends GetxController {
// EventBusManager.on<RefreshUnread>().listen((event) {
// getUnreadSize();
// });
getUnreadSize();
// getUnreadSize();
@ -177,25 +179,32 @@ class HomeLogic extends GetxController {
showOKToast(bean.msg);
}
getUnreadSize() async {
try {
V2TimValueCallback<int> getTotalUnreadMessageCountRes =
await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.getTotalUnreadMessageCount();
print("未读数量desc=" +
getTotalUnreadMessageCountRes.desc.toString() +
"code=" +
getTotalUnreadMessageCountRes.code.toString() +
"data=" +
getTotalUnreadMessageCountRes.data.toString());
if (coreInstance.isLoginSuccess) {
try {
V2TimValueCallback<int> getTotalUnreadMessageCountRes =
await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.getTotalUnreadMessageCount();
print("未读数量desc=" +
getTotalUnreadMessageCountRes.desc.toString() +
"code=" +
getTotalUnreadMessageCountRes.code.toString() +
"data=" +
getTotalUnreadMessageCountRes.data.toString());
if (getTotalUnreadMessageCountRes.code == 0) {
if (getTotalUnreadMessageCountRes.data.toString() != unreadSIze.value) {
unreadSIze.value = getTotalUnreadMessageCountRes.data.toString();
}
if (Platform.isAndroid) {
setOfflinePushStatus(status: AppStatus.foreground);
}
if (getTotalUnreadMessageCountRes.code == 0) {
unreadSIze.value = getTotalUnreadMessageCountRes.data.toString();
if (Platform.isAndroid) {
setOfflinePushStatus(status: AppStatus.foreground);
}
}
} catch (e) {}
} catch (e) {}
}
}
@override
@ -267,4 +276,12 @@ class HomeLogic extends GetxController {
}
update();
}
void setFirstData() async {
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
sharedPreferences.setString(
SharedPreferencesHelper.firstLogin, '1');
}
}

View File

@ -79,7 +79,7 @@ class LikeLogic extends GetxController {
}
isLoad = false;
if (circle.lists.length < 20) {
if (bean.data!.lists.length < 20) {
isMore = false;
}
update();

View File

@ -131,11 +131,14 @@ class _LikePageState extends State<LikePage> with RouteAware {
logic.relaodData();
},
child: ListView.builder(
controller: logic.rightCtr,
controller: logic.rightCtr ,
itemBuilder: (context, index) {
if (index == logic.circle.lists.length) {
return loaddingWidget(logic.isMore);
}
return circleInfoItem(logic.circle.lists[index],index);
},
itemCount: logic.circle.lists.length,
itemCount: logic.circle.lists.length + 1,
)),
Positioned(
bottom: 36.sp,
@ -154,6 +157,50 @@ class _LikePageState extends State<LikePage> with RouteAware {
);
}
goDetailPage(Circle bean,int index) async {
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(
url: "/up-service/interest/${bean.id}",);
if (data["code"] == 200) {
var bean = Circle.fromJson(data['data']);
logic.circle.lists[index] = bean;
if (mounted) {
setState(() {
});
}
}
}
goAndJoinDetailPage(Circle bean,int index) async {
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(
url: "/up-service/interest/${bean.id}",);
if (data["code"] == 200) {
var bean = Circle.fromJson(data['data']);
logic.circle.lists[index] = bean;
if (mounted) {
setState(() {
});
}
}
}
circleInfoItem(Circle bean,int index) {
List<JoinUser> urlList = bean.lastJoinUsers;
List<Widget> widgets = [];
@ -176,19 +223,7 @@ class _LikePageState extends State<LikePage> with RouteAware {
}
return GestureDetector(
onTap: () async {
var result = await Get.toNamed(AppRoutes.Signal_circle_list, arguments: bean.id);
var data = await DioManager.instance.get(
url: "/up-service/interest/${bean.id}",);
if (data["code"] == 200) {
var bean = Circle.fromJson(data['data']);
logic.circle.lists[index] = bean;
if (mounted) {
setState(() {
});
}
}
goDetailPage(bean, index);
},
child: Container(
margin: EdgeInsets.only(bottom: 10.sp),
@ -271,8 +306,7 @@ class _LikePageState extends State<LikePage> with RouteAware {
Get.bottomSheet(CircleShare('', '', bean),
isScrollControlled: true, enableDrag: false);
} else {
await logic.outCircle(
bean.id.toString(), bean.isJoin);
goAndJoinDetailPage(bean, index);
}
},
child: Stack(
@ -317,8 +351,7 @@ class _LikePageState extends State<LikePage> with RouteAware {
additionStyle: TextStyle(
color: const Color(0xFFFF4DF6), fontSize: 17.sp),
onTap: () {
_showTextContentDialog(
Get.context!, bean.intro, bean.title);
goDetailPage(bean, index);
},
)),
urlList.length == 0
@ -430,7 +463,7 @@ class _LikePageState extends State<LikePage> with RouteAware {
}
if (count == 5 && !logic.mycircle.lists[index].is_top) {
showOKToast('圈子置顶最多五个哦~');
showOKToast('最多置顶5个可长按已置顶圈子取消置顶哦');
} else {
_showSetTopCircleDialog(Get.context!,logic,logic.mycircle.lists[index]);
}

View File

@ -1,4 +1,5 @@
import 'package:circle_app/app/minefragment/logic.dart';
import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
@ -23,6 +24,8 @@ class LikelistLogic extends GetxController {
@override
void onInit() async{
super.onInit();
var mineLogic = Get.find<MinefragmentLogic>();
isVip = mineLogic.isVip.value;
initList();
}

View File

@ -1,4 +1,9 @@
import 'dart:ui';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:circle_app/app/minefragment/logic.dart';
import 'package:circle_app/common/Widgets/open_vip_tip/view.dart';
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';
@ -25,118 +30,339 @@ class LikelistPage extends StatelessWidget {
? loaddingWidget(true)
: logic.lists.isEmpty
? noResultWidget()
: SmartRefresher(
controller: logic.refreshController,
onRefresh: _onRefresh,
onLoading: _onLoading,
enablePullUp: true,
child: ListView.builder(
padding: EdgeInsets.all(10.sp),
itemCount: logic.lists.length,
itemBuilder: (context, index) {
return ListItem(logic.lists[index], index);
},
),
),
: Stack(
children: [
SmartRefresher(
controller: logic.refreshController,
onRefresh: _onRefresh,
onLoading: _onLoading,
enablePullUp: true,
child: ListView.builder(
padding: EdgeInsets.all(10.sp),
itemCount: logic.lists.length,
itemBuilder: (context, index) {
return ListItem(logic.lists[index], index);
},
),
),
showGd()
],
),
),
);
});
}
Widget showGd() {
double interval = 50;
List<String> urlList = [];
if (logic.lists.length > 3) {
for (int i = 3; i < logic.lists.length; i++) {
if (urlList.length < 3) {
print(logic.lists[i].user.avatar);
urlList.add(logic.lists[i].user.avatar);
} else {
break;
}
}
}
List<Widget> widgets = [];
switch (urlList.length) {
case 0:
widgets.add(Positioned(
left: (Get.width / 2) - 40,
child: circleWidget(""),
));
break;
case 1:
for (int i = 0; i < urlList.length; i++) {
var element = urlList[i];
// double xOffset = interval * i + xOffsetBase;
double let = (Get.width / 2) - 60;
if (element == '') {
element =
'https://i0.wp.com/picjumbo.com/wp-content/uploads/romantic-tropical-beach-with-villa-and-palms-during-beautiful-sunset-free-photo.jpg?w=600&quality=80';
}
widgets.add(Positioned(
left: let,
child: circleWidget(element),
));
}
widgets.add(Positioned(
left: (Get.width / 2) - 20,
child: circleWidget(""),
));
break;
case 2:
double xOffsetBase =
(Get.width + interval * urlList.length - 60.0 * urlList.length) *
0.25;
for (int i = 0; i < urlList.length; i++) {
var element = urlList[i];
// double xOffset = interval * i + xOffsetBase;
double let = ((Get.width / 2) - ((40 * urlList.length)) + (i * 40));
if (element == '') {
element =
'https://i0.wp.com/picjumbo.com/wp-content/uploads/romantic-tropical-beach-with-villa-and-palms-during-beautiful-sunset-free-photo.jpg?w=600&quality=80';
}
widgets.add(Positioned(
left: let,
child: circleWidget(element),
));
}
double xOffset = interval * urlList.length + xOffsetBase;
widgets.add(Positioned(
left: xOffset,
child: circleWidget(""),
));
break;
case 3:
// double xOffsetBase = (Get.width + interval * urlList.length - 60.0 * urlList.length) * 0.25;
for (int i = 0; i < urlList.length; i++) {
switch (i) {
case 0:
if (urlList[i] == '') {
urlList[i] =
'https://i0.wp.com/picjumbo.com/wp-content/uploads/romantic-tropical-beach-with-villa-and-palms-during-beautiful-sunset-free-photo.jpg?w=600&quality=80';
}
widgets.add(Positioned(
left: (Get.width / 2) - 100,
child: circleWidget(urlList[i]),
));
break;
case 1:
if (urlList[i] == '') {
urlList[i] =
'https://i0.wp.com/picjumbo.com/wp-content/uploads/romantic-tropical-beach-with-villa-and-palms-during-beautiful-sunset-free-photo.jpg?w=600&quality=80';
}
widgets.add(Positioned(
left: (Get.width / 2) - 60,
child: circleWidget(urlList[i]),
));
break;
case 2:
if (urlList[i] == '') {
urlList[i] =
'https://i0.wp.com/picjumbo.com/wp-content/uploads/romantic-tropical-beach-with-villa-and-palms-during-beautiful-sunset-free-photo.jpg?w=600&quality=80';
}
widgets.add(Positioned(
left: (Get.width / 2) - 20,
child: circleWidget(urlList[i]),
));
break;
}
}
widgets.add(Positioned(
left: (Get.width / 2) + 20,
child: circleWidget(""),
));
break;
}
return logic.isVip > 0
? Container()
: Positioned(
bottom: 150,
child: Container(
width: Get.width,
child: Column(
children: [
SizedBox(
height: 140.sp,
width: Get.width,
child: Stack(
alignment: Alignment.centerLeft,
children: widgets,
),
),
Container(
margin: EdgeInsets.only(bottom: 40.sp),
child: Text(
"TA们也喜欢你哦 \n"
"成为会员查看所有圈友信息",
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 15.sp,
),
),
),
GestureDetector(
onTap: () {
showRechargeDialog();
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: AppColor.mainVerLinearGradient,
),
padding: EdgeInsets.symmetric(
vertical: 10.sp,
horizontal: 55.sp,
),
child: Text(
"开通会员查看更多访客",
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
),
),
),
),
],
),
),
);
}
circleWidget(String url, {double width = 80}) {
return GestureDetector(
onTap: () {
// openvi();
},
child: Stack(
alignment: Alignment.center,
children: [
Image.asset(
getCircleImage('more'),
width: width.sp,
height: width.sp,
),
url != null && url.contains("http")
? ClipOval(
child: CachedNetworkImage(
imageUrl: url,
width: (width - 1).sp,
height: (width - 1).sp,
fit: BoxFit.cover,
),
)
: Text(
url,
style: TextStyle(color: Color(0xffF756FF), fontSize: 12.sp),
)
],
));
}
Widget ListItem(UserListItem item, int index) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
Get.toNamed(AppRoutes.UserInfoActivity,
arguments: item.user.id.toString());
if (logic.isVip > 0 || index < 3) {
Get.toNamed(AppRoutes.UserInfoActivity,
arguments: item.user.id.toString());
}
},
child: Container(
margin: EdgeInsets.only(bottom: 21.sp),
child: Row(
children: [
Stack(
children: [
ClipOval(
child: GestureDetector(
onTap: () {
var imgList = <String>[];
imgList.add(item.user.avatar);
Get.toNamed(AppRoutes.Swiper,
arguments: {'imaglist': imgList, 'index': 0});
},
child: CachedNetworkImage(
fit: BoxFit.cover,
imageUrl: item.user.avatarThumb,
width: 53.sp,
height: 53.sp,
child: ImageFiltered(
imageFilter: ImageFilter.blur(
sigmaX: (logic.isVip > 0 || index < 3) ? 0 : 5,
sigmaY: (logic.isVip > 0 || index < 3) ? 0 : 5,
),
child: Container(
margin: EdgeInsets.only(bottom: 21.sp),
child: Row(
children: [
Stack(
children: [
ClipOval(
child: GestureDetector(
onTap: () {
var imgList = <String>[];
imgList.add(item.user.avatar);
Get.toNamed(AppRoutes.Swiper,
arguments: {'imaglist': imgList, 'index': 0});
},
child: CachedNetworkImage(
fit: BoxFit.cover,
imageUrl: item.user.avatarThumb,
width: 53.sp,
height: 53.sp,
),
),
),
),
Positioned(
right: 0.sp,
left: 0.sp,
bottom: 0.sp,
child: item.user.vip!=0
? Image(
image: AssetImage(getBaseImage(item.user.vip == 1 ? "vip" : 'year_vip')),
width: 44.sp,
height: 18.sp,
)
: Container(),
)
],
),
SizedBox(width: 10.sp),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Text(
item.user.nickname,
style: const TextStyle(
color: Colors.white70,
fontSize: 14,
fontWeight: FontWeight.bold),
),
SizedBox(width: 4.sp),
// SizedBox(height: 8.sp),
_buildInfoRow(item),
// Placeholder image
],
),
SizedBox(height: 8.sp),
SizedBox(
width: 200.sp,
child: Text(
item.user.signature,
overflow: TextOverflow.ellipsis, // 使
maxLines: 1,
style: TextStyle(fontSize: 12.sp, color: const Color(0xFFB7BECC)),
Positioned(
right: 0.sp,
left: 0.sp,
bottom: 0.sp,
child: item.user.vip != 0
? Image(
image: AssetImage(getBaseImage(
item.user.vip == 1 ? "vip" : 'year_vip')),
width: 44.sp,
height: 18.sp,
)
: Container(),
)
],
),
SizedBox(width: 10.sp),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Text(
item.user.nickname,
style: const TextStyle(
color: Colors.white70,
fontSize: 14,
fontWeight: FontWeight.bold),
),
SizedBox(width: 4.sp),
// SizedBox(height: 8.sp),
_buildInfoRow(item),
// Placeholder image
],
),
SizedBox(height: 8.sp),
SizedBox(
width: 200.sp,
child: Text(
item.user.signature,
overflow: TextOverflow.ellipsis, // 使
maxLines: 1,
style: TextStyle(
fontSize: 12.sp, color: const Color(0xFFB7BECC)),
),
),
],
),
// Pla
const Spacer(),
GestureDetector(
onTap: () {
logic.setLike(index);
},
child: Container(
width: 75.sp,
height: 28.sp,
decoration: BoxDecoration(
color: const Color(0xFFFF4D7C),
borderRadius: BorderRadius.circular(14),
),
child: Center(
child: Text(item.isLike ? "互相关注" : "关注",
style: TextStyle(fontSize: 14.sp, color: Colors.white)),
),
),
],
),
// Pla
const Spacer(),
GestureDetector(
onTap: () {
logic.setLike(index);
},
child: Container(
width: 75.sp,
height: 28.sp,
decoration: BoxDecoration(
color: const Color(0xFFFF4D7C),
borderRadius: BorderRadius.circular(14),
),
child: Center(
child: Text(item.isLike ? "互相关注" : "关注",
style: TextStyle(fontSize: 14.sp, color: Colors.white)),
),
),
),
],
],
),
),
),
);
@ -186,4 +412,22 @@ class LikelistPage extends StatelessWidget {
logic.page = logic.page + 1;
logic.initList();
}
showRechargeDialog() async {
MinefragmentLogic ctr = Get.find();
Get.bottomSheet(
Scaffold(
backgroundColor: Colors.transparent,
body: Open_vip_tipPage(false),
),
isScrollControlled: true,
enableDrag: false).then((value) {
ctr.getMode();
logic.isVip = ctr.isVip.value;
logic.update();
});
}
}

View File

@ -1,4 +1,6 @@
import 'dart:convert';
import 'package:circle_app/network/dio_manager.dart';
import 'package:circle_app/router/app_routers.dart';
import 'package:circle_app/util/util.dart';
@ -12,6 +14,7 @@ import 'package:image_picker/image_picker.dart';
import '../../../common/config.dart';
import '../../../network/api.dart';
import '../../../util/qiniu.dart';
import '../../circle/logic.dart';
import '../../minefragment/logic.dart';
import '../../select_circle/logic.dart';
import '../../userinfo/logic.dart';
@ -46,9 +49,18 @@ class Complete_materialLogic extends GetxController {
UserBean? userInfoBean = null;
List<Province> provinceList = [];
List<int> genderTagList = [];//
List<SysTag> watchGenderList = [];
Map cityMap = {};
@override
void onInit() async {
FlutterNativeSplash.remove();
await loadCofigData();
getCityList();
if(type!=''){
var data = await DioManager.instance.get(url: Api.getUserInfo);
var bean = BaseResponse<ResponseBean>.fromJson(
@ -66,8 +78,18 @@ class Complete_materialLogic extends GetxController {
state.role = getRoleContent(userInfoBean!.role);
state.roleId = userInfoBean!.role.toString();
state.orientation = getOrientationContent(userInfoBean!.orientation);
if (userInfoBean!.orientations.isNotEmpty) {
watchGenderList.forEach((element) {
if (userInfoBean!.orientations!.contains(element.id)) {
element.isSelect = true;
}
});
}
state.orientationId = userInfoBean!.orientation.toString();
state.textEditingController.text = userInfoBean!.nickname;
state.city = userInfoBean!.city ?? '';
state.descEditingController.text = userInfoBean!.signature;
headUrl = userInfoBean!.avatar;
userInfoBean!.interests.forEach((element) {
@ -82,6 +104,10 @@ class Complete_materialLogic extends GetxController {
}
}
loadCofigData() async {
var data =
await DioManager.instance.get(url: Api.getqiniuToken, params: {});
var bean = BaseResponse<QnTokenData>.fromJson(
@ -99,6 +125,8 @@ class Complete_materialLogic extends GetxController {
configBean.genderMap.forEach((key, value) {
genderList.add(value);
SysTag tag = SysTag(id: int.parse(key), tagName: value);
watchGenderList.add(tag);
});
configBean.orientationMap.forEach((key, value) {
@ -109,6 +137,30 @@ class Complete_materialLogic extends GetxController {
});
}
getCityList() async {
try {
String jsonString = await rootBundle.loadString('assets/province.json');
List<dynamic> jsonData = json.decode(jsonString);
provinceList =
jsonData.map((dynamic item) => Province.fromJson(item)).toList();
cityMap.clear();
for (int i = 0; i < provinceList.length; i++) {
Map areaMap = {};
for (int c = 0; c < provinceList[i].city.length; c++) {
String cityName = provinceList[i].city[c].name;
List<String> cityAreaList = [];
provinceList[i].city[c].area.forEach((element) {
cityAreaList.add(element);
});
areaMap[cityName] = cityAreaList;
}
cityMap[provinceList[i].name] = areaMap;
}
} catch (e) {
print('Error loading JSON file: $e');
}
}
Future getImageFile() async {
try {
final XFile? pickedFile = await _picker.pickImage(
@ -148,16 +200,16 @@ class Complete_materialLogic extends GetxController {
showOKToast('昵称最多输入6个字');
return;
}else if (state.sex.isEmpty) {
showOKToast('请选择您的属性');
showOKToast('请选择您的角色');
return;
} else if (state.age.isEmpty) {
showOKToast('请选择您的年龄');
return;
} else if (state.role.isEmpty) {
showOKToast('请选择您的角色');
} else if (state.city.isEmpty) {
showOKToast('请选择您的常驻城市');
return;
} else if (state.role.isEmpty) {
showOKToast('请选择您的角色');
showOKToast('请选择您的属性');
return;
} else if (state.orientation.isEmpty) {
showOKToast('请选择您的取向');
@ -172,10 +224,26 @@ class Complete_materialLogic extends GetxController {
showOKToast('您的交友宣言太短');
return;
}
if (headUrl == '') {
showOKToast('请上传头像');
return;
}
genderTagList.clear();
List tagIds = [];
watchGenderList.forEach((element) {
if(element.isSelect){
tagIds.add(element.id);
genderTagList.add(element.id);
}
});
if(genderTagList.isEmpty){
showOKToast("请选择你想认识的人");
return;
}
// LatLng location = await getLocation();
List<String> interestsList = [];
numbers.forEach((element) {
@ -188,6 +256,8 @@ class Complete_materialLogic extends GetxController {
'role': state.roleId, //Int
'interests': interestsList, //
'orientation': state.orientationId, //Int
'city':state.city,
'orientations':genderTagList,
// 'lat': location.latitude,
// 'lng': location.longitude,
'nickname': state.textEditingController.text.trim(),
@ -214,6 +284,9 @@ class Complete_materialLogic extends GetxController {
} else if (state.age.isEmpty) {
showOKToast('请选择您的年龄');
return;
} else if (state.city.isEmpty) {
showOKToast('请选择您的常驻城市');
return;
} else if (state.role.isEmpty) {
showOKToast('请选择您的角色');
return;
@ -237,6 +310,18 @@ class Complete_materialLogic extends GetxController {
showOKToast('请上传头像');
return;
}
genderTagList.clear();
List tagIds = [];
watchGenderList.forEach((element) {
if(element.isSelect){
tagIds.add(element.id);
genderTagList.add(element.id);
}
});
if(genderTagList.isEmpty){
showOKToast("请选择你想认识的人");
return;
}
if (state.wxEditingController.text.isNotEmpty) {
bool isPass = false;
@ -270,6 +355,8 @@ class Complete_materialLogic extends GetxController {
'role': state.roleId, //Int
'interests': interestsList, //
'orientation': state.orientationId, //Int
'orientations':genderTagList,
'city':state.city,
// 'lat': location.latitude,
// 'lng': location.longitude,
'nickname': state.textEditingController.text,
@ -322,3 +409,22 @@ class Complete_materialLogic extends GetxController {
}
}
class SysTag {
final int id;
final String tagName;
bool isSelect = false;
SysTag({
required this.id,
required this.tagName,
this.isSelect = false,
});
factory SysTag.fromJson(Map<String, dynamic> json) {
return SysTag(
id: json['id'],
tagName: json['tagName'],
);
}
}

View File

@ -10,6 +10,8 @@ class Complete_materialState {
String age = '';
String brithday = '';
String role = '';
String city = '';
String roleId = '';
String orientation = '';
String orientationId = '';

View File

@ -1,4 +1,5 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:circle_app/common/colors/app_color.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';
@ -45,6 +46,26 @@ class _Complete_materialPageState extends State<Complete_materialPage> {
centerTitle: '完善您的个人形象',
isBack: true,
isDiyBack: true,
actionWdiget: GestureDetector(
onTap: () {
if (controller.type == "user") {
// Navigator.pop(context);
controller.editInfo();
} else {
controller.checkInfo();
}
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14.sp),
gradient: AppColor.mainVerLinearGradient
),
width: 60.sp,
height: 28.sp,
alignment: Alignment.center,
child: Text('完成',style: TextStyle(color: Colors.white,fontSize: 15.sp),),
),
),
backPressed: () async {
final isBack = await Navigator.maybePop(context);
if (isBack) {
@ -52,253 +73,294 @@ class _Complete_materialPageState extends State<Complete_materialPage> {
Get.offNamed(AppRoutes.Login);
}
}),
backgroundColor: Colors.transparent,
body: GestureDetector(
onTap: () {
FocusManager.instance.primaryFocus?.unfocus();
},
child: SingleChildScrollView(
child: Container(
width: MediaQuery.of(context).size.width,
color: Colors.transparent,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
height: 20.sp,
),
GestureDetector(
onTap: () {
controller.getImageFile();
},
child: controller.headUrl == ''
? Image.asset(
getLoginImage('add'),
child: Stack(
alignment: Alignment.center,
children: [
SingleChildScrollView(
child: Container(
width: MediaQuery.of(context).size.width,
color: Colors.transparent,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
height: 20.sp,
),
GestureDetector(
onTap: () {
controller.getImageFile();
},
child: controller.headUrl == ''
? Image.asset(
getLoginImage('add'),
width: 86.sp,
height: 86.sp,
)
: ClipOval(
child: CachedNetworkImage(
fit: BoxFit.cover,
imageUrl: controller.headUrl,
width: 86.sp,
height: 86.sp,
)
: ClipOval(
child: CachedNetworkImage(
fit: BoxFit.cover,
imageUrl: controller.headUrl,
width: 86.sp,
height: 86.sp,
),
),
),
SizedBox(
height: 15.sp,
),
Text(
'数据表明95%的人对真实的头像更感兴趣',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 16.sp),
),
funcWidget(
'昵称',
TextField(
controller: controller.state.textEditingController,
),
),
SizedBox(
height: 15.sp,
),
Text(
'数据表明95%的人对真实的头像更感兴趣',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 14.sp),
decoration: InputDecoration(
hintText: '请输入昵称',
hintStyle: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 14.sp),
border: InputBorder.none,
),
fontSize: 16.sp),
),
() {},
img: 'edit'),
if (isShowWx)
funcWidget(
'微信',
TextField(
controller: controller.state.wxEditingController,
maxLength: 19,
inputFormatters: [
FilteringTextInputFormatter.deny(
RegExp("[^-_a-zA-Z0-9]")),
],
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 14.sp),
decoration: InputDecoration(
counterText: '',
hintText: '请输入微信号',
hintStyle: TextStyle(
funcWidget(
'昵称',
TextField(
controller: controller.state.textEditingController,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 14.sp),
border: InputBorder.none,
decoration: InputDecoration(
hintText: '请输入昵称',
hintStyle: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 14.sp),
border: InputBorder.none,
),
),
),
() {},
img: 'edit'),
funcWidget(
'属性',
Text(
controller.state.sex,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
), () {
showSexPiker(context, controller);
}),
funcWidget(
'年龄',
Text(
controller.state.age,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
), () {
showAgePiker(
context,
controller,
);
}),
funcWidget(
'角色',
Text(
controller.state.role,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
), () {
showRolePiker(context, controller);
}),
funcWidget(
'取向',
Text(
controller.state.orientation,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
), () {
showOrientationPiker(context, controller);
}),
funcWidget(
'兴趣',
() {},
img: 'edit'),
if (isShowWx)
funcWidget(
'微信',
TextField(
controller: controller.state.wxEditingController,
maxLength: 19,
inputFormatters: [
FilteringTextInputFormatter.deny(
RegExp("[^-_a-zA-Z0-9]")),
],
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 14.sp),
decoration: InputDecoration(
counterText: '',
hintText: '请输入微信号',
hintStyle: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 14.sp),
border: InputBorder.none,
),
),
() {},
img: 'edit'),
funcWidget(
'角色',
Text(
controller.state.sex,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
), () {
showSexPiker(context, controller);
}),
funcWidget(
'你想认识',
Container(
child: Row(
children: controller.watchGenderList.isNotEmpty
? [sexTagWdiget(controller)]
: [],
),
), () async {
},img: ''),
funcWidget(
'年龄',
Text(
controller.state.age,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
), () {
showAgePiker(
context,
controller,
);
}),
funcWidget(
'常驻城市',
Text(
controller.state.city,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
), () {
showCityPiker(context, controller);
}),
funcWidget(
'属性',
Text(
controller.state.role,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
), () {
showRolePiker(context, controller);
}),
funcWidget(
'取向',
Text(
controller.state.orientation,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
), () {
showOrientationPiker(context, controller);
}),
funcWidget(
'兴趣',
Container(
child: Row(
children: controller.numbers.isNotEmpty
? [interestWdiget('JK圈', controller)]
: [],
),
), () async {
var data = await Get.toNamed(
AppRoutes.SelectCircleActivity,
arguments: {
"interestMap": controller.configBean.interestMap,
'selectCircle': controller.numbers,
"isRodio": false
});
if (data != null) {
controller.numbers = data;
controller.update();
}
}),
Container(
child: Row(
children: controller.numbers.isNotEmpty
? [interestWdiget('JK圈', controller)]
: [],
),
), () async {
var data = await Get.toNamed(
AppRoutes.SelectCircleActivity,
arguments: {
"interestMap": controller.configBean.interestMap,
'selectCircle': controller.numbers,
"isRodio": false
});
if (data != null) {
controller.numbers = data;
controller.update();
}
}),
Container(
margin: EdgeInsets.only(
top: 24.sp,
bottom: 18.sp,
left: 28.sp,
right: 28.sp),
height: 116.sp,
width: Get.width - 50.sp,
child: Stack(
children: [
Image.asset(
getLoginImage('desc_bg'),
width: Get.width - 50.sp,
fit: BoxFit.fill,
),
Container(
margin:
margin: EdgeInsets.only(
top: 24.sp,
bottom: 18.sp,
left: 28.sp,
right: 28.sp),
height: 116.sp,
width: Get.width - 50.sp,
child: Stack(
children: [
Image.asset(
getLoginImage('desc_bg'),
width: Get.width - 50.sp,
fit: BoxFit.fill,
),
Container(
margin:
EdgeInsets.only(left: 15.sp, top: 15.sp,right: 10.sp),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'交友宣言',
style: TextStyle(
color: Colors.white, fontSize: 14.sp),
),
TextField(
maxLines: 3,
controller: controller
.state.descEditingController,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 14.sp),
decoration: InputDecoration(
hintText: '认真写一段交友宣言可以让您的个人形象更完善哦~',
// icon: Text('交友宣言:',style: TextStyle(color: Colors.white,fontSize: 14.sp,fontWeight: FontWeight.w500),),
// labelText: '交友宣言:认真写一段交友宣言可以让您的个人形象更完善哦~',
labelStyle: TextStyle(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'交友宣言',
style: TextStyle(
color: Colors.white, fontSize: 14.sp),
),
TextField(
maxLines: 3,
controller: controller
.state.descEditingController,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w600,
fontSize: 14.sp),
hintStyle: TextStyle(
color: Colors.white.withOpacity(0.5),
fontWeight: FontWeight.w500,
fontSize: 14.sp),
border: InputBorder.none,
contentPadding:
decoration: InputDecoration(
hintText: '认真写一段交友宣言可以让您的个人形象更完善哦~',
// icon: Text('交友宣言:',style: TextStyle(color: Colors.white,fontSize: 14.sp,fontWeight: FontWeight.w500),),
// labelText: '交友宣言:认真写一段交友宣言可以让您的个人形象更完善哦~',
labelStyle: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w600,
fontSize: 14.sp),
hintStyle: TextStyle(
color: Colors.white.withOpacity(0.5),
fontWeight: FontWeight.w500,
fontSize: 14.sp),
border: InputBorder.none,
contentPadding:
EdgeInsets.only(top: 4.sp,left:0.sp,right: 10.sp)),
inputFormatters: [
LengthLimitingTextInputFormatter(40)
inputFormatters: [
LengthLimitingTextInputFormatter(40)
],
)
],
)
],
)),
],
),
),
GestureDetector(
onTap: () {
if (controller.type == "user") {
// Navigator.pop(context);
controller.editInfo();
} else {
controller.checkInfo();
}
)),
],
),
),
SafeArea(
child: Container(
alignment: Alignment.center,
width: 133.sp,
height: 56.sp,
// controller.checkInfo();
},
child: Container(
alignment: Alignment.center,
width: 133.sp,
height: 56.sp,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image: AssetImage(getLoginImage('start_bg'))),
),
child: Text(
controller.type == "user" ? "完成" : '开启小圈之旅',
style: TextStyle(
color: const Color(0xff00FFF4),
fontSize: 16.sp,
fontWeight: FontWeight.w600),
),
),
)
],
),
)
],
),
),
),
),
// Positioned(
// bottom: 0 ,
// child: SafeArea(
//
// child: GestureDetector(
// onTap: () {
// if (controller.type == "user") {
// // Navigator.pop(context);
// controller.editInfo();
// } else {
// controller.checkInfo();
// }
//
// // controller.checkInfo();
// },
// child: Container(
// alignment: Alignment.center,
// width: 133.sp,
// height: 56.sp,
// decoration: BoxDecoration(
// image: DecorationImage(
// fit: BoxFit.fill,
// image: AssetImage(getLoginImage('start_bg'))),
// ),
// child: Text(
// controller.type == "user" ? "完成" : '开启小圈之旅',
// style: TextStyle(
// color: const Color(0xff00FFF4),
// fontSize: 16.sp,
// fontWeight: FontWeight.w600),
// ),
// ),
// ),
// ))
],
),
),
)
@ -312,7 +374,7 @@ class _Complete_materialPageState extends State<Complete_materialPage> {
{String img = 'down_arr'}) {
return Container(
width: Get.width,
padding: EdgeInsets.only(left: 28.sp, right: 28.sp),
padding: EdgeInsets.only(left: 20.sp, right: 20.sp),
height: 54.sp,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
@ -339,6 +401,7 @@ class _Complete_materialPageState extends State<Complete_materialPage> {
padding: EdgeInsets.only(left: 20.sp),
child: tipWidget,
)),
if (img.isNotEmpty)
Image.asset(
getLoginImage(img),
width: img == 'down_arr' ? 24.sp : 18.sp,
@ -394,7 +457,7 @@ class _Complete_materialPageState extends State<Complete_materialPage> {
),
child: Padding(
padding: EdgeInsets.only(
top: 2.sp, bottom: 2.sp, left: 15.sp, right: 15.sp),
left: 15.sp, right: 15.sp),
child: Center(
child: Text(
controller.numbers[index].name,
@ -413,6 +476,63 @@ class _Complete_materialPageState extends State<Complete_materialPage> {
);
}
sexTagWdiget(Complete_materialLogic controller) {
return Container(
height: 59.sp,
width: Get.width - 130.sp,
child: ListView.builder(
itemCount: controller.watchGenderList.length,
scrollDirection: Axis.horizontal,
padding: EdgeInsets.symmetric(vertical: 14.sp),
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
controller.watchGenderList[index].isSelect = !controller.watchGenderList[index].isSelect;
controller.update();
},
child: Container(
margin: EdgeInsets.only(right: 6.sp), // item
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14.0), //
gradient: const LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
),
color: const Color(0xFF392D53),
),
child: Container(
margin: EdgeInsets.all(0.5.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17.0),
// shape: BoxShape.circle,
color: controller.watchGenderList[index].isSelect ? Colors.transparent : const Color(0xFF392D53),
),
child: Padding(
padding: EdgeInsets.only(
left: 5.sp, right: 5.sp),
child: Center(
child: Text(
controller.watchGenderList[index].tagName,
style: TextStyle(
fontSize: 14.sp,
color: Colors.white,
),
),
),
),
),
), //
),
);
},
),
);
}
showSexPiker(context, Complete_materialLogic controller) {
FocusManager.instance.primaryFocus?.unfocus();
Pickers.showSinglePicker(context,
@ -462,6 +582,20 @@ class _Complete_materialPageState extends State<Complete_materialPage> {
);
}
showCityPiker(context, Complete_materialLogic controller) {
Pickers.showMultiLinkPicker(context,
pickerStyle: DefaultPickerStyle.dark(), data: controller.cityMap, columeNum: 2,
onConfirm: (List res, List<int> position){
print(res);
print(controller.cityMap[res[0]][res[1]][0]);
// controller.state.city = controller.cityMap[res[0]][res[1]][0];
controller.state.city = res[1];
controller.update();
}
);
}
showRolePiker(context, Complete_materialLogic controller) {
FocusManager.instance.primaryFocus?.unfocus();
Pickers.showSinglePicker(context,

View File

@ -42,6 +42,12 @@ class LoginLogic extends GetxController {
if (GetUtils.isPhoneNumber(loginPhone) && loginPhone.length == 11) {
isPhone = true;
}
if (sharedPreferences!.containsKey(SharedPreferencesHelper.firstLogin)) {
loginType = 1;
}
update();
}

View File

@ -43,6 +43,7 @@ class MinefragmentLogic extends GetxController {
} else {
isProxy = false;
}
getMode();
EventBusManager.on<CommentVipEvent>().listen((event) {
isVip.value = event.vip;

View File

@ -64,21 +64,47 @@ class MinefragmentPage extends StatelessWidget {
_buildAvatarRow(logic),
_friendsRow(logic),
GestureDetector(
onTap: () {
showRechargeDialog(logic);
onTapDown: (detail) {
if (detail.localPosition.dy > 100.0) {
showOKToast('相关特权需要在对应功能使用哦~');
if (logic.isVip.value == 0) {
showRechargeDialog(logic);
}
} else {
showRechargeDialog(logic);
}
},
child: Stack(children: [
logic.isProxy ? MyImageWidget1 : MyImageWidget,
Positioned(
top:(Platform.isIOS && Get.statusBarHeight < 60) ? 30.sp : 24.sp,
left: 78.sp,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("会员-微乐园贵宾",style: TextStyle(color: const Color(0xFFFFFFFF),fontSize: 16.sp),),
SizedBox(height: 4.sp,),
Text(logic.vipMsg,style: TextStyle(color: const Color(0x99FFFFFF),fontSize: 13.sp),),
],
top:24.sp,
child: Container(
width: Get.width,
padding: EdgeInsets.only(left: 20.sp,right: 50.sp),
height: 50.sp,
child: Row(
children: [
if (!logic.isProxy)
Image.asset(getHomeImage('mine_vip_icon'),width: 46.sp,),
SizedBox(width: !logic.isProxy ? 10.sp : 60.sp,),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("会员-微乐园贵宾",style: TextStyle(color: const Color(0xFFFFFFFF),fontSize: 16.sp),),
SizedBox(height: 4.sp,),
Text(logic.vipMsg,style: TextStyle(color: const Color(0x99FFFFFF),fontSize: 13.sp),),
],
),
),
if (!logic.isProxy)
SizedBox(width: 10.sp,),
if (!logic.isProxy)
Image.asset(getHomeImage(logic.isVip.value == 0 ? 'open_vip' : 'pay_vip'),height: 28.sp,),
],
),
)),
],),

View File

@ -332,10 +332,12 @@ class UserBean {
int role;
int orientation;
List<Interest> interests;
List orientations;
double lng;
double lat;
String? city;
bool isOnline;
int hide_wx_num;
DateTime? offlineTime;
String avatarThumb;
@ -349,6 +351,8 @@ class UserBean {
required this.signature,
required this.vip,
required this.gender,
required this.hide_wx_num,
required this.orientations,
required this.role,
required this.orientation,
required this.interests,
@ -363,6 +367,8 @@ class UserBean {
factory UserBean.fromJson(Map<String, dynamic> json) {
return UserBean(
id: json['id'],
hide_wx_num: json['hide_wx_num'] ?? 0,
orientations: json['orientations'] ?? [],
wx_num: json['wx_num'] ?? '',
nickname: json['nickname'],
avatar: json['avatar'],

View File

@ -4,6 +4,7 @@ import 'package:circle_app/common/Widgets/base_tip_widget.dart';
import 'package:circle_app/common/colors/app_color.dart';
import 'package:circle_app/common/const.dart';
import 'package:circle_app/main.dart';
import 'package:circle_app/network/api.dart';
import 'package:circle_app/view/notice.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -23,7 +24,7 @@ class UserinfoPage extends StatefulWidget {
}
class MyTabbedScreenState extends State<UserinfoPage>
with SingleTickerProviderStateMixin {
with SingleTickerProviderStateMixin, RouteAware {
late TabController _tabController;
late PageController _pageController;
@ -40,6 +41,33 @@ class MyTabbedScreenState extends State<UserinfoPage>
// _tabController
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
///
routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute);
}
void didPopNext() {
print('didPopNext');
if (logic.userId.isEmpty) {
logic.fetchUserInfo(Api.getUserInfo);
}
}
///
void didPush() {
print('didPopNext');
}
void didPop() {
print('didPop');
}
void _handleTabChange() {
//
//
@ -51,6 +79,7 @@ class MyTabbedScreenState extends State<UserinfoPage>
@override
void dispose() {
_tabController.dispose();
routeObserver.unsubscribe(this);
super.dispose();
}
@ -83,8 +112,9 @@ class MyTabbedScreenState extends State<UserinfoPage>
? "${logic.userInfoBean!.nickname}"
: "个人主页",
actionWdiget: logic.isMe ? GestureDetector(
onTap: () {
showAddWxPicker(logic.userInfoBean!.wx_num!.isNotEmpty ?? false);
onTap: () async{
await showAddWxPicker(logic.userInfoBean!.wx_num!.isNotEmpty ?? false,isHidden: logic.userInfoBean!.wx_num!.isNotEmpty ?? false,isWxHidden:logic.userInfoBean!.hide_wx_num == 1,);
logic.fetchUserInfo(Api.getUserInfo);
},
child:Stack(
alignment: Alignment.center,
@ -240,8 +270,8 @@ class MyTabbedScreenState extends State<UserinfoPage>
borderRadius: BorderRadius.circular(17.sp),
gradient: const LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
Color(0xff06F9FA),
Color(0xffDC5BFD),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
@ -272,8 +302,8 @@ class MyTabbedScreenState extends State<UserinfoPage>
borderRadius: BorderRadius.circular(17.sp),
gradient: const LinearGradient(
colors: [
Color(0xaaDC5BFD),
Color(0xaa06F9FA),
Color(0xffDC5BFD),
Color(0xff06F9FA),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,

View File

@ -190,8 +190,8 @@ class VisitorlistPage extends StatelessWidget {
Container(
margin: EdgeInsets.only(bottom: 40.sp),
child: Text(
"TA们也来看过你 \n"
"成为会员查看完整访客信息",
"TA们也喜欢你哦 \n"
"成为会员查看所有圈友信息",
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,

View File

@ -10,8 +10,10 @@ import 'package:get/get.dart';
class AddWxTip extends StatefulWidget {
bool isHaveWx;
bool isHidden;
bool isWxHidden;
// TODO: add state variables, methods and constructor params
AddWxTip(this.isHaveWx);
AddWxTip(this.isHaveWx, this.isHidden, this.isWxHidden);
@override
State<AddWxTip> createState() => _AddWxTipState();
@ -37,19 +39,16 @@ class _AddWxTipState extends State<AddWxTip> {
body: Center(
child: Container(
margin: EdgeInsets.only(left: 15.sp, right: 15.sp),
height: Get.height * 0.65,
child: Column(
children: [
Expanded(
child: Container(
width:Get.width - 30.sp,
width: Get.width - 30.sp,
decoration: BoxDecoration(
color: Color(0x99000000),
image: DecorationImage(
image: AssetImage(getHomeImage("wx_tip_bg")),
fit: BoxFit.fill,
),
),
@ -60,7 +59,6 @@ class _AddWxTipState extends State<AddWxTip> {
children: [
Expanded(
child: Container(
child: RawScrollbar(
radius: Radius.circular(20),
// isAlwaysShown: true,
@ -70,11 +68,15 @@ class _AddWxTipState extends State<AddWxTip> {
child: Column(
children: [
Container(
margin: EdgeInsets.only(top: 10.sp,bottom: 5.sp),
child: Image.asset(getHomeImage('wx_tip_title'),height: 18.sp,)),
margin: EdgeInsets.only(
top: 10.sp, bottom: 5.sp),
child: Image.asset(
getHomeImage('wx_tip_title'),
height: 18.sp,
)),
Container(
padding: EdgeInsets.only(left: 15.sp, right: 15.sp),
padding: EdgeInsets.only(
left: 15.sp, right: 15.sp),
child: Text(
desc,
style: TextStyle(
@ -85,7 +87,8 @@ class _AddWxTipState extends State<AddWxTip> {
),
)),
Container(
padding: EdgeInsets.only(left: 15.sp, right: 15.sp),
padding: EdgeInsets.only(
left: 15.sp, right: 15.sp),
child: Text(
tip,
style: TextStyle(
@ -101,22 +104,40 @@ class _AddWxTipState extends State<AddWxTip> {
),
)),
Container(
margin: EdgeInsets.only(top: 15.sp, right: 15.sp, left: 15.sp,bottom: 15.sp),
margin: EdgeInsets.only(
top: 15.sp,
right: 15.sp,
left: 15.sp,
bottom: 15.sp),
child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Expanded(child: Container()),
GestureDetector(
onTap: () async {
showOKToast('为了维护站内的社交环境,微信填写必须真实哦~');
if (widget.isHidden) {
var result = await DioManager()
.post(url: Api.updateWxNum, params: {'type': 1});
if (result['code'] == 200) {
Future.delayed(Duration(seconds: 2),() {showOKToast('填写微信成功');});
Get.back(result: '1');
var result = await DioManager().post(
url: Api.hideWxNum + (widget.isWxHidden ? 0 : 1).toString(),
);
if (result['code'] == 200) {
showOKToast('操作成功');
}
Get.back();
} else {
showOKToast('为了维护站内的社交环境,微信填写必须真实哦~');
var result = await DioManager().post(
url: Api.updateWxNum,
params: {'type': 1});
if (result['code'] == 200) {
Future.delayed(Duration(seconds: 2), () {
showOKToast('填写微信成功');
});
Get.back(result: '1');
}
}
},
child: Container(
alignment: Alignment.center,
@ -124,11 +145,16 @@ class _AddWxTipState extends State<AddWxTip> {
width: 100.sp,
decoration: BoxDecoration(
color: Colors.blue.withOpacity(0.9),
borderRadius: BorderRadius.circular(4.sp)),
borderRadius:
BorderRadius.circular(4.sp)),
child: Text(
'手机号即微信',
style:
TextStyle(color: Colors.white, fontSize: 14.sp),
widget.isHidden
? widget.isWxHidden
? '取消隐藏微信'
: '隐藏微信'
: '手机号即微信',
style: TextStyle(
color: Colors.white, fontSize: 14.sp),
),
),
),
@ -137,7 +163,7 @@ class _AddWxTipState extends State<AddWxTip> {
onTap: () {
showOKToast('为了维护站内的社交环境,微信填写必须真实哦~');
Get.back();
Get.toNamed(
Get.toNamed(
AppRoutes.Complete_materialPage,
arguments: "user",
);
@ -150,11 +176,12 @@ class _AddWxTipState extends State<AddWxTip> {
alignment: Alignment.center,
decoration: BoxDecoration(
gradient: AppColor.mainVerLinearGradient,
borderRadius: BorderRadius.circular(4.sp)),
borderRadius:
BorderRadius.circular(4.sp)),
child: Text(
widget.isHaveWx ? ' 更新微信 ':' 填写微信 ',
style:
TextStyle(color: Colors.white, fontSize: 14.sp),
widget.isHaveWx ? ' 更新微信 ' : ' 填写微信 ',
style: TextStyle(
color: Colors.white, fontSize: 14.sp),
),
),
),
@ -167,14 +194,13 @@ class _AddWxTipState extends State<AddWxTip> {
),
),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
Get.back();
},
child: Container(
margin: EdgeInsets.only(bottom: 5.sp,top: 10.sp),
margin: EdgeInsets.only(bottom: 5.sp, top: 10.sp),
alignment: Alignment.center,
child: Image.asset(
getHomeImage('wx_close'),
@ -196,7 +222,5 @@ class _AddWxTipState extends State<AddWxTip> {
title = data1['title'] ?? '';
tip = data1['tip'] ?? '';
setState(() {});
}
}

View File

@ -272,6 +272,6 @@ showJoinCiclePiker(String cicleId, String pirce, String oldPrice, int type,
Future showAddWxPicker(bool isHaveWx) {
return Get.bottomSheet(AddWxTip(isHaveWx),isScrollControlled: true,enableDrag: false);
Future showAddWxPicker(bool isHaveWx,{bool isHidden = false, bool isWxHidden = false}) {
return Get.bottomSheet(AddWxTip(isHaveWx,isHidden,isWxHidden),isScrollControlled: true,enableDrag: false);
}

View File

@ -1,5 +1,6 @@
import 'dart:io';
import 'package:circle_app/app/minefragment/logic.dart';
import 'package:circle_app/util/paymentUtil.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart';
@ -18,6 +19,8 @@ class Open_vip_tipPage extends StatelessWidget {
final logic = Get.put(Open_vip_tipLogic());
final state = Get.find<Open_vip_tipLogic>().state;
final mineLogic = Get.find<MinefragmentLogic>();
@override
Widget build(BuildContext context) {
List vipFuncList = [
@ -231,7 +234,7 @@ class Open_vip_tipPage extends StatelessWidget {
Color(0xffD739EA)
])),
child: Text(
'立即解锁',
mineLogic.isVip.toInt() > 0 ? '续费会员' : '立即开通',
style:
TextStyle(color: Colors.white, fontSize: 16.sp),
),

View File

@ -1,6 +1,7 @@
import 'dart:io';
import 'dart:convert';
import 'package:circle_app/app/home/logic.dart';
import 'package:circle_app/app/splash/binding.dart';
import 'package:circle_app/util/paymentUtil.dart';
import 'package:circle_app/common/values/pushconfig.dart';
@ -110,6 +111,8 @@ loginIM(String userId, String sig) async {
if (setC2CReceiveMessageOptRes.code == 0) {
//
}
var logic = Get.find<HomeLogic>();
logic.getUnreadSize();
}
}
@ -475,6 +478,7 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
// [](https://cloud.tencent.com/document/product/269/70746#callback)
listener: V2TimSDKListener(onConnectSuccess: () {
print('IM登录成功');
// loginIM();
}));
}

View File

@ -305,5 +305,8 @@ class Api {
//
static const circleTop = '/up-service/interest/top';
//
static const hideWxNum = '/user-service/hideWxNum/';
}

View File

@ -1,6 +1,7 @@
import 'dart:convert';
import 'dart:io';
import 'package:circle_app/common/errorcode.dart';
import 'package:circle_app/util/util.dart';
import 'package:dio/dio.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@ -45,14 +46,16 @@ class DioManager {
//
receiveTimeout: const Duration(seconds: 300),
));
_dio!.interceptors.add(LogInterceptor(responseBody: true,
_dio!.interceptors.add(LogInterceptor(
responseBody: true,
));
// _dio!.interceptors.add(ConnectivityInterceptor());
// _dio!.interceptors.add(ConnectivityInterceptor());
}
Future download(String urlPath,String savePath,ProgressCallback progressCallback)async{
return await _dio!.download(urlPath, savePath, onReceiveProgress : progressCallback);
Future download(String urlPath, String savePath,
ProgressCallback progressCallback) async {
return await _dio!
.download(urlPath, savePath, onReceiveProgress: progressCallback);
}
/// get请求
@ -74,14 +77,15 @@ class DioManager {
}
/// post
Future post<T>({required String url,
Map<String, dynamic>? params,
bool isAddTokenInHeader = true,
bool isShowErrorToast = true,
FormData? formData,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress}) async {
Future post<T>(
{required String url,
Map<String, dynamic>? params,
bool isAddTokenInHeader = true,
bool isShowErrorToast = true,
FormData? formData,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress}) async {
return await requestHttp<T>(url,
method: DioMethod.post,
isShowErrorToast: isShowErrorToast,
@ -116,7 +120,6 @@ class DioManager {
);
}
Future delete<T>({
required String url,
Map<String, dynamic>? params,
@ -140,18 +143,16 @@ class DioManager {
);
}
/// Dio request
Future requestHttp<T>(String url,
{DioMethod method = DioMethod.get,
Map<String, dynamic>? params,
bool isShowErrorToast = true,
bool isAddTokenInHeader = true,
FormData? formData,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress}) async {
Map<String, dynamic>? params,
bool isShowErrorToast = true,
bool isAddTokenInHeader = true,
FormData? formData,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress}) async {
const methodValues = {
DioMethod.get: 'get',
DioMethod.post: 'post',
@ -160,32 +161,28 @@ class DioManager {
};
var connectivityResult = await Connectivity().checkConnectivity();
if(connectivityResult == ConnectivityResult.none){
// showToast("");
if (connectivityResult == ConnectivityResult.none) {
// showToast("");
return {'code': 404, 'msg': '请检查网络连接是否正常'};
}
try {
Response response;
var options = Options();
bool isAgreemement = await getAgreemement();
if(isAgreemement){
options = Options(
method: methodValues[method], headers: {
if (isAgreemement) {
options = Options(method: methodValues[method], headers: {
"Authorization": await getAuthorization(),
'VersionName': await getVersionName(),
'VersionCode': await getVersionCode(),
'Platform': Platform.isIOS ? '1' : '0',
'OsVersion': await getDeviceId(),
'OsVersion': await getDeviceId(),
'Imei': await getImei(),
'Brand': await getBrand(),
});
}else{
options = Options(
method: methodValues[method], headers: {
} else {
options = Options(method: methodValues[method], headers: {
"Authorization": await getAuthorization(),
'VersionName': await getVersionName(),
'VersionCode': await getVersionCode(),
@ -193,7 +190,6 @@ class DioManager {
});
}
print(">>>>>$params");
/// ,.
@ -201,22 +197,23 @@ class DioManager {
/// : post FormData.
switch (method) {
case DioMethod.get:
response =
await _dio!.request(url, queryParameters: params, options: options);
response = await _dio!
.request(url, queryParameters: params, options: options);
break;
case DioMethod.post:
response = await _dio!.post(
url, data: params, cancelToken: cancelToken, options: options);
response = await _dio!.post(url,
data: params, cancelToken: cancelToken, options: options);
break;
case DioMethod.put:
response = await _dio!.put(url, data: json.encode(params), options: options);
response =
await _dio!.put(url, data: json.encode(params), options: options);
break;
case DioMethod.delete:
response =
await _dio!.delete(url, queryParameters: params, options: options);
response = await _dio!
.delete(url, queryParameters: params, options: options);
break;
default:
// formData参数params的参数
// formData参数params的参数
if (formData != null) {
response = await _dio!.post(url,
data: formData,
@ -233,6 +230,24 @@ class DioManager {
Map<String, dynamic> responseMap = json.decode(jsonStr);
if (responseMap["code"] == 5003 || responseMap["code"] == 30003) {
pushLoginPage();
} else {
switch (responseMap["code"]) {
case 1001:
case 4000:
case 4001:
case 4002:
case 4003:
case 4004:
case 4100:
case 4101:
case 4102:
case 5002:
case 5001:
case 5000:
pushLoginPage();
showOKToast(responseMap['msg']);
break;
}
}
return responseMap;
// switch(responseMap["code"]){
@ -307,12 +322,12 @@ class BaseResponse<T> {
BaseResponse({required this.code, required this.msg, required this.data});
isSuccess(){
return code==200;
isSuccess() {
return code == 200;
}
factory BaseResponse.fromJson(Map<String, dynamic> json,
T Function(dynamic) fromJsonData) {
factory BaseResponse.fromJson(
Map<String, dynamic> json, T Function(dynamic) fromJsonData) {
dynamic dataJson = json['data'];
T? data;
@ -320,7 +335,7 @@ class BaseResponse<T> {
if (dataJson is String) {
// dataJson String
// data
data = null; //
data = null; //
} else if (dataJson is Map<String, dynamic>) {
// dataJson Map<String, dynamic>
if (fromJsonData != null) {
@ -330,7 +345,7 @@ class BaseResponse<T> {
}
} else if (dataJson is List) {
data = fromJsonData(dataJson);
}else {
} else {
throw Exception('无效的数据格式。期望是 String 或 Map<String, dynamic> 类型。');
}
}
@ -341,9 +356,8 @@ class BaseResponse<T> {
data: data,
);
}
}
class ConnectivityInterceptor extends Interceptor {
@override
Future<void> onRequest(
@ -360,7 +374,6 @@ class ConnectivityInterceptor extends Interceptor {
}
}
class QnTokenData {
final String token;
final String cdnPrefix;
@ -374,5 +387,3 @@ class QnTokenData {
);
}
}

View File

@ -17,6 +17,7 @@ class SharedPreferencesHelper {
static const AGREEMENT = 'agreement';
static const String firstLogin = 'firstlogin';
static SharedPreferencesHelper? _instance;
static SharedPreferences? _preferences;

View File

@ -174,9 +174,13 @@ pushLoginPage() async {
sharedPreferences.clear();
sharedPreferences.setString(SharedPreferencesHelper.LOGINPHONE, loginPhone);
sharedPreferences.setBool(SharedPreferencesHelper.AGREEMENT, agreement);
sharedPreferences.setString(SharedPreferencesHelper.firstLogin, '1');
});
Get.offAllNamed(AppRoutes.Login);
if (AppRoutes.Login != Get.currentRoute) {
Get.offAllNamed(AppRoutes.Login);
}
}
String filterSensitiveWords(String input, List<String> sensitiveWords) {

View File

@ -14,7 +14,7 @@ void showFloatingButtonOverlay(
late OverlayEntry overlayEntry;
bool showMessage = false;
int countdownSeconds = 8; //
int countdownSeconds = 5; //
// Timer
late Timer countdownTimer;