android 冷启动 登录注册 完善资料 圈子列表(未做完) 闪屏页

This commit is contained in:
YangYuhao 2023-06-20 09:18:00 +08:00
parent c5b1140d1a
commit 8bfb1814ae
39 changed files with 1412 additions and 570 deletions

View File

@ -47,7 +47,7 @@ android {
applicationId "com.example.circle_app"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 19
minSdkVersion 21
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName

View File

@ -24,6 +24,8 @@
android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission
android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:label="circle_app"

View File

@ -4,9 +4,9 @@
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</item>
</layer-list>

View File

@ -4,9 +4,9 @@
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</item>
</layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../components/my_app_bar.dart';
import '../../router/app_routers.dart';
@ -260,7 +261,10 @@ class AccountPage extends StatelessWidget {
// ),
// ),
// ),
Container(
GestureDetector(onTap: (){
getAuthorization();
},
child: Container(
margin: EdgeInsets.only(
top: 40.0.sp, left: 72.0.sp, right: 72.0.sp),
height: 42.sp,
@ -277,7 +281,8 @@ class AccountPage extends StatelessWidget {
),
),
),
),
),)
,
],
),
),
@ -285,4 +290,9 @@ class AccountPage extends StatelessWidget {
),
);
}
Future<void> getAuthorization() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove("Authorization");
Get.toNamed(AppRoutes.Login);
}
}

View File

@ -1,7 +1,16 @@
import 'package:circle_app/router/app_routers.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import '../../util/device.dart';
import '../../util/util.dart';
import '../login/login/logic.dart';
import 'state.dart';
class BlacklistLogic extends GetxController {
final BlacklistState state = BlacklistState();
}

View File

@ -1,10 +1,152 @@
import 'package:circle_app/util/util.dart';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import 'state.dart';
class CircleLogic extends GetxController {
PageController pageController = PageController(initialPage: 1,viewportFraction: 0.8
);
PageController pageController = PageController(initialPage: 1, viewportFraction: 0.8);
InterestsBean circle = InterestsBean(lists: []);
final CircleState state = CircleState();
int page = 1;
@override
void onInit() async {
super.onInit();
var data = await DioManager.instance
.get(url: Api.getCircleInterests, params: {"page": page});
var bean = BaseResponse<InterestsBean>.fromJson(
data, (data) => InterestsBean.fromJson(data));
circle = bean.data!;
update();
}
loadMore() async {
page = page++;
var data = await DioManager.instance
.get(url: Api.getCircleInterests, params: {"page": page});
var bean = BaseResponse<InterestsBean>.fromJson(
data, (data) => InterestsBean.fromJson(data));
circle = bean.data!;
update();
}
outCircle(String interest_id,bool isStatus) async{
var data = await DioManager.instance.post(url: Api.outCrrcle+interest_id+"/join", params: {"status": isStatus?"0":"1"});
var bean = BaseResponse<String>.fromJson(data, (data) => data);
if (bean.code == 200) {
circle.lists.forEach((element) {
if(element.id.toString()==interest_id.toString()){
element.isJoin = !isStatus;
}
});
}
showToast(bean.msg);
}
}
class InterestsBean {
List<Circle> lists;
InterestsBean({required this.lists});
factory InterestsBean.fromJson(Map<String, dynamic> json) {
List<dynamic> listsJson = json['lists'];
List<Circle> lists = listsJson.map((e) => Circle.fromJson(e)).toList();
return InterestsBean(lists: lists);
}
}
class Circle {
int id;
String image;
String title;
String intro;
double amount;
double oldAmount;
String lastCalloutTime;
bool isJoin;
dynamic isLike;
int viewTotal;
int joinTotal;
List<JoinUser> lastJoinUsers;
Circle({
required this.id,
required this.image,
required this.title,
required this.intro,
required this.amount,
required this.oldAmount,
required this.lastCalloutTime,
required this.isJoin,
required this.isLike,
required this.viewTotal,
required this.joinTotal,
required this.lastJoinUsers,
});
factory Circle.fromJson(Map<String, dynamic> json) {
List<dynamic> lastJoinUsersJson = json['last_join_users'];
List<JoinUser> lastJoinUsers =
lastJoinUsersJson.map((e) => JoinUser.fromJson(e)).toList();
return Circle(
id: json['id'],
image: json['image'],
title: json['title'],
intro: json['intro'],
amount: json['amount'].toDouble(),
oldAmount: json['old_amount'].toDouble(),
lastCalloutTime: json['last_callout_time'],
isJoin: json['is_join'],
isLike: json['is_like'],
viewTotal: json['view_total'],
joinTotal: json['join_total'],
lastJoinUsers: lastJoinUsers,
);
}
}
class JoinUser {
int id;
String avatar;
String nickname;
JoinUser({
required this.id,
required this.avatar,
required this.nickname,
});
factory JoinUser.fromJson(Map<String, dynamic> json) {
return JoinUser(
id: json['id'],
avatar: json['avatar'],
nickname: json['nickname'],
);
}
}
class LastJoinUser {
int id;
String avatar;
String nickname;
LastJoinUser({
required this.id,
required this.avatar,
required this.nickname,
});
factory LastJoinUser.fromJson(Map<String, dynamic> json) {
return LastJoinUser(
id: json['id'],
avatar: json['avatar'],
nickname: json['nickname'],
);
}
}

View File

