Compare commits

..

10 Commits

22 changed files with 850 additions and 333 deletions

View File

@ -65,8 +65,8 @@ android {
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21 minSdkVersion 21
targetSdkVersion flutter.targetSdkVersion targetSdkVersion flutter.targetSdkVersion
versionCode 2 versionCode 110
versionName "1.0.1" versionName "1.1.0"
manifestPlaceholders = [ manifestPlaceholders = [
vivo_APPID: "105669716", vivo_APPID: "105669716",
vivo_APPKEY:"84f750207787376b310ca5b0d5969122", vivo_APPKEY:"84f750207787376b310ca5b0d5969122",

View File

@ -1,9 +1,5 @@
[ [
{"name": "全国",
"city": [{
"name": "全国",
"area": ["全国"]
}]},
{ {
"name": "北京市", "name": "北京市",
"city": [ "city": [

View File

@ -56,6 +56,7 @@ class CircleLogic extends GetxController {
if (circle.lists.length < 20) { if (circle.lists.length < 20) {
isMore = false; isMore = false;
} }
update(); update();
} }
myVip = await getVip(); myVip = await getVip();
@ -224,11 +225,12 @@ class CircleLogic extends GetxController {
} }
void getBanner() async { void getBanner() async {
bannerList.clear();
var data = var data =
await DioManager.instance.get(url: Api.getNearbyBeanner, params: {}); await DioManager.instance.get(url: Api.getNearbyBeanner, params: {});
var bean = BaseResponse<BannerList>.fromJson( var bean = BaseResponse<BannerList>.fromJson(
data, (data) => BannerList.fromJson(data)); data, (data) => BannerList.fromJson(data));
bannerList.clear();
bannerList.addAll(bean.data.banners); bannerList.addAll(bean.data.banners);
cityName = bean.data.city; cityName = bean.data.city;
} }
@ -253,8 +255,10 @@ class CircleLogic extends GetxController {
orientationList.forEach((element) { orientationList.forEach((element) {
if (element.isSelect) orientations.add(element.id); if (element.isSelect) orientations.add(element.id);
}); });
if(offset==0){
getBanner();
}
// getBanner();
var data = await DioManager.instance.post(url: Api.postNearbyList, params: { var data = await DioManager.instance.post(url: Api.postNearbyList, params: {
"offset": offset, "offset": offset,
'deep': deep, 'deep': deep,
@ -271,13 +275,12 @@ class CircleLogic extends GetxController {
} catch (Exception) {} } catch (Exception) {}
if (vicinityPage == 1) { if (vicinityPage == 1) {
cityName = bean.data.city;
vicinityList.clear(); vicinityList.clear();
} }
try{ try{
vicinityList.addAll(bean.data.users); vicinityList.addAll(bean.data.users);
} catch(Exception){ } on Exception{}
}
if (vicinityPage == 1) { if (vicinityPage == 1) {
refreshController.refreshCompleted(); refreshController.refreshCompleted();
@ -384,11 +387,11 @@ class VicinityItemBean {
interests: interests, interests: interests,
images: List<String>.from(json['images']), images: List<String>.from(json['images']),
avatarThumb: json['avatar_thumb'], avatarThumb: json['avatar_thumb'],
genderName: json['genderName'], genderName: json['gender_name'],
roleName: json['roleName'], roleName: json['role_name'],
orientationName: json['orientationName'], orientationName: json['orientation_name'],
bgPicUrl: json['bgPicUrl'], bgPicUrl: json['bg_picUrl'],
onlineFlag: json['onlineFlag'], onlineFlag: json['online_flag'],
isOnline: json['isOnline'], isOnline: json['isOnline'],
); );
} }

View File

@ -8,6 +8,7 @@ import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_pickers/pickers.dart'; import 'package:flutter_pickers/pickers.dart';
import 'package:flutter_pickers/style/default_style.dart'; import 'package:flutter_pickers/style/default_style.dart';
import 'package:flutter_pickers/style/picker_style.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_swiper/flutter_swiper.dart'; import 'package:flutter_swiper/flutter_swiper.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -18,10 +19,8 @@ import '../select_circle/logic.dart';
import '../userinfo/logic.dart'; import '../userinfo/logic.dart';
import 'logic.dart'; import 'logic.dart';
const bgWidget = DecorationImage( const bgWidget = DecorationImage(
fit: BoxFit.fill, fit: BoxFit.fill, image: AssetImage('assets/images/base/home_back.png'));
image: AssetImage('assets/images/base/home_back.png'));
class CirclePage extends StatefulWidget { class CirclePage extends StatefulWidget {
CirclePage({Key? key}) : super(key: key); CirclePage({Key? key}) : super(key: key);
@ -76,9 +75,8 @@ class _CirclePageState extends State<CirclePage>
return Container( return Container(
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height, height: MediaQuery.of(context).size.height,
decoration: const BoxDecoration( decoration:
color: Color(0xFF423055), const BoxDecoration(color: Color(0xFF423055), image: bgWidget),
image: bgWidget),
child: Scaffold( child: Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
body: SafeArea( body: SafeArea(
@ -139,18 +137,20 @@ class _CirclePageState extends State<CirclePage>
controller: logic.refreshController, controller: logic.refreshController,
onRefresh: _onRefresh, onRefresh: _onRefresh,
onLoading: _onLoading, onLoading: _onLoading,
enablePullUp: logic.myVip>0, enablePullUp: logic.myVip > 0,
child: ListView.builder( child: ListView.builder(
padding: EdgeInsets.all(10.sp), padding: EdgeInsets.all(10.sp),
itemCount: logic.myVip == 0 ? logic.vicinityList.length + 2 : logic.vicinityList.length + 1, itemCount: logic.myVip == 0
? logic.vicinityList.length + 2
: logic.vicinityList.length + 1,
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == 0) { if (index == 0) {
return bannerView(controller); return bannerView(controller);
} else { } else {
if (logic.myVip == 0 && index == logic.vicinityList.length+1) { if (logic.myVip == 0 && index == logic.vicinityList.length + 1) {
return showVipView(); return showVipView();
} else { } else {
return ListItem(logic.vicinityList[index-1], index-1); return ListItem(logic.vicinityList[index - 1], index - 1);
} }
} }
}, },
@ -215,7 +215,7 @@ class _CirclePageState extends State<CirclePage>
Widget ListItem(VicinityItemBean item, int index) { Widget ListItem(VicinityItemBean item, int index) {
return GestureDetector( return GestureDetector(
onTap: (){ onTap: () {
Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString()); Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString());
}, },
child: Container( child: Container(
@ -238,12 +238,14 @@ class _CirclePageState extends State<CirclePage>
topLeft: Radius.circular(10.sp), topLeft: Radius.circular(10.sp),
topRight: Radius.circular(10.sp), topRight: Radius.circular(10.sp),
), ),
child: item.images.length==0? Image( child: item.images.length == 0
? Image(
image: AssetImage(getCircleImage("icon_list_null")), image: AssetImage(getCircleImage("icon_list_null")),
width: Get.width, width: Get.width,
fit: BoxFit.fill, fit: BoxFit.fill,
height: 92.sp, height: 92.sp,
):Container(), )
: Container(),
), ),
), ),
Column(children: [ Column(children: [
@ -278,15 +280,17 @@ class _CirclePageState extends State<CirclePage>
child: SingleChildScrollView( child: SingleChildScrollView(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
child: Container( child: Container(
margin: EdgeInsets.only(top: 6.sp), margin: EdgeInsets.only(top: 6.sp),
child: Row( child: Row(
children: [ children: [
for (int i = 0; i < item.images.length; i++) for (int i = 0; i < item.images.length; i++)
GestureDetector( GestureDetector(
onTap: (){ onTap: () {
Get.toNamed(AppRoutes.Swiper, Get.toNamed(AppRoutes.Swiper,
arguments: {'imaglist': item.images, 'index': i}); arguments: {
'imaglist': item.images,
'index': i
});
}, },
child: ListAlbumItem(item.images[i], i)), child: ListAlbumItem(item.images[i], i)),
], ],
@ -314,36 +318,32 @@ class _CirclePageState extends State<CirclePage>
const Spacer(), const Spacer(),
Container( Container(
margin: EdgeInsets.only(right: 8.sp), margin: EdgeInsets.only(right: 8.sp),
child:item.isOnline==1? Text( child: Text(
"当前在线", item.onlineFlag.toString(),
style: TextStyle( style: TextStyle(
color: const Color.fromRGBO(247, 250, 250, 1.0), color: const Color.fromRGBO(247, 250, 250, 1.0),
fontSize: 12.sp, fontSize: 12.sp,
), ),
):Container(), )),
),
], ],
), ),
), ),
Container( Container(
height: 50.sp, // height: 50.sp, //
width: Get.width, width: Get.width,
margin: EdgeInsets.symmetric( horizontal: 8.0), margin: EdgeInsets.symmetric(horizontal: 8.0),
child: Align( child: Align(
alignment: Alignment.centerLeft, // alignment: Alignment.centerLeft, //
child: Text( child: Text(
item.signature, item.signature,
maxLines: 2, maxLines: 2,
style: TextStyle(color: Colors.white,fontSize: 14.sp), style: TextStyle(color: Colors.white, fontSize: 14.sp),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
), ),
), ),
Container( Container(
margin: EdgeInsets.only(left: 8.sp,right: 3.sp), margin: EdgeInsets.only(left: 8.sp, right: 3.sp),
child: _buildInterestsListView(item.interests)) child: _buildInterestsListView(item.interests))
]), ]),
], ],
@ -408,11 +408,9 @@ class _CirclePageState extends State<CirclePage>
); );
} }
Widget _buildInfoRow(VicinityItemBean item) { Widget _buildInfoRow(VicinityItemBean item) {
String ageMsg = getAgeCOntent(item!.gender, item!.age, String ageMsg =
item!.role, item!.orientation); getAgeCOntent(item!.gender, item!.age, item!.role, item!.orientation);
return Row( return Row(
children: [ children: [
Container( Container(
@ -455,7 +453,12 @@ class _CirclePageState extends State<CirclePage>
Widget ListAlbumItem(String item, int index) { Widget ListAlbumItem(String item, int index) {
return Container( return Container(
margin: EdgeInsets.symmetric(horizontal: 2.sp), margin: EdgeInsets.symmetric(horizontal: 2.sp),
child: CachedNetworkImage( width: 88.sp, height: 88.sp, fit: BoxFit.cover, imageUrl: item+"?imageView2/1/w/176/h/176/q/75",), child: CachedNetworkImage(
width: 88.sp,
height: 88.sp,
fit: BoxFit.cover,
imageUrl: item + "?imageView2/1/w/176/h/176/q/75",
),
); );
} }
@ -464,38 +467,34 @@ class _CirclePageState extends State<CirclePage>
logic.offset = 0; logic.offset = 0;
logic.getNearByList(); logic.getNearByList();
// logic.refreshController.refreshCompleted(); // logic.refreshController.refreshCompleted();
} }
void _onLoading() async { void _onLoading() async {
if(logic.myVip>0){ if (logic.myVip > 0) {
logic.vicinityPage = logic.vicinityPage + 1; logic.vicinityPage = logic.vicinityPage + 1;
// logic.offset = 0;
// //
logic.getNearByList(); logic.getNearByList();
}else{ } else {
logic.refreshController.loadComplete(); logic.refreshController.loadComplete();
} }
} }
Widget bannerView(CircleLogic controller) { Widget bannerView(CircleLogic controller) {
return Container( return SizedBox(
height: 160.sp, height: 160.sp,
// margin: EdgeInsets.symmetric(horizontal: 16.sp), // margin: EdgeInsets.symmetric(horizontal: 16.sp),
child: Swiper( child: Swiper(
autoplay: logic.bannerList.length > 1, autoplay: logic.bannerList.length > 1,
controller: logic.swiperController, controller: logic.swiperController,
loop: logic.bannerList.length>1?true:false, autoplayDelay: 6000,
loop: logic.bannerList.length > 1 ? true : false,
// index:logic.index, // index:logic.index,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
// print(index);
return GestureDetector( return GestureDetector(
onTap: () async { onTap: () async {
print(logic.bannerList[index].param); // print(logic.bannerList[index].param);
Get.toNamed(AppRoutes.WebViewActivity, arguments: { navigateToCustomRoute(logic.bannerList[index]);
'title': "",
"url": logic.bannerList[index].param.toString()
});
}, },
child: SizedBox( child: SizedBox(
width: Get.width, width: Get.width,
@ -514,10 +513,10 @@ class _CirclePageState extends State<CirclePage>
margin: EdgeInsets.all(5.0.sp), // margin: EdgeInsets.all(5.0.sp), //
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
builder: DotSwiperPaginationBuilder( builder: DotSwiperPaginationBuilder(
color: Colors.white, // color: Color(0x00FFFFFF), //
activeColor: logic.bannerList.length == 1 activeColor: logic.bannerList.length == 1
? Color(0x00FFFFFF) ? Color(0x00FFFFFF)
: Color(0xFFFF4D7C), // : Color(0x00FFFFFF), //
), ),
), ),
// control: new SwiperControl(), //,线 // control: new SwiperControl(), //,线
@ -590,20 +589,64 @@ class _CirclePageState extends State<CirclePage>
left: 0, left: 0,
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
Get.toNamed(AppRoutes.VisitorListActivity); Get.toNamed(AppRoutes.Invite);
}, },
child: SizedBox( child: Container(
width: 30.sp * widgets.length, decoration: BoxDecoration(
height: 44.sp, borderRadius: BorderRadius.circular(17.0),
child: Stack( gradient: const LinearGradient(
alignment: Alignment.centerLeft, colors: [
children: widgets, Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
),
color: const Color(0xFF392D53),
),
child: Container(
margin: EdgeInsets.all(0.6.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17.0),
color: const Color(0xFF392D53),
),
child: Padding(
padding: EdgeInsets.only(
top: 5.sp,
bottom: 4.sp,
left: 8.sp,
right: 8.sp,
),
child: const Center(
child: Text(
"邀请得会员",
style: TextStyle(
fontSize: 11,
color: Colors.white,
), ),
), ),
), ),
) ),
),
),
))
// Positioned(
// left: 0,
// child: GestureDetector(
// onTap: () {
// Get.toNamed(AppRoutes.VisitorListActivity);
// },
// child: SizedBox(
// width: 30.sp * widgets.length,
// height: 44.sp,
// child: Stack(
// alignment: Alignment.centerLeft,
// children: widgets,
// ),
// ),
// ),
// )
: GestureDetector( : GestureDetector(
onTap: (){ onTap: () {
showCityPiker(context); showCityPiker(context);
}, },
child: Row( child: Row(
@ -615,7 +658,7 @@ class _CirclePageState extends State<CirclePage>
Container( Container(
margin: EdgeInsets.only(left: 4.sp, top: 4.sp), margin: EdgeInsets.only(left: 4.sp, top: 4.sp),
child: Text( child: Text(
logic.cityName, modifyCityName(logic.cityName),
style: style:
TextStyle(color: Colors.white, fontSize: 16.sp), TextStyle(color: Colors.white, fontSize: 16.sp),
)) ))
@ -653,7 +696,6 @@ class _CirclePageState extends State<CirclePage>
'发现', '发现',
style: TextStyle( style: TextStyle(
fontSize: 18.sp, fontSize: 18.sp,
), ),
), ),
), ),
@ -662,7 +704,6 @@ class _CirclePageState extends State<CirclePage>
'附近', '附近',
style: TextStyle( style: TextStyle(
fontSize: 18.sp, fontSize: 18.sp,
), ),
), ),
), ),
@ -676,7 +717,6 @@ class _CirclePageState extends State<CirclePage>
offset: Offset(0, -2), // offset: Offset(0, -2), //
blurRadius: 3, // blurRadius: 3, //
// spreadRadius: 0 // spreadRadius: 0
), ),
], ],
), ),
@ -763,8 +803,7 @@ class _CirclePageState extends State<CirclePage>
orientationList: logic.orientationList, orientationList: logic.orientationList,
roleList: logic.roleList, roleList: logic.roleList,
callback: (genderList, orientationList, roleList) { callback: (genderList, orientationList, roleList) {
logic.offset = 0; _onRefresh();
logic.getNearByList();
}, },
); // Use your custom widget here ); // Use your custom widget here
}, },
@ -995,19 +1034,18 @@ class _CirclePageState extends State<CirclePage>
); );
} }
showCityPiker(context) { showCityPiker(context) {
Pickers.showMultiLinkPicker(context, Pickers.showMultiLinkPicker(context,
pickerStyle: DefaultPickerStyle.dark(), data: logic.cityMap, columeNum: 2, pickerStyle: DefaultPickerStyle.dark(),
onConfirm: (List res, List<int> position){ data: logic.cityMap,
columeNum: 2, onConfirm: (List res, List<int> position) {
print(res); print(res);
// print(logic.cityMap[res[0]][res[1]][0]); // print(logic.cityMap[res[0]][res[1]][0]);
// controller.state.city = controller.cityMap[res[0]][res[1]][0]; // controller.state.city = controller.cityMap[res[0]][res[1]][0];
// logic.state.city = res[1]; // logic.state.city = res[1];
logic.cityName = res[1]; logic.cityName = res[1];
logic.offset = 0; _onRefresh();
logic.getNearByList();
// logic.getSuccess(); // logic.getSuccess();
// logic.update(); // logic.update();
} }
@ -1021,6 +1059,62 @@ class _CirclePageState extends State<CirclePage>
); );
} }
String modifyCityName(String cityName) {
if (cityName.endsWith("")) {
cityName = cityName.substring(0, cityName.length - 1);
}
if (cityName.length > 4) {
cityName = cityName.substring(0, 4) + "...";
}
return cityName;
}
}
class DefaultPickerStyle extends PickerStyle {
DefaultPickerStyle({bool haveRadius: false, String? title}) {
if (haveRadius) {
this.headDecoration = BoxDecoration(
color: Colors.white,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(10), topRight: Radius.circular(10)));
}
if (title != null && title != '') {
this.title = Center(
child:
Text(title, style: TextStyle(color: Colors.grey, fontSize: 14)));
}
}
///
DefaultPickerStyle.dark({bool haveRadius: false, String? title}) {
this.commitButton = Container(
alignment: Alignment.center,
padding: const EdgeInsets.only(left: 12, right: 22),
child: Text('确定', style: TextStyle(color: Colors.white, fontSize: 16.0)),
);
this.cancelButton = Container(
alignment: Alignment.center,
padding: const EdgeInsets.only(left: 22, right: 12),
child: Text('取消', style: TextStyle(color: Colors.white, fontSize: 16.0)),
);
this.headDecoration = BoxDecoration(
color: Color(0xFF4A3E5D),
borderRadius: !haveRadius
? null
: BorderRadius.only(
topLeft: Radius.circular(10), topRight: Radius.circular(10)));
if (title != null && title != '') {
this.title = Center(
child:
Text(title, style: TextStyle(color: Colors.white, fontSize: 14)));
}
this.backgroundColor = Color(0xFF4A3E5D)!;
this.textColor = Colors.white;
}
} }

View File

@ -2,7 +2,7 @@ import 'dart:io';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.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:flutter_screenutil/flutter_screenutil.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
@ -23,6 +23,7 @@ double myProgress = 0;
class _CustomDialogState extends State<UpdateDialog> { class _CustomDialogState extends State<UpdateDialog> {
bool isDownload = false; bool isDownload = false;
bool isShowWeb = false;
void incrementCounter() {} void incrementCounter() {}
@ -111,42 +112,78 @@ class _CustomDialogState extends State<UpdateDialog> {
onTap: () async { onTap: () async {
//incrementCounter(); //incrementCounter();
}, },
child: Container( child: Column(
margin: EdgeInsets.only(top: 24.sp), children: [
Container(
margin: EdgeInsets.only(top: 4.sp),
child: CircularProgressIndicator( child: CircularProgressIndicator(
value: myProgress, value: myProgress,
backgroundColor: Colors.grey, backgroundColor: Colors.grey,
valueColor: const AlwaysStoppedAnimation<Color>( valueColor:
const AlwaysStoppedAnimation<Color>(
Color(0xFF30FFD9)), Color(0xFF30FFD9)),
strokeWidth: 4.0.sp, strokeWidth: 4.0.sp,
), ),
), ),
GestureDetector(
onTap: () async {
final String appStoreUrl = widget.updateInfo
.downloadUrl; // App Store链接示例
if (await canLaunch(appStoreUrl)) {
await launch(appStoreUrl,
forceSafariVC: false);
} else {
throw 'Could not open App Store.';
}
},
child:isShowWeb? Container(
margin: EdgeInsets.only(top: 4.sp),
child: Text(
"下载太慢?试试游览器下载吧。",
style: TextStyle(
color: Colors.blue, //
decoration:
TextDecoration.underline, // 线
),
),
): Container(),
)
],
),
) )
: GestureDetector( : GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () async { onTap: () async {
if (Platform.isIOS) { if (Platform.isIOS) {
final String appStoreUrl = widget.updateInfo.downloadUrl; // App Store链接示例 final String appStoreUrl = widget
.updateInfo.downloadUrl; // App Store链接示例
if (await canLaunch(appStoreUrl)) { if (await canLaunch(appStoreUrl)) {
await launch(appStoreUrl,forceSafariVC : false); await launch(appStoreUrl,
forceSafariVC: false);
} else { } else {
throw 'Could not open App Store.'; throw 'Could not open App Store.';
} }
} else { } else {
final String appStoreUrl = widget
.updateInfo.downloadUrl; // App Store链接示例
final String appStoreUrl = widget.updateInfo.downloadUrl; // App Store链接示例 if (appStoreUrl.contains("apk")) {
if(appStoreUrl.contains("apk")){
updataApk(appStoreUrl); updataApk(appStoreUrl);
setDownloadUi(); setDownloadUi();
}else{ await Future.delayed(Duration(seconds: 10));
setState(() {
isShowWeb = true;
});
} else {
if (await canLaunch(appStoreUrl)) { if (await canLaunch(appStoreUrl)) {
await launch(appStoreUrl,forceSafariVC : false); await launch(appStoreUrl,
forceSafariVC: false);
} else { } else {
throw 'Could not open App Store.'; throw 'Could not open App Store.';
} }
} }
} }
//Navigator.pop(context); //Navigator.pop(context);
@ -188,12 +225,17 @@ class _CustomDialogState extends State<UpdateDialog> {
Positioned( Positioned(
right: 8.sp, right: 8.sp,
top: 8.sp, top: 8.sp,
child: widget.isDismiss? GestureDetector( child: widget.isDismiss
onTap: (){ ? GestureDetector(
onTap: () {
Navigator.pop(context); Navigator.pop(context);
}, },
child: Icon(Icons.close,color: Colors.white,size: 24.sp,)):Container()) child: Icon(
Icons.close,
color: Colors.white,
size: 24.sp,
))
: Container())
], ],
), ),
), ),
@ -218,7 +260,7 @@ class _CustomDialogState extends State<UpdateDialog> {
// SmartDialog.dismiss(); // SmartDialog.dismiss();
print(error); print(error);
}); });
// await AppInstaller.installApk(filePath, actionRequired: false); await AppInstaller.installApk(filePath, actionRequired: false);
} }
} }

View File

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:ffi'; import 'dart:ffi';
@ -18,6 +19,7 @@ import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import '../../util/eventBus.dart'; import '../../util/eventBus.dart';
import '../../view/notice.dart';
import '../circle/view.dart'; import '../circle/view.dart';
import '../dialog/UpdateDialog.dart'; import '../dialog/UpdateDialog.dart';
import '../minefragment/view.dart'; import '../minefragment/view.dart';
@ -58,7 +60,55 @@ class HomeLogic extends GetxController {
print("收到新消息" + text); print("收到新消息" + text);
unreadSIze.value = (int.parse(unreadSIze.value) + 1).toString(); unreadSIze.value = (int.parse(unreadSIze.value) + 1).toString();
//getUnreadSize(); //getUnreadSize();
}, onRecvC2CCustomMessage: (
String msgID,
V2TimUserInfo sender,
String customData,
) {
if (sender.userID == "qpqz_dev_10_10000000000" ||
sender.userID == "qpqz_prod_10_10000000000") {
if(customData.isEmpty){
return;
}
print("123123123123"+customData);
Map<String, dynamic> jsonData = json.decode(customData);
int event = jsonData['event'];
Map<String, dynamic> content = jsonData['content'];
switch(event){
case 1://
String ageMsg = "${content['genderName']}·${content['age']}·${content['roleName']}·${content['orientationName']}";
if(content['isFollow']==1){//
showFloatingButtonOverlay(Get.context!,content['nickname'],ageMsg,content['avatarThumb'],3,(){
pushChatPage(content['id'].toString(), content['imId'],
content['nickname']);
}); });
}else{
showFloatingButtonOverlay(Get.context!,content['nickname'],ageMsg,content['avatarThumb'],1,(){
setLike(content['id'].toString());
});
}
break;
case 2://线
String ageMsg = "${content['genderName']}·${content['age']}·${content['roleName']}·${content['orientationName']}";
showFloatingButtonOverlay(Get.context!,content['nickname'],ageMsg,content['avatarThumb'],2,(){
pushChatPage(content['id'].toString(), content['imId'],
content['nickname']);
});
break;
}
}
});
_messageService.addSimpleMsgListener(listener: msgListener); _messageService.addSimpleMsgListener(listener: msgListener);
var data = await DioManager.instance.get(url: Api.APP_VERSION); var data = await DioManager.instance.get(url: Api.APP_VERSION);
@ -68,7 +118,19 @@ class HomeLogic extends GetxController {
showReportDialog(Get.context!, bean.data.constraint == 0, bean.data); showReportDialog(Get.context!, bean.data.constraint == 0, bean.data);
} }
} }
setLike(String userId) async {
var data = await DioManager.instance.post(
url: "${Api.setLike + userId}/follow",
params: {'status': "1"});
var bean = BaseResponse<dynamic>.fromJson(
data,
(jsonData) => jsonData,
);
if (bean.isSuccess()) {
update();
}
showOKToast(bean.msg);
}
getUnreadSize() async { getUnreadSize() async {
V2TimValueCallback<int> getTotalUnreadMessageCountRes = V2TimValueCallback<int> getTotalUnreadMessageCountRes =
await TencentImSDKPlugin.v2TIMManager await TencentImSDKPlugin.v2TIMManager

View File

@ -26,13 +26,7 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin
super.build(context); super.build(context);
return GetBuilder(builder: (HomeLogic controller) { return GetBuilder(builder: (HomeLogic controller) {
return GestureDetector( return ExitAppConfirmation(child: Scaffold(
onTap: () {
controller.onReady();
// Get.toNamed(AppRoutes.Complete_materialPage);
},
child: ExitAppConfirmation(child: Stack(children: [
Scaffold(
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
// backgroundColor: Color.fromRGBO(244, 245, 245, 1.0), // backgroundColor: Color.fromRGBO(244, 245, 245, 1.0),
bottomNavigationBar: Container( bottomNavigationBar: Container(
@ -65,10 +59,7 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin
}, },
children: controller.tabs, children: controller.tabs,
), ),
), ),);
],),)
);
}); });
} }

View File

@ -40,6 +40,9 @@ class InvitePage extends StatelessWidget {
child: Image.asset(getMineImage('invite_right_icon'), child: Image.asset(getMineImage('invite_right_icon'),
), ),
), ),
onPressed: (){
navigateToInviteStrategy();
},
), ),
body: GetBuilder<InviteLogic>(builder: (logic) { body: GetBuilder<InviteLogic>(builder: (logic) {
List<Widget> peopleCountList = []; List<Widget> peopleCountList = [];

View File

@ -29,7 +29,7 @@ class MinefragmentLogic extends GetxController {
String enterHomeInfoMsg = "进入主页"; String enterHomeInfoMsg = "进入主页";
String joinedCircle = ""; String joinedCircle = "";
String vipMsg = "九大专属特权等你领取"; String vipMsg = "十几种专属特权等你领取";
@override @override
void onInit() async { void onInit() async {

View File

@ -64,12 +64,12 @@ class MinefragmentPage extends StatelessWidget {
child: Stack(children: [ child: Stack(children: [
MyImageWidget, MyImageWidget,
Positioned( Positioned(
top: 58.sp, top: 54.sp,
left: 90.sp, left: 72.sp,
child: Text(logic.vipMsg,style: TextStyle(color: const Color(0x99FFFFFF),fontSize: 12.sp),)), child: Text(logic.vipMsg,style: TextStyle(color: const Color(0x99FFFFFF),fontSize: 12.sp),)),
Positioned( Positioned(
top: 32.sp, top: 26.sp,
left: 90.sp, left: 70.sp,
child: Text("会员-微乐园贵宾",style: TextStyle(color: const Color(0xFFFFFFFF),fontSize: 16.sp),)) child: Text("会员-微乐园贵宾",style: TextStyle(color: const Color(0xFFFFFFFF),fontSize: 16.sp),))
],), ],),
), ),

View File

@ -211,6 +211,16 @@ class _TIMConversationState extends TIMUIKitState<TIMConversation> {
.where( .where(
(element) => (element?.groupID != null || element?.userID != null)) (element) => (element?.groupID != null || element?.userID != null))
.toList(); .toList();
// userID
String devtTargetUserID = "qpqz_dev_10_10000000000";
String prodTargetUserID = "qpqz_dev_10_10000000000";
filteredConversationList = filteredConversationList
.where((conversation) =>
conversation?.userID != devtTargetUserID ||conversation?.userID != prodTargetUserID)
.toList();
if (widget.conversationCollector != null) { if (widget.conversationCollector != null) {
filteredConversationList = filteredConversationList filteredConversationList = filteredConversationList
.where(widget.conversationCollector!) .where(widget.conversationCollector!)

View File

@ -252,8 +252,7 @@ class MsgPage extends StatelessWidget {
width: Get.width, width: Get.width,
child: Row( child: Row(
children: [ children: [
Container( Column(
child: Column(
children: [ children: [
Image.asset( Image.asset(
getMsgImage('msg_first'), getMsgImage('msg_first'),
@ -268,7 +267,6 @@ class MsgPage extends StatelessWidget {
), ),
], ],
), ),
),
Expanded( Expanded(
child: SingleChildScrollView( child: SingleChildScrollView(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,

View File

@ -23,8 +23,6 @@ class SplashLogic extends GetxController {
void onReady() async { void onReady() async {
// TODO: implement onReady // TODO: implement onReady
super.onReady(); super.onReady();
} }
@override @override
@ -32,19 +30,16 @@ class SplashLogic extends GetxController {
super.onInit(); super.onInit();
// await Future.delayed(Duration(seconds: 30)); // await Future.delayed(Duration(seconds: 30));
if ((await getAuthorization()).isEmpty) { if ((await getAuthorization()).isEmpty) {
if(Platform.isIOS){ if (Platform.isIOS) {
pushLoginPage(); pushLoginPage();
return; return;
} }
bool isAgreemement = await getAgreemement(); bool isAgreemement = await getAgreemement();
if(!isAgreemement){ if (!isAgreemement) {
showReportDialog(); showReportDialog();
}else{ } else {
pushLoginPage(); pushLoginPage();
} }
} else { } else {
var data = var data =
await DioManager.instance.put(url: Api.refreshToken, params: {}); await DioManager.instance.put(url: Api.refreshToken, params: {});
@ -65,7 +60,10 @@ class SplashLogic extends GetxController {
}); });
return; return;
} else if(bean.code == 5000||bean.code == 5001||bean.code == 5002||bean.code == 5003){ } else if (bean.code == 5000 ||
bean.code == 5001 ||
bean.code == 5002 ||
bean.code == 5003) {
pushLoginPage(); pushLoginPage();
return; return;
} }
@ -73,7 +71,7 @@ class SplashLogic extends GetxController {
if (bean.code == 500) { if (bean.code == 500) {
await Future.delayed(Duration(seconds: 5)); await Future.delayed(Duration(seconds: 5));
onInit(); onInit();
}else { } else {
pushLoginPage(); pushLoginPage();
} }
@ -81,7 +79,6 @@ class SplashLogic extends GetxController {
} }
} }
void showReportDialog() { void showReportDialog() {
FlutterNativeSplash.remove(); FlutterNativeSplash.remove();
showDialog( showDialog(

View File

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@ -15,6 +17,7 @@ import '../../util/SharedPreferencesHelper.dart';
import '../../util/eventBus.dart'; import '../../util/eventBus.dart';
import '../../util/qiniu.dart'; import '../../util/qiniu.dart';
import '../../util/util.dart'; import '../../util/util.dart';
import '../../view/notice.dart';
import '../dialog/BaseDialog.dart'; import '../dialog/BaseDialog.dart';
import 'state.dart'; import 'state.dart';
@ -41,6 +44,12 @@ class UserinfoLogic extends GetxController {
bool isDestroy = false; bool isDestroy = false;
final startTime = DateTime.now(); final startTime = DateTime.now();
SharedPreferences? sharedPreferences; SharedPreferences? sharedPreferences;
@override
void onClose() {
// TODO: implement onClose
timer?.cancel();
super.onClose();
}
@override @override
void onInit() async { void onInit() async {
@ -74,6 +83,10 @@ class UserinfoLogic extends GetxController {
fetchQnToken(Api.getqiniuToken); fetchQnToken(Api.getqiniuToken);
} }
void showBlackDialog(BuildContext context) { void showBlackDialog(BuildContext context) {
showDialog( showDialog(
context: context, context: context,
@ -98,6 +111,7 @@ class UserinfoLogic extends GetxController {
if (bean.isSuccess()) { if (bean.isSuccess()) {
isMe = userId.isEmpty; isMe = userId.isEmpty;
isLike = bean.data.isFollow; isLike = bean.data.isFollow;
isLikeFoMsg = isLikeFoMsg =
"${bean.data.likeMeCount}位圈友感兴趣,其中${bean.data.imageUrgeCount}位已催您更新"; "${bean.data.likeMeCount}位圈友感兴趣,其中${bean.data.imageUrgeCount}位已催您更新";
userInfoBean = bean.data.user; userInfoBean = bean.data.user;
@ -107,6 +121,9 @@ class UserinfoLogic extends GetxController {
if (isMe) { if (isMe) {
isOnline = true; isOnline = true;
} else { } else {
if(!isLike){
startCountdown();
}
isOnline = userInfoBean!.isOnline; isOnline = userInfoBean!.isOnline;
isBlackBeen = bean.data.isBlock; isBlackBeen = bean.data.isBlock;
isDestroy = bean.data.isDestroy; isDestroy = bean.data.isDestroy;
@ -130,6 +147,27 @@ class UserinfoLogic extends GetxController {
update(); update();
} }
int countdown = 5;
Timer? timer = null;
startCountdown(){
timer = Timer.periodic(const Duration(seconds: 1), (t) {
if (countdown > 0) {
countdown--;
} else {
showFloatingButtonOverlay(Get.context!,userInfoBean!.nickname!,ageMsg,userInfoBean!.avatarThumb,0,(){
setLike();
});
timer?.cancel(); //
}
});
}
Future<void> fetchMyAlbum(String url) async { Future<void> fetchMyAlbum(String url) async {
var myAlbumData = await DioManager.instance.get(url: url); var myAlbumData = await DioManager.instance.get(url: url);
var myAlbumBean = BaseResponse<AlbumResponseBean>.fromJson( var myAlbumBean = BaseResponse<AlbumResponseBean>.fromJson(
@ -196,6 +234,8 @@ class UserinfoLogic extends GetxController {
(jsonData) => jsonData, (jsonData) => jsonData,
); );
if (bean.isSuccess()) { if (bean.isSuccess()) {
timer?.cancel();
isLike = !isLike; isLike = !isLike;
update(); update();
} }

View File

@ -4,11 +4,11 @@ import 'package:circle_app/main.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import '../../components/my_app_bar.dart'; import '../../components/my_app_bar.dart';
import '../../router/app_routers.dart'; import '../../router/app_routers.dart';
import '../../util/util.dart'; import '../../util/util.dart';
import '../select_circle/logic.dart';
import 'logic.dart'; import 'logic.dart';
class UserinfoPage extends StatefulWidget { class UserinfoPage extends StatefulWidget {
@ -70,7 +70,9 @@ class MyTabbedScreenState extends State<UserinfoPage>
fit: BoxFit.cover, fit: BoxFit.cover,
), ),
), ),
child: Scaffold( child: Stack(
children: [
Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
appBar: MyAppBar( appBar: MyAppBar(
centerTitle: logic.userInfoBean != null centerTitle: logic.userInfoBean != null
@ -79,7 +81,6 @@ class MyTabbedScreenState extends State<UserinfoPage>
), ),
body: Stack( body: Stack(
children: [ children: [
Container( Container(
child: buildContent(logic), child: buildContent(logic),
), ),
@ -88,9 +89,28 @@ class MyTabbedScreenState extends State<UserinfoPage>
width: Get.width, width: Get.width,
child: _meInfoButton(logic), child: _meInfoButton(logic),
), ),
!logic.isShowAlbum &&logic.isMe ? Positioned(
bottom: 36.sp,
right: 10.sp,
child: GestureDetector(
onTap: () async {
List<MyConfigData> numbers = [];
var data = await Get.toNamed(
AppRoutes.Call_out,
arguments: {'numbers': numbers});
},
child: Image.asset(
getCircleImage('send_msg'),
width: 60.sp,
))):Container()
], ],
), ),
), ),
],
),
); );
} }
@ -172,7 +192,7 @@ class MyTabbedScreenState extends State<UserinfoPage>
final chatButton = GestureDetector( final chatButton = GestureDetector(
onTap: () { onTap: () {
if(logic.isBlack||logic.isDestroy||logic.isBlackBeen){ if (logic.isBlack || logic.isDestroy || logic.isBlackBeen) {
showOKToast("私聊失败,存在拉黑关系或者该账户已注销"); showOKToast("私聊失败,存在拉黑关系或者该账户已注销");
return; return;
} }
@ -267,7 +287,9 @@ class MyTabbedScreenState extends State<UserinfoPage>
), ),
), ),
SizedBox(width: 8.sp), SizedBox(width: 8.sp),
logic.isBlack||logic.isDestroy||logic.isBlackBeen?Container(): _buildInfoRow(controller), logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: _buildInfoRow(controller),
], ],
), ),
Row( Row(
@ -283,7 +305,9 @@ class MyTabbedScreenState extends State<UserinfoPage>
: const Color(0xFF787575), : const Color(0xFF787575),
), ),
), ),
logic.isBlack||logic.isDestroy||logic.isBlackBeen?Container(): Text( logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: Text(
controller.onLineCity, controller.onLineCity,
style: TextStyle( style: TextStyle(
fontSize: 12.sp, fontSize: 12.sp,
@ -299,7 +323,9 @@ class MyTabbedScreenState extends State<UserinfoPage>
), ),
SizedBox( SizedBox(
height: 59.sp, height: 59.sp,
child: logic.isBlack||logic.isDestroy||logic.isBlackBeen?Container(): _buildInterestsListView(interests), child: logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: _buildInterestsListView(interests),
), ),
titleTab(controller), titleTab(controller),
Expanded( Expanded(
@ -309,8 +335,12 @@ class MyTabbedScreenState extends State<UserinfoPage>
_tabController.animateTo(index); _tabController.animateTo(index);
}, },
children: [ children: [
logic.isBlack||logic.isDestroy||logic.isBlackBeen?Container():_imageAdapter(controller), logic.isBlack || logic.isDestroy || logic.isBlackBeen
logic.isBlack||logic.isDestroy||logic.isBlackBeen?Container(): HomeCallOutView(controller.userId), ? Container()
: _imageAdapter(controller),
logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: HomeCallOutView(controller.userId),
], ],
), ),
), ),
@ -327,7 +357,7 @@ class MyTabbedScreenState extends State<UserinfoPage>
itemBuilder: (context, index) { itemBuilder: (context, index) {
final interest = interests[index]; final interest = interests[index];
return GestureDetector( return GestureDetector(
onTap: (){ onTap: () {
Get.toNamed(AppRoutes.Signal_circle_list, Get.toNamed(AppRoutes.Signal_circle_list,
arguments: interests[index].id); arguments: interests[index].id);
}, },
@ -411,7 +441,9 @@ class MyTabbedScreenState extends State<UserinfoPage>
); );
}, },
), ),
logic.isBlack||logic.isDestroy||logic.isBlackBeen?Container(): GestureDetector( logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: GestureDetector(
onTap: () { onTap: () {
if (controller.isMe) { if (controller.isMe) {
controller.isEdit = !controller.isEdit; controller.isEdit = !controller.isEdit;
@ -599,7 +631,8 @@ class MyTabbedScreenState extends State<UserinfoPage>
const SizedBox(width: 6), const SizedBox(width: 6),
if (controller.isVip > 0) if (controller.isVip > 0)
Image( Image(
image: AssetImage(getBaseImage( controller.isVip == 1 ? "vip" : 'year_vip')), image: AssetImage(
getBaseImage(controller.isVip == 1 ? "vip" : 'year_vip')),
width: 44.sp, width: 44.sp,
height: 18.sp, height: 18.sp,
), ),

View File

@ -344,9 +344,9 @@ class _HomeCallOutViewState extends State<HomeCallOutView> with AutomaticKeepAli
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
lists.create_time!, "",
style: TextStyle( style: TextStyle(
color: Colors.white, fontSize: 12.sp), color: Colors.white, fontSize: 1.sp),
), ),
widget.userId.isNotEmpty widget.userId.isNotEmpty
? Container() ? Container()
@ -605,7 +605,7 @@ class _HomeCallOutViewState extends State<HomeCallOutView> with AutomaticKeepAli
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
lists.create_time!, "",
style: style:
TextStyle(color: Colors.white, fontSize: 12.sp), TextStyle(color: Colors.white, fontSize: 12.sp),
), ),

View File

@ -83,7 +83,7 @@ class Open_vip_tipPage extends StatelessWidget {
Positioned( Positioned(
top: 24.sp, top: 24.sp,
child: Text( child: Text(
'会员九大特权', '十几种专属会员特权',
style: TextStyle(color: Colors.white, fontSize: 16.sp), style: TextStyle(color: Colors.white, fontSize: 16.sp),
)), )),
Positioned( Positioned(

View File

@ -51,6 +51,15 @@ loginIM(String userId, String sig) async {
); );
if (info.code == 0) { if (info.code == 0) {
uploadBuzIDAndToken(); uploadBuzIDAndToken();
V2TimCallback setC2CReceiveMessageOptRes = await TencentImSDKPlugin
.v2TIMManager
.getMessageManager()
.setC2CReceiveMessageOpt(
userIDList: ['qpqz_dev_10_10000000000','qpqz_prod_10_10000000000'], // id列表
opt: ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE); //
if (setC2CReceiveMessageOptRes.code == 0) {
//
}
} }
} }
@ -434,8 +443,7 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
Widget build(BuildContext context) { Widget build(BuildContext context) {
//稿,dp //稿,dp
// configureDio(); // configureDio();
return return ScreenUtilInit(
ScreenUtilInit(
designSize: const Size(375, 812), designSize: const Size(375, 812),
minTextAdapt: true, minTextAdapt: true,
splitScreenMode: true, splitScreenMode: true,

View File

@ -45,7 +45,8 @@ class DioManager {
// //
receiveTimeout: const Duration(seconds: 300), 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());
} }

View File

@ -1,3 +1,4 @@
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:ui'; import 'dart:ui';
@ -13,6 +14,8 @@ import 'package:path_provider/path_provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:video_compress/video_compress.dart'; import 'package:video_compress/video_compress.dart';
import '../app/circle/logic.dart';
import '../app/select_circle/logic.dart';
import 'SharedPreferencesHelper.dart'; import 'SharedPreferencesHelper.dart';
class Util {} class Util {}
@ -154,8 +157,10 @@ String convertToTenThousand(int number) {
pushLoginPage() async { pushLoginPage() async {
await logoutIM(); await logoutIM();
SharedPreferencesHelper.getInstance().then((sharedPreferences) { SharedPreferencesHelper.getInstance().then((sharedPreferences) {
bool agreement = sharedPreferences.getBool(SharedPreferencesHelper.AGREEMENT)??false; bool agreement =
String loginPhone = sharedPreferences.getString(SharedPreferencesHelper.LOGINPHONE)??""; sharedPreferences.getBool(SharedPreferencesHelper.AGREEMENT) ?? false;
String loginPhone =
sharedPreferences.getString(SharedPreferencesHelper.LOGINPHONE) ?? "";
print(loginPhone); print(loginPhone);
sharedPreferences.clear(); sharedPreferences.clear();
sharedPreferences.setString(SharedPreferencesHelper.LOGINPHONE, loginPhone); sharedPreferences.setString(SharedPreferencesHelper.LOGINPHONE, loginPhone);
@ -278,10 +283,8 @@ class CustomLoadFooter extends StatelessWidget {
failedText: "加载失败", failedText: "加载失败",
); );
} }
} }
// //
Future<String> getApplicationDocumentsDirectoryPath() async { Future<String> getApplicationDocumentsDirectoryPath() async {
final directory = await getApplicationDocumentsDirectory(); final directory = await getApplicationDocumentsDirectory();
@ -306,8 +309,6 @@ Future<String> getLibraryDirectoryPath() async {
return directory.path; return directory.path;
} }
// //
void navigateToCodeOfConduct() { void navigateToCodeOfConduct() {
Get.toNamed(AppRoutes.WebViewActivity, arguments: { Get.toNamed(AppRoutes.WebViewActivity, arguments: {
@ -320,7 +321,9 @@ void navigateToCodeOfConduct() {
void navigateToUserAgreement() { void navigateToUserAgreement() {
Get.toNamed(AppRoutes.WebViewActivity, arguments: { Get.toNamed(AppRoutes.WebViewActivity, arguments: {
'title': "用户协议", 'title': "用户协议",
"url": Platform.isIOS?"https://docs.qq.com/doc/DZVV1SkttZGlPUW1H":"https://iquanpai.com/app-h5/4_163.html" "url": Platform.isIOS
? "https://docs.qq.com/doc/DZVV1SkttZGlPUW1H"
: "https://iquanpai.com/app-h5/4_163.html"
}); });
} }
@ -328,14 +331,19 @@ void navigateToUserAgreement() {
void navigateToPrivacyPolicy() { void navigateToPrivacyPolicy() {
Get.toNamed(AppRoutes.WebViewActivity, arguments: { Get.toNamed(AppRoutes.WebViewActivity, arguments: {
'title': "隐私协议", 'title': "隐私协议",
"url": Platform.isIOS?"https://docs.qq.com/doc/DZXhvcXV6b1RNTUx1":"https://iquanpai.com/app-h5/4_164.html" "url": Platform.isIOS
? "https://docs.qq.com/doc/DZXhvcXV6b1RNTUx1"
: "https://iquanpai.com/app-h5/4_164.html"
}); });
} }
// //
void navigateToContentGuidelines() { void navigateToContentGuidelines() {
Get.toNamed(AppRoutes.WebViewActivity, arguments: { Get.toNamed(AppRoutes.WebViewActivity, arguments: {
'title': "发布内容规范", 'title': "发布内容规范",
"url": Platform.isIOS?"https://docs.qq.com/doc/DZVhLamZDQnJ0eHds":"https://iquanpai.com/app-h5/4_165.html" "url": Platform.isIOS
? "https://docs.qq.com/doc/DZVhLamZDQnJ0eHds"
: "https://iquanpai.com/app-h5/4_165.html"
}); });
} }
@ -343,8 +351,57 @@ void navigateToContentGuidelines() {
void navigateToPartnerAgreement() { void navigateToPartnerAgreement() {
Get.toNamed(AppRoutes.WebViewActivity, arguments: { Get.toNamed(AppRoutes.WebViewActivity, arguments: {
'title': "合伙人协议", 'title': "合伙人协议",
"url": Platform.isIOS?"https://docs.qq.com/doc/DZUpwWFdNcGlsYld4":"https://iquanpai.com/app-h5/4_166.html" "url": Platform.isIOS
? "https://docs.qq.com/doc/DZUpwWFdNcGlsYld4"
: "https://iquanpai.com/app-h5/4_166.html"
}); });
} }
//
void navigateToInviteStrategy() {
Get.toNamed(AppRoutes.WebViewActivity, arguments: {
'title': "邀请攻略",
"url": "https://leyuan666.com/app-h5/4_168.html"
});
}
void navigateToCustomRoute(BannerItem bannerItem) {
print(bannerItem.param);
switch (bannerItem.type) {
case 1:
Get.toNamed(AppRoutes.WebViewActivity,
arguments: {'title': "", "url": bannerItem.param.toString()});
break;
case 2:
switch (bannerItem.scene) {
case "scene_2":
List<MyConfigData> numbers = [];
if(bannerItem.param!.isNotEmpty){
String paramJson = bannerItem.param.toString();
paramJson = paramJson.replaceAll(r'\', ''); //
Map<String, dynamic> jsonData = json.decode(paramJson);
numbers.add(MyConfigData(jsonData['id'].toString(), jsonData['name'], false));
}
Get.toNamed(AppRoutes.Call_out, arguments: {'numbers': numbers});
break;
case "scene_3":
Get.toNamed(AppRoutes.FeedbackActivity);
break;
}
break;
case 3:
switch (bannerItem.scene) {
case "scene_1":
Get.toNamed(AppRoutes.Invite);
break;
case "scene_4":
if(bannerItem.param!.isEmpty){
Get.toNamed(AppRoutes.UserInfoActivity);
}else{
Get.toNamed(AppRoutes.UserInfoActivity, arguments: bannerItem.param.toString());
}
break;
}
break;
}
}

View File

@ -0,0 +1,181 @@
import 'dart:async';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
typedef void NoticeCallback();
void showFloatingButtonOverlay(
BuildContext context, String nickname, String ageMsg, String avatar,int event,NoticeCallback noticeCallback) {
OverlayState? overlayState = Overlay.of(context);
late OverlayEntry overlayEntry;
bool showMessage = false;
int countdownSeconds = 8; //
// Timer
late Timer countdownTimer;
// OverlayEntry
overlayEntry = OverlayEntry(
builder: (BuildContext context) {
return Positioned(
top: 30,
// right: 16,
child: AnimatedContainer(
duration: const Duration(milliseconds: 500),
curve: Curves.easeInOut,
height: showMessage ? 95 : 0,
child: Container(
width: Get.width - 16,
margin: EdgeInsets.all(10.sp),
padding: EdgeInsets.fromLTRB(16.sp, 16.sp, 16.sp, 0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: const Color(0xFF353443),
),
child: SingleChildScrollView(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ClipOval(
child: CachedNetworkImage(
fit: BoxFit.cover,
placeholder: null,
imageUrl: avatar,
width: 48.sp,
height: 48.sp,
),
),
const SizedBox(width: 8),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
width: 50.sp,
child: Text(
nickname,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
color: Color.fromRGBO(247, 250, 250, 1.0),
fontSize: 14,
),
),
),
SizedBox(width: 8.sp),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: const LinearGradient(
colors: [
Color.fromRGBO(141, 255, 248, 1.0),
Color.fromRGBO(181, 211, 255, 1.0),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
padding: EdgeInsets.only(
top: 2.sp,
bottom: 2.sp,
left: 10.sp,
right: 10.sp,
),
child: Text(
ageMsg,
style: const TextStyle(
color: Colors.black,
fontSize: 10,
),
),
),
],
),
const SizedBox(height: 8),
Text( event == 0
? "看了这么久,给我点个喜欢呗~"
: event == 1
? "我喜欢了你,可以喜欢我一下吗?"
: event == 2
? "你喜欢的人上线啦,赶紧找他聊天吧!"
: "我也喜欢了你,一起聊聊呗~",
style: TextStyle(
color: Colors.grey,
fontSize: 12.sp,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
),
const Spacer(),
GestureDetector(
onTap: () {
countdownTimer.cancel(); //
overlayEntry.remove();
noticeCallback();
// logic.setLike();
// logic.showMessage = false;
// logic.update();
},
child: Container(
margin: EdgeInsets.only(top: 6.sp),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: const LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
padding: EdgeInsets.symmetric(
horizontal: 16.sp, vertical: 6.sp),
child: Text(
event == 0
? "喜欢"
: event == 1
? "回关"
: event == 2
? "私聊"
: "私聊",
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
),
),
),
),
// ),
],
),
),
),
),
);
},
);
// setState(() {});
showMessage = true;
countdownTimer = Timer.periodic(Duration(seconds: 1), (timer) {
if (countdownSeconds > 0) {
countdownSeconds--;
// overlayEntry.markNeedsBuild(); // OverlayEntry
} else {
timer.cancel(); //
overlayEntry.remove(); // OverlayEntry
}
});
// OverlayEntry Overlay
overlayState?.insert(overlayEntry);
}

View File

@ -93,7 +93,7 @@ dependencies:
#event_bus: #event_bus:
event_bus: ^2.0.0 event_bus: ^2.0.0
#安装apk #安装apk
# flutter_install_app: 1.3.0 flutter_install_app: 1.3.0
#闪屏页 #闪屏页
flutter_native_splash: 2.2.16 flutter_native_splash: 2.2.16
#腾讯离线推送 #腾讯离线推送
@ -142,6 +142,7 @@ flutter:
- assets/images/mine/ - assets/images/mine/
- assets/images/msg/ - assets/images/msg/
- assets/images/circle/ - assets/images/circle/
- assets/province.json
# - images/a_dot_ham.jpeg # - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see # An image asset can refer to one or more resolution-specific "variants", see