@ -16,10 +16,16 @@ class CirclePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetBuilder<CircleLogic>(builder: (logic) {
return Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
width: MediaQuery
.of(context)
.size
.width,
height: MediaQuery
.of(context)
.size
.height,
decoration: BoxDecoration(
color: Color(0xFF423055),
image: DecorationImage(
@ -45,10 +51,14 @@ class CirclePage extends StatelessWidget {
},
onIndexChanged: (index) {
controller.state.index = index;
if(index==logic.circle.lists.length-1){
logic.loadMore();
}
print(index.toString());
controller.update();
},
index: controller.state.index,
itemCount: 3,
itemCount: logic.circle.lists.length,
viewportFraction: 0.95,
// scale: 0.9,
loop: false,
@ -60,6 +70,7 @@ class CirclePage extends StatelessWidget {
}),
),
));
});
}
navigatorItem() {
@ -146,27 +157,24 @@ class CirclePage extends StatelessWidget {
));
}
_getPageByIndex(int index) {
_getPageByIndex(int myIndex) {
var bean =logic.circle.lists[myIndex];
TextSpan span = TextSpan(
text: '查看更多',
style: TextStyle(color: Color(0xFFFF4DF6), fontSize: 14.sp),
);
TextSpan descSpan = TextSpan(
text: '圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈',
text: bean.intro,
style: TextStyle(color: Colors.white, fontSize: 12.sp),
);
List<String> urlList = [
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp',
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp',
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp'
];
List<JoinUser> urlList = bean.lastJoinUsers;
List<Widget> widgets = [];
int index = 0;
urlList.forEach((element) {
widgets.add(Positioned(
left: 15.sp * index,
child: circleWidget(element),
child: circleWidget(element.avatar),
));
index++;
});
@ -196,12 +204,14 @@ class CirclePage extends StatelessWidget {
if (index == 0) {
return Container(
padding: EdgeInsets.only(left: 12.sp, right: 12.sp),
height: 72.sp,
height: 88.sp,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image: AssetImage(
getCircleImage('circle_desc')))),
child: Container(
margin: EdgeInsets.only(top: 12.sp),
child: Column(
children: [
Container(
@ -222,7 +232,8 @@ class CirclePage extends StatelessWidget {
Container(
height: 30.sp,
width: 30.0.sp +
15.sp * (widgets.length - 1.sp),
15.sp *
(widgets.length - 1.sp),
child: Stack(
children: widgets,
),
@ -231,7 +242,7 @@ class CirclePage extends StatelessWidget {
width: 8.sp,
),
Text(
'3.5万圈友',
bean.viewTotal.toString(),
style: TextStyle(
color: Colors.white,
fontSize: 12.sp),
@ -250,11 +261,12 @@ class CirclePage extends StatelessWidget {
),
],
),
),
);
} else if (index == 1) {
return vipDynamicItem();
return vipDynamicItem(bean);
} else {
return normalDynamicItem();
return normalDynamicItem(bean);
}
}),
),
@ -273,21 +285,42 @@ class CirclePage extends StatelessWidget {
child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Image.network(
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp',
Container(
width: 42.sp,
height: 42.sp,
fit: BoxFit.fill,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color(0xFF71F3F2),
Color(0xFFF558FF),
],
stops: [0.0365, 0.9427],
),
),
padding: EdgeInsets.all(1.sp),
child: ClipRRect(
borderRadius: BorderRadius.circular(8.0),
child: Image.network(
bean.image,
width: 40.sp,
height: 40.sp,
),
),
),
Expanded(
child: Container(
padding: EdgeInsets.only(left: 8.sp, top: 12.sp),
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(
left: 8.sp, top: 12.sp),
// alignment: Alignment.,
height: 72.sp,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'圈子名称',
bean.title,
style: TextStyle(
color: Colors.white,
fontSize: 18.sp,
@ -297,7 +330,8 @@ class CirclePage extends StatelessWidget {
height: 4.sp,
),
Text(
'35.6万人看过',
'${bean.joinTotal.toStringAsFixed(0)}万人看过',
textAlign: TextAlign.left,
style: TextStyle(
color: Color(0xff03FEFB),
fontSize: 12.sp,
@ -308,7 +342,8 @@ class CirclePage extends StatelessWidget {
)),
GestureDetector(
onTap: () {
Get.toNamed(AppRoutes.Login);
logic.outCircle(bean.id.toString(),bean.isJoin);
// Get.toNamed(AppRoutes.Login);
// Get.bottomSheet(tipWdiget(),
// Get.bottomSheet(Open_vip_tipPage(),
// isScrollControlled: true, enableDrag: false);
@ -323,7 +358,10 @@ class CirclePage extends StatelessWidget {
)),
Positioned(
top: 70.sp,
child: Image.asset(getCircleImage('circle_line'),width: Get.width,)),
child: Image.asset(
getCircleImage('circle_line'),
width: Get.width,
)),
Positioned(
bottom: 56.sp,
right: 0.sp,
@ -340,23 +378,19 @@ class CirclePage extends StatelessWidget {
}
///
vipDynamicItem() {
vipDynamicItem(Circle bean) {
Text descText = Text(
'圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介圈子介绍圈子介绍圈',
bean.intro,
style: TextStyle(color: Colors.white, fontSize: 14.sp),
);
List<String> urlList = [
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp',
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp',
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp'
];
List<JoinUser> urlList = bean.lastJoinUsers;
List<Widget> widgets = [];
int index = 0;
urlList.forEach((element) {
widgets.add(Positioned(
left: 12.sp * index,
child: circleWidget(element, width: 24),
child: circleWidget(element.avatar, width: 24),
));
index++;
});
@ -455,7 +489,8 @@ class CirclePage extends StatelessWidget {
padding:
EdgeInsets.only(left: 6.sp, right: 6.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(9.sp),
borderRadius: BorderRadius.circular(
9.sp),
gradient: const LinearGradient(
begin: Alignment(0.25, 0.5),
end: Alignment(0.75, 0.5),
@ -538,7 +573,8 @@ class CirclePage extends StatelessWidget {
Expanded(
child: Text(
'1位圈友已私聊',
style: TextStyle(color: Colors.white, fontSize: 12.sp),
style: TextStyle(color: Colors.white, fontSize: 12
.sp),
)),
Image.asset(
getCircleImage('chat'),
@ -556,9 +592,9 @@ class CirclePage extends StatelessWidget {
}
///
normalDynamicItem() {
normalDynamicItem(Circle bean) {
Text descText = Text(
'圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介绍圈子介圈子介绍圈子介绍圈',
bean.intro,
style: TextStyle(color: Colors.white, fontSize: 14.sp),
);
@ -665,7 +701,8 @@ class CirclePage extends StatelessWidget {
padding:
EdgeInsets.only(left: 6.sp, right: 6.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(9.sp),
borderRadius: BorderRadius.circular(
9.sp),
gradient: LinearGradient(
begin: Alignment(0.25, 0.5),
end: Alignment(0.75, 0.5),
@ -748,7 +785,8 @@ class CirclePage extends StatelessWidget {
Expanded(
child: Text(
'1位圈友已私聊',
style: TextStyle(color: Colors.white, fontSize: 12.sp),
style: TextStyle(color: Colors.white, fontSize: 12
.sp),
)),
Image.asset(
getCircleImage('chat'),

View File

@ -30,8 +30,6 @@ class FeedbackLogic extends GetxController {
void _setImageFileListFromFile(XFile pickedFile) {
PutController putController = PutController();
//
putController.addStatusListener((StorageStatus status) {
print('状态变化: 当前任务状态:$status');
});

View File

@ -24,7 +24,7 @@ class HelpLogic extends GetxController {
),
FaqItem(
question: '·发现图片或视频被人盗取了怎么办?',
answer: '答:立即举报,并向在线客户反应情况。\n重点:核实后会对其做出处理并要求删除相关内容~',
answer: '答:立即举报,并向在线客户反应情况。\n重点:核实后会对其做出处理并要求删除相关内容~',
),
//
];

View File

@ -1,4 +1,3 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';

View File

@ -1,22 +1,70 @@
import 'dart:io';
import 'package:circle_app/network/dio_manager.dart';
import 'package:circle_app/router/app_routers.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter_pickers/time_picker/model/pduration.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';
import '../../../network/api.dart';
import '../../../util/device.dart';
import '../../select_circle/logic.dart';
import '../login/logic.dart';
import 'state.dart';
class Complete_materialLogic extends GetxController {
final Complete_materialState state = Complete_materialState();
final ImagePicker _picker = ImagePicker();
var type = Get.arguments ?? "";
var storage = Storage();
var quToken = '';
var headUrl = '';
late ConfigBean configBean;
List<MyConfigData> numbers = [];
List<String> genderList = [];
List<String> orientationList = [];
List<String> roleList = [];
@override
void onInit() async {
var data =
await DioManager.instance.get(url: Api.getqiniuToken, params: {});
var bean = BaseResponse<QnTokenData>.fromJson(
data, (data) => QnTokenData.fromJson(data));
quToken = bean.data!.token.toString();
var data1 =
await DioManager.instance.get(url: Api.getCircleList, params: {});
var bean1 = BaseResponse<ConfigBean>.fromJson(
data1, (data1) => ConfigBean.fromJson(data1));
configBean = bean1.data!;
configBean.genderMap.forEach((key, value) {
genderList.add(value);
});
configBean.orientationMap.forEach((key, value) {
orientationList.add(value);
});
configBean.roleMap.forEach((key, value) {
roleList.add(value);
});
}
Future getImageFile() async {
try {
final XFile? pickedFile = await _picker.pickImage(
source: ImageSource.gallery,
);
// setState(() {
// _setImageFileListFromFile(pickedFile);
_setImageFileListFromFile(pickedFile!);
// });
} catch (e) {
// setState(() {
@ -25,23 +73,111 @@ class Complete_materialLogic extends GetxController {
}
}
checkInfo() {
void _setImageFileListFromFile(XFile pickedFile) {
SmartDialog.showLoading();
PutController putController = PutController();
putController.addStatusListener((StorageStatus status) {
if (status == StorageStatus.Success) {
headUrl = "http://qiniuyun.ikuayou.com/" + pickedFile.name;
print(headUrl);
update();
SmartDialog.dismiss();
}
print('状态变化: 当前任务状态:$status');
});
storage.putFile(File(pickedFile.path), quToken,
options: PutOptions(controller: putController, key: pickedFile.name));
}
checkInfo() async {
if (state.textEditingController.text.isEmpty) {
showToast('请输入您的昵称');
return;
} else if (state.sex.isEmpty) {
showToast('请选择您的属性');
return;
} else if (state.age.isEmpty) {
showToast('请选择您的年龄');
return;
} else if (state.role.isEmpty) {
showToast('请选择您的角色');
return;
} else if (state.role.isEmpty) {
showToast('请选择您的角色');
return;
} else if (state.orientation.isEmpty) {
showToast('请选择您的取向');
}else if (state.interest.isEmpty) {
return;
} else if (numbers.isEmpty) {
showToast('请选择您的兴趣');
// return;
} else if (state.descEditingController.text.isEmpty) {
showToast('请输入您的交友宣言');
return;
} else if (state.descEditingController.text.length < 5) {
showToast('您的交友宣言太短');
return;
}
if (headUrl == '') {
showToast('请上传头像');
return;
}
LatLng location = await getLocation();
List<String> interestsList = [];
numbers.forEach((element) {
interestsList.add(element.id);
});
var data = await DioManager.instance.put(url: Api.UpdataUserInfo, params: {
'avatar_url': headUrl,
'birthday': state.brithday,
'gender': state.genderId, //
'role': state.roleId, //Int
'interests': interestsList, //
'orientation': state.orientationId, //Int
'lat': location.latitude,
'lng': location.longitude,
'nickname': state.textEditingController.text,
'signature': state.descEditingController.text,
});
var bean = BaseResponse<String>.fromJson(data, (data) => data);
if (bean.code == 200) {
Get.toNamed(AppRoutes.Home);
}
}
editInfo() async {
Map<String, dynamic> params = Map();
if (numbers.length > 0) {
List<String> interestsList = [];
numbers.forEach((element) {
interestsList.add(element.id);
});
params['interests'] = interestsList;
}
if (!headUrl.isEmpty) {
params['avatar_url'] = headUrl;
}
if (!state.brithday.isEmpty) {
params['birthday'] = state.brithday;
}
if (!state.genderId.isEmpty) {
params['gender'] = state.genderId;
}
if (!state.roleId.isEmpty) {
params['role'] = state.roleId;
}
if (!state.orientationId.isEmpty) {
params['orientation'] = state.orientationId;
}
LatLng location = await getLocation();
params['lat'] = location.latitude;
params['lng'] = location.longitude;
params['nickname'] = state.textEditingController.text;
params['signature'] = state.descEditingController.text;
var data = await DioManager.instance.put(url: Api.UpdataUserInfo, params: params);
var bean = BaseResponse<String>.fromJson(data, (data) => data);
if (bean.code == 200) {
Get.back();
}
}
@ -50,7 +186,7 @@ class Complete_materialLogic extends GetxController {
}
//
String getAge(PDuration brt){
String getAge(PDuration brt) {
int age = 0;
DateTime dateTime = DateTime.now();
@ -64,11 +200,25 @@ class Complete_materialLogic extends GetxController {
age = yearNow - yearBirth; //
if (monthNow <= monthBirth) {
if (monthNow == monthBirth) {
if (dayOfMonthNow < dayOfMonthBirth) age--;//
if (dayOfMonthNow < dayOfMonthBirth) age--; //
} else {
age--;//
age--; //
}
}
return age.toString();
}
}
class QnTokenData {
final String token;
final String cdnPrefix;
QnTokenData({required this.token, required this.cdnPrefix});
factory QnTokenData.fromJson(Map<String, dynamic> json) {
return QnTokenData(
token: json['token'],
cdnPrefix: json['cdn_prefix'],
);
}
}

View File

@ -5,10 +5,14 @@ class Complete_materialState {
TextEditingController descEditingController = TextEditingController();
String nickName = '';
String sex = '';
String genderId = '';
String age = '';
String brithday = '';
String role = '';
String roleId = '';
String orientation = '';
String orientationId = '';
List<String> interest = [];
Complete_materialState() {

View File

@ -1,9 +1,9 @@
import 'package:circle_app/components/my_app_bar.dart';
import 'package:circle_app/router/app_routers.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart';
import 'package:flutter_pickers/pickers.dart';
import 'package:flutter_pickers/style/default_style.dart';
import 'package:flutter_pickers/style/picker_style.dart';
import 'package:flutter_pickers/time_picker/model/date_mode.dart';
import 'package:flutter_pickers/time_picker/model/pduration.dart';
import 'package:flutter_pickers/time_picker/model/suffix.dart';
@ -15,10 +15,10 @@ import 'logic.dart';
class Complete_materialPage extends StatelessWidget {
Complete_materialPage({Key? key}) : super(key: key);
final logic = Get.put(Complete_materialLogic());
// PickerStyle pickerStyle = PickerStyle();
@override
Widget build(BuildContext context) {
return GetBuilder(builder: (Complete_materialLogic controller) {
return Stack(
children: [
@ -54,10 +54,19 @@ class Complete_materialPage extends StatelessWidget {
onTap: () {
controller.getImageFile();
},
child: Image.asset(
child: controller.headUrl == ''
? Image.asset(
getLoginImage('add'),
width: 86.sp,
height: 86.sp,
)
: ClipOval(
child: Image.network(
fit: BoxFit.fill,
controller.headUrl,
width: 86.sp,
height: 86.sp,
),
),
),
SizedBox(
@ -101,16 +110,18 @@ class Complete_materialPage extends StatelessWidget {
showSexPiker(context, controller);
}),
funcWidget(
'年龄',
'生日',
Text(
controller.state.age,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
),
() {
showAgePiker(context,controller,);
), () {
showAgePiker(
context,
controller,
);
}),
funcWidget(
'角色',
@ -120,8 +131,7 @@ class Complete_materialPage extends StatelessWidget {
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
),
() {
), () {
showRolePiker(context, controller);
}),
funcWidget(
@ -132,16 +142,19 @@ class Complete_materialPage extends StatelessWidget {
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
),
() {
), () {
showOrientationPiker(context, controller);
}),
funcWidget(
'兴趣',
Row(
children: [interestWdiget('JK圈')],
children: [interestWdiget('JK圈',controller)],
),
() {}),
() async {
controller.numbers = await Get.toNamed(AppRoutes.SelectCircleActivity,arguments: controller.configBean.interestMap);
controller.update();
}),
Container(
margin: EdgeInsets.only(
top: 24.sp,
@ -180,10 +193,11 @@ class Complete_materialPage extends StatelessWidget {
),
GestureDetector(
onTap: () {
if(controller.type=="user"){
Navigator.pop(context);
}else{
controller.pushHome();
if (controller.type == "user") {
// Navigator.pop(context);
controller.editInfo();
} else {
controller.checkInfo();
}
// controller.checkInfo();
@ -198,7 +212,7 @@ class Complete_materialPage extends StatelessWidget {
image: AssetImage(getLoginImage('start_bg'))),
),
child: Text(
controller.type=="user"? "完成" : '开启小圈之旅',
controller.type == "user" ? "完成" : '开启小圈之旅',
style: TextStyle(
color: Color(0xff00FFF4),
fontSize: 16.sp,
@ -217,7 +231,6 @@ class Complete_materialPage extends StatelessWidget {
});
}
Widget funcWidget(
String leftStr, Widget tipWidget, GestureTapCallback callback,
{String img = 'down_arr'}) {
@ -243,7 +256,8 @@ class Complete_materialPage extends StatelessWidget {
shadows: [
Shadow(color: Color(0xffF657FF), blurRadius: 4.0.sp)
])),
Expanded(child: Padding(
Expanded(
child: Padding(
padding: EdgeInsets.only(left: 20.sp),
child: tipWidget,
)),
@ -271,43 +285,96 @@ class Complete_materialPage extends StatelessWidget {
);
}
interestWdiget(String interest) {
interestWdiget(String interest,Complete_materialLogic controller) {
return Container(
height: 21.sp,
padding: EdgeInsets.only(left: 12.sp, right: 12.sp),
margin: EdgeInsets.only(left: 10.sp),
alignment: Alignment.center,
height: 59.sp,
width: 240.sp,
child: ListView.builder(
itemCount: controller.numbers.length,
// item
scrollDirection: Axis.horizontal,
//
padding: EdgeInsets.symmetric(vertical: 18.sp),
//
itemBuilder: (context, index) {
return Container(
margin: EdgeInsets.only(right: 11.sp), // item
child: Container(
decoration: BoxDecoration(
border: Border.all(width: 1, color: Colors.white),
borderRadius: BorderRadius.circular(21.sp),
borderRadius: BorderRadius.circular(17.0), //
gradient: LinearGradient(
colors: [
Color(0xFFffffff),
Color(0xFFffffff),
],
),
color: Color(0xFF392D53),
),
child: Container(
margin: EdgeInsets.all(0.2.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17.0),
// shape: BoxShape.circle,
color: Color(0xFF392D53),
),
child: Padding(
padding: EdgeInsets.only(
top: 2.sp, bottom: 2.sp, left: 15.sp, right: 15.sp),
child: Center(
child: Text(
interest,
controller.numbers[index].name,
style: TextStyle(
color: Colors.white, fontSize: 11.sp, fontWeight: FontWeight.w500),
fontSize: 12.0,
color: Colors.white,
),
),
),
),
),
), //
);
},
),
);
// return Container(
// height: 21.sp,
// padding: EdgeInsets.only(left: 12.sp, right: 12.sp),
// margin: EdgeInsets.only(left: 10.sp),
// alignment: Alignment.center,
// decoration: BoxDecoration(
// border: Border.all(width: 1, color: Colors.white),
// borderRadius: BorderRadius.circular(21.sp),
// ),
// child: Text(
// interest,
// style: TextStyle(
// color: Colors.white, fontSize: 11.sp, fontWeight: FontWeight.w500),
// ),
// );
}
showSexPiker(context, Complete_materialLogic controller) {
Pickers.showSinglePicker(context,
pickerStyle:DefaultPickerStyle.dark(),
data: '男、女、MTF、FTM、CD、酷儿'.split(''),
selectData: controller.state.sex.isNotEmpty ? controller.state.sex : '', onConfirm: (p, position) {
pickerStyle: DefaultPickerStyle.dark(),
data: controller.genderList,
selectData: controller.state.sex.isNotEmpty
? controller.state.sex
: '', onConfirm: (p, position) {
controller.state.sex = p;
controller.state.genderId = controller.configBean.genderMap.keys.toList()[position];
controller.update();
});
}
showAgePiker(context, Complete_materialLogic controller) {
var date = PDuration.now();
PDuration currentDur = PDuration(year: date.year! - 18, month: date.month, day: date.day);
if (controller.state.brithday.isNotEmpty) {
}
PDuration currentDur =
PDuration(year: date.year! - 18, month: date.month, day: date.day);
if (controller.state.brithday.isNotEmpty) {}
Pickers.showDatePicker(
context,
pickerStyle:DefaultPickerStyle.dark(),
pickerStyle: DefaultPickerStyle.dark(),
// context,
//
mode: DateMode.YMD,
@ -317,12 +384,14 @@ class Complete_materialPage extends StatelessWidget {
// pickerStyle: pickerStyle,
//
selectDate: currentDur,
maxDate: PDuration(year: date.year! - 18, month: date.month, day: date.day),
minDate: PDuration(year: date.year! - 100, month: date.month, day: date.day),
maxDate:
PDuration(year: date.year! - 18, month: date.month, day: date.day),
minDate:
PDuration(year: date.year! - 100, month: date.month, day: date.day),
onConfirm: (p) {
String month = p.month! < 10 ? '0${p.month!}' : p.month!.toString();
String day = p.day! < 10 ? '0${p.day!}' : p.day!.toString();
var time ='${p.year}-${month}-${day}';
var time = '${p.year}-${month}-${day}';
controller.state.age = controller.getAge(p);
controller.state.brithday = time;
controller.update();
@ -333,21 +402,31 @@ class Complete_materialPage extends StatelessWidget {
showRolePiker(context, Complete_materialLogic controller) {
Pickers.showSinglePicker(context,
pickerStyle:DefaultPickerStyle.dark(),
data: 'Sado、Maso、Dom、Sub、Switch'.split(''),
selectData: controller.state.role.isNotEmpty ? controller.state.role : 'Sado', onConfirm: (p, position) {
pickerStyle: DefaultPickerStyle.dark(),
data: controller.roleList,
selectData: controller.state.role.isNotEmpty
? controller.state.role
: 'Sado', onConfirm: (p, position) {
controller.state.role = p;
controller.state.roleId = controller.configBean.roleMap.keys.toList()[position];
controller.update();
});
}
//
showOrientationPiker(context, Complete_materialLogic controller) {
Pickers.showSinglePicker(context,
pickerStyle:DefaultPickerStyle.dark(),
data: '异性恋、同性恋、双性恋、泛性恋、无性恋、智性恋、性单恋'.split(''),
selectData: controller.state.orientation.isNotEmpty ? controller.state.orientation : '异性恋', onConfirm: (p, position) {
pickerStyle: DefaultPickerStyle.dark(),
data: controller.orientationList,
selectData: controller.state.orientation.isNotEmpty
? controller.state.orientation
: '异性恋', onConfirm: (p, position) {
controller.state.orientation = p;
controller.state.orientationId = controller.configBean.orientationMap.keys.toList()[position];
controller.update();
});
}
}

View File

@ -1,14 +1,16 @@
import 'dart:async';
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';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../network/network.dart';
import '../../../network/api.dart';
import 'state.dart';
class LoginLogic extends GetxController {
@ -36,23 +38,18 @@ class LoginLogic extends GetxController {
});
}
}
Future<void> getCode() async {
try{
// var formData = Dio().options.contentType = 'application/x-www-form-urlencoded';
// formData = {"phone": phoneEditingController.text} as String;
var response = await dio.post('msg-service/sms/code/send', queryParameters: {"phone": phoneEditingController.text});
}catch(e){
if (e is DioException) {
print('DioException: ${e.message}');
print('DioException Error: ${e.error}');
print('DioException Response: ${e.response}');
} else {
print('Exception: $e');
var data = await DioManager.instance.post(url: Api.sendCode, params: {"phone": phoneEditingController.text});
var bean = BaseResponse<Data>.fromJson(data, (data) => Data.fromJson(data));
if(kDebugMode){
if(bean.code==200){
codeEditingController.text = bean.data!.code.toString();
update();
}
}
}
}
@override
void dispose() {
super.dispose();
@ -66,35 +63,54 @@ class LoginLogic extends GetxController {
if (codeEditingController.text == '') {
showToast('请输入验证码');
}
try{
var response = await dio.post('user-service/login/smscode', data: {"phone": phoneEditingController.text,"code":codeEditingController.text});
Map<String, dynamic> jsonData = jsonDecode(response.data.toString());
int code = jsonData['code'];
String msg = jsonData['msg'];
String authorization = jsonData['data']['Authorization'];
var data = await DioManager.instance.post(url: Api.login,params: {
"phone": phoneEditingController.text,
"code": codeEditingController.text
});
var bean = BaseResponse<LoginData>.fromJson(data, (data) => LoginData.fromJson(data));
if (bean.code == 200) {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('Authorization', authorization);
if(code == 200){
Get.toNamed(AppRoutes.Home);
prefs.setString('Authorization', bean.data!.Authorization.toString());
Get.offNamed(AppRoutes.Home);
return;
}else if(code == 30002){
Get.toNamed(AppRoutes.Complete_materialPage);
} else if (bean.code == 30002) {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('Authorization', bean.data!.Authorization.toString());
Get.offNamed(AppRoutes.Complete_materialPage);
return;
}
showToast(msg);
}catch(e){
if (e is DioException) {
print('DioException: ${e.message}');
print('DioException Error: ${e.error}');
print('DioException Response: ${e.response}');
} else {
print('Exception: $e');
}
}
showToast(bean.msg.toString());
// try {
// var response = await dio.post('user-service/login/smscode', data: {
// "phone": phoneEditingController.text,
// "code": codeEditingController.text
// });
// Map<String, dynamic> jsonData = jsonDecode(response.data.toString());
// int code = jsonData['code'];
// String msg = jsonData['msg'];
//
// String authorization = jsonData['data']['Authorization'];
// SharedPreferences prefs = await SharedPreferences.getInstance();
// prefs.setString('Authorization', authorization);
//
// if (code == 200) {
// Get.toNamed(AppRoutes.Home);
// return;
// } else if (code == 30002) {
// Get.toNamed(AppRoutes.Complete_materialPage);
// return;
// }
// showToast(msg);
// } catch (e) {
// if (e is DioException) {
// print('DioException: ${e.message}');
// print('DioException Error: ${e.error}');
// print('DioException Response: ${e.response}');
// } else {
// print('Exception: $e');
// }
// }
// Get.toNamed(AppRoutes.Complete_materialPage);
// if (!GetUtils.isPhoneNumber(phoneEditingController.text)) {
@ -102,3 +118,27 @@ class LoginLogic extends GetxController {
// }
}
}
class Data {
String? code;
Data({this.code});
factory Data.fromJson(Map<String, dynamic> json) {
return Data(
code: json['code'],
);
}
}
class LoginData {
String? Authorization;
LoginData({this.Authorization});
factory LoginData.fromJson(Map<String, dynamic> json) {
return LoginData(
Authorization: json['Authorization'] as String?,
);
}
}

View File

@ -1,5 +1,6 @@
import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
@ -63,6 +64,11 @@ class LoginPage extends StatelessWidget {
logic.update();
},
controller: logic.phoneEditingController,
keyboardType: TextInputType.phone,
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
FilteringTextInputFormatter.deny(RegExp('[^0-9]')),
],
maxLength: 11,
style: TextStyle(
color: Colors.white, fontSize: 16.sp),

View File

@ -1,7 +1,6 @@
import 'package:dio/dio.dart';
import 'package:get/get.dart';
import '../../network/network.dart';
import '../../router/app_routers.dart';
import 'state.dart';

View File

@ -1,6 +1,5 @@
import 'package:dio/dio.dart';
import '../../network/network.dart';
class MinefragmentState {
var hearUrl = "http://pics5.baidu.com/feed/622762d0f703918f751ba5e950ce8d915beec4c1.jpeg?token=ed435fd18c71cf7ca7a011acb70460f7";
@ -9,19 +8,19 @@ class MinefragmentState {
///Initialize variables
}
Future<void> request() async {
print("111111");
try{
var response = await dio.put('user-service/register/user/info', data: {});
print(response.data.toString());
}catch(e){
if (e is DioException) {
print('DioException: ${e.message}');
print('DioException Error: ${e.error}');
print('DioException Response: ${e.response}');
} else {
print('Exception: $e');
}
}
// print("111111");
// try{
// var response = await dio.put('user-service/register/user/info', data: {});
// print(response.data.toString());
// }catch(e){
// if (e is DioException) {
// print('DioException: ${e.message}');
// print('DioException Error: ${e.error}');
// print('DioException Response: ${e.response}');
// } else {
// print('Exception: $e');
// }
// }
}
}

View File

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

View File

@ -0,0 +1,49 @@
import 'package:get/get.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import 'state.dart';
class Select_circleLogic extends GetxController {
late Map<String, dynamic> interestMap = Get.arguments;
@override
void onInit() async {
interestMap.forEach((key, value) {
arrList.add(MyConfigData(key,value, false));
});
update();
}
final Select_circleState state = Select_circleState();
List<MyConfigData> arrList = <MyConfigData>[
];
List<MyConfigData> getItemList() {
return arrList;
}
}
class ConfigBean {
late Map<String, dynamic> genderMap;
late Map<String, dynamic> roleMap;
late Map<String, dynamic> orientationMap;
late Map<String, dynamic> interestMap;
ConfigBean.fromJson(Map<String, dynamic> json) {
genderMap = json['gender_map'];
roleMap = json['role_map'];
orientationMap = json['orientation_map'];
interestMap = json['interest_map'];
}
}
class MyConfigData {
String id ;
String name;
bool isSelect;
MyConfigData(this.id,this.name, this.isSelect);
}

View File

@ -0,0 +1,5 @@
class Select_circleState {
Select_circleState() {
///Initialize variables
}
}

View File

@ -0,0 +1,141 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../components/my_app_bar.dart';
import '../../util/util.dart';
import 'logic.dart';
class Select_circlePage extends StatelessWidget {
Select_circlePage({Key? key}) : super(key: key);
final logic = Get.find<Select_circleLogic>();
final state = Get.find<Select_circleLogic>().state;
@override
Widget build(BuildContext context) {
return GetBuilder(builder: (Select_circleLogic controller) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getBaseImage("home_back")),
fit: BoxFit.cover,
),
),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: MyAppBar(
centerTitle: '选择感兴趣的圈子',
actionWdiget: Text(
"提交",
style: TextStyle(color: Colors.white),
),
onPressed: () {
// showToast("提交");
List<MyConfigData> numbers = [];
controller.arrList.forEach((element) {
if(element.isSelect){
numbers.add(element);
}
});
if(numbers.length>0){
Navigator.pop(context, numbers);
}else{
showToast("请选择兴趣圈子");
}
},
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Container(
margin: EdgeInsets.only(top: 20.sp),
child: _reportAdapter(controller),
),
),
],
),
),
);
});
}
Widget _reportAdapter(Select_circleLogic controller) {
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
// crossAxisSpacing: 6.sp,
mainAxisSpacing: 10.sp,
childAspectRatio: 3,
),
itemCount: controller.getItemList().length,
shrinkWrap: true,
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: () {
controller.arrList[index].isSelect =
!controller.arrList[index].isSelect;
controller.update();
},
child: _getItemSelect(controller.arrList[index]),
);
},
);
}
Widget _getItemSelect(MyConfigData bean) {
if (bean.isSelect) {
return Container(
margin: EdgeInsets.only(left: 8.sp, right: 8.sp, top: 6.sp, bottom: 6.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20.sp),
gradient: LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
child: Center(
child: Text(
bean.name,
style: TextStyle(
color: Colors.white,
fontSize: 11.sp,
),
),
),
);
} else {
return Container(
margin: EdgeInsets.only(left: 8.sp, right: 8.sp, top: 6.sp, bottom: 6.sp),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20.0), //
border: Border.all(
color: Color(0xFF392D53),
),
color: Color(0xFF392D53),
),
child: Padding(
padding: EdgeInsets.only(
top: 0.sp, bottom: 0.sp, left: 15.sp, right: 15.sp),
child: Center(
child: Text(
bean.name,
style: TextStyle(
fontSize: 11.0,
color: Colors.white,
),
),
),
),
),
);
}
}
}

View File

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

View File

@ -0,0 +1,44 @@
import 'package:get/get.dart';
import '../../router/app_routers.dart';
import 'state.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import '../../util/device.dart';
import '../../util/util.dart';
import '../login/login/logic.dart';
class SplashLogic extends GetxController {
final SplashState state = SplashState();
@override
void onInit() async{
super.onInit();
if(getAuthorization()==''){
Get.toNamed(AppRoutes.Login);
}else{
var data =
await DioManager.instance.put(url: Api.refreshToken,params:{});
var bean = BaseResponse<LoginData>.fromJson(data, (data) => LoginData.fromJson(data));
if (bean.code == 200) {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('Authorization', bean.data!.Authorization.toString());
Get.offNamed(AppRoutes.Home);
return;
} else if (bean.code == 30002) {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('Authorization', bean.data!.Authorization.toString());
Get.offNamed(AppRoutes.Complete_materialPage);
return;
}
showToast(bean.msg.toString());
// Get.toNamed(AppRoutes.Home);
}
}
}

View File

@ -0,0 +1,5 @@
class SplashState {
SplashState() {
///Initialize variables
}
}

View File

@ -0,0 +1,28 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../util/util.dart';
import 'logic.dart';
class SplashPage extends StatelessWidget {
SplashPage() : super();
@override
Widget build(BuildContext context) {
return GetBuilder<SplashLogic>(builder: (logic) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getBaseImage("home_back")),
fit: BoxFit.cover,
),
),
child: Scaffold(
backgroundColor: Colors.transparent,
body: Container(),),
);
});
}
}

View File

@ -1,5 +1,6 @@
import 'package:circle_app/app/home/binding.dart';
import 'package:circle_app/app/home/view.dart';
import 'package:circle_app/app/splash/binding.dart';
import 'package:circle_app/router/app_pages.dart';
import 'package:circle_app/router/app_routers.dart';
import 'package:circle_app/util/util.dart';
@ -8,7 +9,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import 'network/network.dart';
import 'app/splash/view.dart';
void main() {
runApp(const MyApp());
@ -94,7 +96,7 @@ class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
//稿,dp
configureDio();
// configureDio();
return ScreenUtilInit(
designSize: const Size(375, 812),
minTextAdapt: true,
@ -102,9 +104,9 @@ class _MyAppState extends State<MyApp> {
builder: (context, child) {
return GetMaterialApp(
title: 'Flutter Demo',
initialBinding: HomeBinding(),
initialBinding: SplashBinding(),
getPages: AppPages.routes,
home: HomePage(),
home: SplashPage(),
);
});
}

View File

@ -0,0 +1,40 @@
import 'package:flutter/foundation.dart';
class Api {
static const baseUrl = kDebugMode ? 'http://192.168.3.55:2000/' : 'http://192.168.3.55:2000/';
//
static const sendCode = 'msg-service/sms/code/send';
//
static const login = 'user-service/login/smscode';
//token
static const getqiniuToken = 'up-service/oss/token';
//
static const UpdataUserInfo = 'user-service/register/user/info';
//
static const getCircleList = 'user-service/app/config';
//token
static const refreshToken = 'user-service/login/token/refresh';
//
static const getCircleInterests = 'up-service/interest/interests';
//
static const outCrrcle = 'up-service/interest/';
}

View File

@ -1,8 +1,12 @@
import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
const String baseUrl = '';
import '../util/device.dart';
import 'api.dart';
const String baseUrl = Api.baseUrl;
/// Dio
@ -37,6 +41,7 @@ class DioManager {
//
receiveTimeout: Duration(seconds: 30),
));
_dio!.interceptors.add(LogInterceptor(responseBody: true));
}
/// get请求
@ -58,8 +63,7 @@ class DioManager {
}
/// post
Future post<T>(
{required String url,
Future post<T>({required String url,
Map<String, dynamic>? params,
bool isAddTokenInHeader = true,
bool isShowErrorToast = true,
@ -77,6 +81,32 @@ class DioManager {
onReceiveProgress: onReceiveProgress);
}
/// put
Future put<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.put,
// put
isShowErrorToast: isShowErrorToast,
params: params,
formData: formData,
cancelToken: cancelToken,
onSendProgress: onSendProgress,
onReceiveProgress: onReceiveProgress,
);
}
/// Dio request
Future requestHttp<T>(String url,
{DioMethod method = DioMethod.get,
@ -96,18 +126,34 @@ class DioManager {
try {
Response response;
Options options = Options(
method: methodValues[method], headers: {
"Authorization": await getAuthorization(),
'version': await getDeviceId(),
'platform': Platform.isIOS ? '1' : '0',
'imei': await getImei(),
'brand': await getBrand(),
});
print(">>>>>"+params.toString());
/// ,.
/// get queryParameters data. FormData data
/// : post FormData.
switch (method) {
case DioMethod.get:
response = await _dio!.request(url,
queryParameters: params,
options: Options(method: methodValues[method], extra: {
'isAddTokenInHeader': isAddTokenInHeader,
'isShowErrorToast': isShowErrorToast
}));
response =
await _dio!.request(url, queryParameters: params, options: options);
break;
case DioMethod.post:
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);
break;
case DioMethod.delete:
response =
await _dio!.delete(url, queryParameters: params, options: options);
break;
default:
// formData参数params的参数
@ -119,12 +165,7 @@ class DioManager {
onReceiveProgress: onReceiveProgress);
} else {
response = await _dio!.request(url,
data: params,
cancelToken: cancelToken,
options: Options(method: methodValues[method], extra: {
'isAddToken': isAddTokenInHeader,
'isShowErrorToast': isShowErrorToast
}));
data: params, cancelToken: cancelToken, options: options);
}
}
// json转model
@ -141,12 +182,10 @@ class DioManager {
// String? errorMsg = isNetworkConnected
// ? e.requestOptions.extra["errorMsg"]
// : "网络连接断开,请检查网络设置";
return {
'code': 500, 'msg': '请求失败'};
return {'code': 500, 'msg': '请求失败'};
} catch (e) {
//
return {
'code': 500, 'msg': '请求异常'};
return {'code': 500, 'msg': '请求异常'};
}
}
//
@ -178,3 +217,20 @@ class DioManager {
// }
// }
}
class BaseResponse<T> {
int code;
String msg;
T? data;
BaseResponse({required this.code, required this.msg, required this.data});
factory BaseResponse.fromJson(Map<String, dynamic> json,
T Function(dynamic) fromJsonData) {
return BaseResponse(
code: json['code'],
msg: json['msg'],
data: json['data'] != null ? fromJsonData?.call(json['data']) : null,
);
}
}

View File

@ -1,76 +0,0 @@
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../util/device.dart';
final dio = Dio(); //
void configureDio() {
// BaseOptions设置默认配置
dio.options.baseUrl = 'http://192.168.3.55:2000/';
dio.options.connectTimeout = Duration(seconds: 5);
dio.options.receiveTimeout = Duration(seconds: 3);
//
//,
dio.interceptors.add(Interceptor());
// dio.interceptors.add(ErrorInterceptor());
// dio.interceptors.add(ResponceInterceptor());
//
dio.interceptors.add(LogInterceptor(responseBody: true));
dio.interceptors.add(InterceptorsWrapper(
onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
//
//
options.headers['Authorization'] = getAuthorization();
options.headers['version'] = getDeviceId();
if(Platform.isIOS){
options.headers['platform'] = '1';
}else if(Platform.isAndroid){
options.headers['platform'] = '0';
}
options.headers['imei'] = getImei();
options.headers['brand'] = getBrand();
//
// //
// options.queryParameters['key'] = 'value';
//
return handler.next(options);
},
onResponse: (Response response, ResponseInterceptorHandler handler) {
//
// ...
print("onResponse");
//
return handler.next(response);
},
onError: (DioException error, ErrorInterceptorHandler handler) {
//
// ...
print("onError");
//
return handler.next(error);
},
));
//
// (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
// client.badCertificateCallback = (X509Certificate cert, String host, int port) => true;
// // config the http client
// client.findProxy = (uri) {
// //proxy all request to localhost:8888
// return "PROXY http://192.168.3.55:2000"; //
// };
// // you can also create a new HttpClient to dio
// // return new HttpClient();
// };
// BaseOptions构造函数设置
}

View File

@ -28,10 +28,13 @@ import 'package:circle_app/app/photoinfo/binding.dart';
import 'package:circle_app/app/photoinfo/view.dart';
import 'package:circle_app/app/report/binding.dart';
import 'package:circle_app/app/report/view.dart';
import 'package:circle_app/app/select_circle/binding.dart';
import 'package:circle_app/app/select_circle/view.dart';
import 'package:circle_app/app/setup/binding.dart';
import 'package:circle_app/app/setup/view.dart';
import 'package:circle_app/app/login/complete_material/binding.dart';
import 'package:circle_app/app/login/complete_material/view.dart';
import 'package:circle_app/app/splash/binding.dart';
import 'package:circle_app/app/swiper/binding.dart';
import 'package:circle_app/app/swiper/view.dart';
import 'package:circle_app/app/text/binding.dart';
@ -40,9 +43,11 @@ import 'package:circle_app/app/userinfo/binding.dart';
import 'package:circle_app/app/userinfo/view.dart';
import 'package:circle_app/app/webview/binding.dart';
import 'package:circle_app/app/webview/view.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get_navigation/src/routes/get_route.dart';
import '../app/blacklist/view.dart';
import '../app/splash/view.dart';
import 'app_routers.dart';
class AppPages {
@ -54,7 +59,7 @@ class AppPages {
),
GetPage(
name: AppRoutes.Complete_materialPage,
page: () => Complete_materialPage(),
page: () => FlutterSmartDialog(child: Complete_materialPage(),),
binding: Complete_materialBinding(),
),
GetPage(
@ -148,5 +153,15 @@ class AppPages {
page: () => ChatPage(),
binding: ChatBinding(),
),
GetPage(
name: AppRoutes.SelectCircleActivity,
page: () => Select_circlePage(),
binding: Select_circleBinding(),
),
GetPage(
name: AppRoutes.SplashActivity,
page: () => SplashPage(),
binding: SplashBinding(),
),
];
}

View File

@ -20,4 +20,6 @@ abstract class AppRoutes {
static const OffAccountActivity = '/user/OffAccountActivity';
static const WebViewActivity = '/user/WebViewActivity';
static const Chat = '/chat';
static const SelectCircleActivity = '/user/SelectCircleActivity';
static const SplashActivity = '/user/SplashActivity';
}

View File

@ -1,7 +1,7 @@
import 'dart:io';
import 'package:device_info/device_info.dart';
import 'package:geolocator/geolocator.dart';
import 'package:shared_preferences/shared_preferences.dart';
Future<String> getDeviceId() async {
@ -10,10 +10,12 @@ Future<String> getDeviceId() async {
try {
if (Platform.isAndroid) {
var build = await deviceInfoPlugin.androidInfo;
deviceId = build.androidId; // Android
String version = build.version.release;
deviceId = version; // Android
} else if (Platform.isIOS) {
var data = await deviceInfoPlugin.iosInfo;
deviceId = data.identifierForVendor; // iOS
String version = data.systemVersion;
deviceId = version; // iOS
}
} catch (e) {
print('Failed to get device id: $e');
@ -21,12 +23,12 @@ Future<String> getDeviceId() async {
return deviceId;
}
Future<String> getImei() async{
Future<String> getImei() async {
String imei = "";
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
if (Platform.isAndroid) {
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
String imei = androidInfo.androidId;
imei = androidInfo.androidId;
// other specific Android data
} else if (Platform.isIOS) {
IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
@ -35,19 +37,49 @@ Future<String> getImei() async{
}
return imei;
}
Future<String> getBrand() async{
Future<String> getBrand() async {
String brand = '';
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
if(Platform.isIOS){
if (Platform.isIOS) {
IosDeviceInfo iosDeviceInfo = await deviceInfo.iosInfo;
brand = iosDeviceInfo.model;
}else if(Platform.isAndroid){
} else if (Platform.isAndroid) {
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
brand = androidInfo.model;
}
return brand;
}
Future<String> getAuthorization() async{
Future<LatLng> getLocation() async {
LatLng latLng = LatLng(latitude: 0.0, longitude: 0.0);;
try {
LocationPermission permission = await Geolocator.requestPermission();
if (permission == LocationPermission.whileInUse ||
permission == LocationPermission.always) {
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
);
print('Latitude: ${position.latitude}');
print('Longitude: ${position.longitude}');
latLng= LatLng(latitude: position.latitude, longitude: position.longitude);
} else {
print('Location permission denied');
}
} catch (e) {
print('Failed to get device or location info: $e');
}
return latLng;
}
class LatLng {
final double latitude;
final double longitude;
LatLng({required this.latitude, required this.longitude});
}
Future<String> getAuthorization() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString("Authorization") ?? "";
}

View File

@ -66,6 +66,10 @@ dependencies:
tencent_cloud_chat_uikit: ^2.0.0
#权限申请
permission_handler: ^10.3.0
#loading
flutter_smart_dialog: 4.9.2
#获取位置信息
geolocator: ^9.0.2
dev_dependencies:
flutter_test: