android 冷启动 登录注册 完善资料 圈子列表(未做完) 闪屏页
This commit is contained in:
parent
c5b1140d1a
commit
8bfb1814ae
@ -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
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
BIN
circle_app/android/app/src/main/res/mipmap-hdpi/launch_image.png
Normal file
BIN
circle_app/android/app/src/main/res/mipmap-hdpi/launch_image.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 280 KiB |
BIN
circle_app/android/app/src/main/res/mipmap-mdpi/launch_image.png
Normal file
BIN
circle_app/android/app/src/main/res/mipmap-mdpi/launch_image.png
Normal file
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 |
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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'],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -16,50 +16,61 @@ class CirclePage extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
|
||||
width: MediaQuery.of(context).size.width,
|
||||
height: MediaQuery.of(context).size.height,
|
||||
decoration: BoxDecoration(
|
||||
color: Color(0xFF423055),
|
||||
image: DecorationImage(
|
||||
fit: BoxFit.fill,
|
||||
image: AssetImage(getBaseImage('home_back')))),
|
||||
// child: Image.asset(
|
||||
// getBaseImage('bg'),
|
||||
// fit: BoxFit.fill,
|
||||
// ),
|
||||
child: Scaffold(
|
||||
backgroundColor: Colors.transparent,
|
||||
body: SafeArea(
|
||||
child: GetBuilder(builder: (CircleLogic controller) {
|
||||
return Container(
|
||||
child: Column(children: [
|
||||
navigatorItem(),
|
||||
Text(controller.state.msg),
|
||||
//组件使用
|
||||
Expanded(
|
||||
child: Swiper(
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return _getPageByIndex(index);
|
||||
},
|
||||
onIndexChanged: (index) {
|
||||
controller.state.index = index;
|
||||
controller.update();
|
||||
},
|
||||
index: controller.state.index,
|
||||
itemCount: 3,
|
||||
viewportFraction: 0.95,
|
||||
// scale: 0.9,
|
||||
loop: false,
|
||||
// pagination: new SwiperPagination(),//如果不填则不显示指示点
|
||||
// control: new SwiperControl(),//如果不填则不显示左右按钮
|
||||
))
|
||||
]),
|
||||
);
|
||||
}),
|
||||
),
|
||||
));
|
||||
return GetBuilder<CircleLogic>(builder: (logic) {
|
||||
return Container(
|
||||
width: MediaQuery
|
||||
.of(context)
|
||||
.size
|
||||
.width,
|
||||
height: MediaQuery
|
||||
.of(context)
|
||||
.size
|
||||
.height,
|
||||
decoration: BoxDecoration(
|
||||
color: Color(0xFF423055),
|
||||
image: DecorationImage(
|
||||
fit: BoxFit.fill,
|
||||
image: AssetImage(getBaseImage('home_back')))),
|
||||
// child: Image.asset(
|
||||
// getBaseImage('bg'),
|
||||
// fit: BoxFit.fill,
|
||||
// ),
|
||||
child: Scaffold(
|
||||
backgroundColor: Colors.transparent,
|
||||
body: SafeArea(
|
||||
child: GetBuilder(builder: (CircleLogic controller) {
|
||||
return Container(
|
||||
child: Column(children: [
|
||||
navigatorItem(),
|
||||
Text(controller.state.msg),
|
||||
//组件使用
|
||||
Expanded(
|
||||
child: Swiper(
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return _getPageByIndex(index);
|
||||
},
|
||||
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: logic.circle.lists.length,
|
||||
viewportFraction: 0.95,
|
||||
// scale: 0.9,
|
||||
loop: false,
|
||||
// pagination: new SwiperPagination(),//如果不填则不显示指示点
|
||||
// control: new SwiperControl(),//如果不填则不显示左右按钮
|
||||
))
|
||||
]),
|
||||
);
|
||||
}),
|
||||
),
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
navigatorItem() {
|
||||
@ -128,45 +139,42 @@ class CirclePage extends StatelessWidget {
|
||||
circleWidget(String url, {double width = 30}) {
|
||||
return GestureDetector(
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
getCircleImage('avatar_bg'),
|
||||
width: width.sp,
|
||||
),
|
||||
ClipOval(
|
||||
child: Image.network(
|
||||
url,
|
||||
width: (width - 1).sp,
|
||||
height: (width - 1).sp,
|
||||
fit: BoxFit.fill,
|
||||
),
|
||||
)
|
||||
],
|
||||
));
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
getCircleImage('avatar_bg'),
|
||||
width: width.sp,
|
||||
),
|
||||
ClipOval(
|
||||
child: Image.network(
|
||||
url,
|
||||
width: (width - 1).sp,
|
||||
height: (width - 1).sp,
|
||||
fit: BoxFit.fill,
|
||||
),
|
||||
)
|
||||
],
|
||||
));
|
||||
}
|
||||
|
||||
_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,65 +204,69 @@ 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: Column(
|
||||
children: [
|
||||
Container(
|
||||
width: Get.width,
|
||||
child: RichText(
|
||||
overflow: TextOverflow.fade,
|
||||
maxLines: 2,
|
||||
text: TextSpan(children: <InlineSpan>[
|
||||
descSpan,
|
||||
span
|
||||
])),
|
||||
),
|
||||
Container(
|
||||
child: Row(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
height: 30.sp,
|
||||
width: 30.0.sp +
|
||||
15.sp * (widgets.length - 1.sp),
|
||||
child: Stack(
|
||||
children: widgets,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 8.sp,
|
||||
),
|
||||
Text(
|
||||
'3.5万圈友',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 12.sp),
|
||||
),
|
||||
SizedBox(
|
||||
width: 8.sp,
|
||||
),
|
||||
Image.asset(
|
||||
getCircleImage('play'),
|
||||
width: 20.sp,
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
child: Container(
|
||||
margin: EdgeInsets.only(top: 12.sp),
|
||||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
width: Get.width,
|
||||
child: RichText(
|
||||
overflow: TextOverflow.fade,
|
||||
maxLines: 2,
|
||||
text: TextSpan(children: <InlineSpan>[
|
||||
descSpan,
|
||||
span
|
||||
])),
|
||||
),
|
||||
),
|
||||
],
|
||||
Container(
|
||||
child: Row(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
height: 30.sp,
|
||||
width: 30.0.sp +
|
||||
15.sp *
|
||||
(widgets.length - 1.sp),
|
||||
child: Stack(
|
||||
children: widgets,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 8.sp,
|
||||
),
|
||||
Text(
|
||||
bean.viewTotal.toString(),
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 12.sp),
|
||||
),
|
||||
SizedBox(
|
||||
width: 8.sp,
|
||||
),
|
||||
Image.asset(
|
||||
getCircleImage('play'),
|
||||
width: 20.sp,
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
} else if (index == 1) {
|
||||
return vipDynamicItem();
|
||||
return vipDynamicItem(bean);
|
||||
} else {
|
||||
return normalDynamicItem();
|
||||
return normalDynamicItem(bean);
|
||||
}
|
||||
}),
|
||||
),
|
||||
@ -269,46 +281,69 @@ class CirclePage extends StatelessWidget {
|
||||
image: DecorationImage(
|
||||
fit: BoxFit.fill,
|
||||
image:
|
||||
AssetImage(getCircleImage('top_circle_bg')))),
|
||||
AssetImage(getCircleImage('top_circle_bg')))),
|
||||
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,
|
||||
height: 72.sp,
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
'圈子名称',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 18.sp,
|
||||
fontWeight: FontWeight.w600),
|
||||
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,
|
||||
fontWeight: FontWeight.w600),
|
||||
),
|
||||
SizedBox(
|
||||
height: 4.sp,
|
||||
),
|
||||
Text(
|
||||
'${bean.joinTotal.toStringAsFixed(0)}万人看过',
|
||||
textAlign: TextAlign.left,
|
||||
style: TextStyle(
|
||||
color: Color(0xff03FEFB),
|
||||
fontSize: 12.sp,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: 4.sp,
|
||||
),
|
||||
Text(
|
||||
'35.6万人看过',
|
||||
style: TextStyle(
|
||||
color: Color(0xff03FEFB),
|
||||
fontSize: 12.sp,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
)),
|
||||
)),
|
||||
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);
|
||||
@ -322,8 +357,11 @@ class CirclePage extends StatelessWidget {
|
||||
),
|
||||
)),
|
||||
Positioned(
|
||||
top: 70.sp,
|
||||
child: Image.asset(getCircleImage('circle_line'),width: Get.width,)),
|
||||
top: 70.sp,
|
||||
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++;
|
||||
});
|
||||
@ -403,79 +437,80 @@ class CirclePage extends StatelessWidget {
|
||||
children: [
|
||||
GestureDetector(
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
getCircleImage('avatar_bg'),
|
||||
width: 42.sp,
|
||||
),
|
||||
ClipOval(
|
||||
child: Image.network(
|
||||
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp',
|
||||
width: 40.sp,
|
||||
height: 40.sp,
|
||||
fit: BoxFit.fill,
|
||||
),
|
||||
)
|
||||
],
|
||||
)),
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
getCircleImage('avatar_bg'),
|
||||
width: 42.sp,
|
||||
),
|
||||
ClipOval(
|
||||
child: Image.network(
|
||||
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp',
|
||||
width: 40.sp,
|
||||
height: 40.sp,
|
||||
fit: BoxFit.fill,
|
||||
),
|
||||
)
|
||||
],
|
||||
)),
|
||||
Expanded(
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(left: 8.sp, top: 12.sp),
|
||||
alignment: Alignment.centerLeft,
|
||||
height: 72.sp,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
padding: EdgeInsets.only(left: 8.sp, top: 12.sp),
|
||||
alignment: Alignment.centerLeft,
|
||||
height: 72.sp,
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
'圈子名称',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 18.sp,
|
||||
fontWeight: FontWeight.w600),
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
'圈子名称',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 18.sp,
|
||||
fontWeight: FontWeight.w600),
|
||||
),
|
||||
SizedBox(
|
||||
width: 8.sp,
|
||||
),
|
||||
Image.asset(
|
||||
getCircleImage('vip'),
|
||||
width: 36.sp,
|
||||
)
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
width: 8.sp,
|
||||
height: 4.sp,
|
||||
),
|
||||
Image.asset(
|
||||
getCircleImage('vip'),
|
||||
width: 36.sp,
|
||||
)
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: 4.sp,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
alignment: Alignment.center,
|
||||
height: 18.sp,
|
||||
padding:
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
alignment: Alignment.center,
|
||||
height: 18.sp,
|
||||
padding:
|
||||
EdgeInsets.only(left: 6.sp, right: 6.sp),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(9.sp),
|
||||
gradient: const LinearGradient(
|
||||
begin: Alignment(0.25, 0.5),
|
||||
end: Alignment(0.75, 0.5),
|
||||
colors: [
|
||||
Color(0xff8DFFF8),
|
||||
Color(0xffB5D3FF)
|
||||
])),
|
||||
child: Text(
|
||||
'男.33.DOM.异性恋',
|
||||
style: TextStyle(
|
||||
color: Colors.black,
|
||||
fontSize: 12.sp,
|
||||
),
|
||||
),
|
||||
)
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(
|
||||
9.sp),
|
||||
gradient: const LinearGradient(
|
||||
begin: Alignment(0.25, 0.5),
|
||||
end: Alignment(0.75, 0.5),
|
||||
colors: [
|
||||
Color(0xff8DFFF8),
|
||||
Color(0xffB5D3FF)
|
||||
])),
|
||||
child: Text(
|
||||
'男.33.DOM.异性恋',
|
||||
style: TextStyle(
|
||||
color: Colors.black,
|
||||
fontSize: 12.sp,
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
)),
|
||||
)),
|
||||
],
|
||||
),
|
||||
),
|
||||
@ -492,7 +527,7 @@ class CirclePage extends StatelessWidget {
|
||||
crossAxisCount: 3, //横轴三个子widget
|
||||
crossAxisSpacing: 8.sp,
|
||||
childAspectRatio: 1.0 //宽高比为1时,子widget
|
||||
),
|
||||
),
|
||||
children: <Widget>[
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(6.sp),
|
||||
@ -537,9 +572,10 @@ class CirclePage extends StatelessWidget {
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
'1位圈友已私聊',
|
||||
style: TextStyle(color: Colors.white, fontSize: 12.sp),
|
||||
)),
|
||||
'1位圈友已私聊',
|
||||
style: TextStyle(color: Colors.white, fontSize: 12
|
||||
.sp),
|
||||
)),
|
||||
Image.asset(
|
||||
getCircleImage('chat'),
|
||||
width: 60.sp,
|
||||
@ -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),
|
||||
);
|
||||
|
||||
@ -613,79 +649,80 @@ class CirclePage extends StatelessWidget {
|
||||
children: [
|
||||
GestureDetector(
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
getCircleImage('avatar_bg'),
|
||||
width: 42.sp,
|
||||
),
|
||||
ClipOval(
|
||||
child: Image.network(
|
||||
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp',
|
||||
width: 40.sp,
|
||||
height: 40.sp,
|
||||
fit: BoxFit.fill,
|
||||
),
|
||||
)
|
||||
],
|
||||
)),
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Image.asset(
|
||||
getCircleImage('avatar_bg'),
|
||||
width: 42.sp,
|
||||
),
|
||||
ClipOval(
|
||||
child: Image.network(
|
||||
'https://p3-passport.byteimg.com/img/user-avatar/eb429d4dbb3c246f580a6f7894f2b246~100x100.awebp',
|
||||
width: 40.sp,
|
||||
height: 40.sp,
|
||||
fit: BoxFit.fill,
|
||||
),
|
||||
)
|
||||
],
|
||||
)),
|
||||
Expanded(
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(left: 8.sp, top: 12.sp),
|
||||
alignment: Alignment.centerLeft,
|
||||
height: 72.sp,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
padding: EdgeInsets.only(left: 8.sp, top: 12.sp),
|
||||
alignment: Alignment.centerLeft,
|
||||
height: 72.sp,
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
'圈子名称',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 18.sp,
|
||||
fontWeight: FontWeight.w600),
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
'圈子名称',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 18.sp,
|
||||
fontWeight: FontWeight.w600),
|
||||
),
|
||||
SizedBox(
|
||||
width: 8.sp,
|
||||
),
|
||||
Image.asset(
|
||||
getCircleImage('vip'),
|
||||
width: 36.sp,
|
||||
)
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
width: 8.sp,
|
||||
height: 4.sp,
|
||||
),
|
||||
Image.asset(
|
||||
getCircleImage('vip'),
|
||||
width: 36.sp,
|
||||
)
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: 4.sp,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
alignment: Alignment.center,
|
||||
height: 18.sp,
|
||||
padding:
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
alignment: Alignment.center,
|
||||
height: 18.sp,
|
||||
padding:
|
||||
EdgeInsets.only(left: 6.sp, right: 6.sp),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(9.sp),
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment(0.25, 0.5),
|
||||
end: Alignment(0.75, 0.5),
|
||||
colors: [
|
||||
Color(0xff8DFFF8),
|
||||
Color(0xffB5D3FF)
|
||||
])),
|
||||
child: Text(
|
||||
'男.33.DOM.异性恋',
|
||||
style: TextStyle(
|
||||
color: Colors.black,
|
||||
fontSize: 12.sp,
|
||||
),
|
||||
),
|
||||
)
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(
|
||||
9.sp),
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment(0.25, 0.5),
|
||||
end: Alignment(0.75, 0.5),
|
||||
colors: [
|
||||
Color(0xff8DFFF8),
|
||||
Color(0xffB5D3FF)
|
||||
])),
|
||||
child: Text(
|
||||
'男.33.DOM.异性恋',
|
||||
style: TextStyle(
|
||||
color: Colors.black,
|
||||
fontSize: 12.sp,
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
)),
|
||||
)),
|
||||
],
|
||||
),
|
||||
),
|
||||
@ -702,7 +739,7 @@ class CirclePage extends StatelessWidget {
|
||||
crossAxisCount: 3, //横轴三个子widget
|
||||
crossAxisSpacing: 8.sp,
|
||||
childAspectRatio: 1.0 //宽高比为1时,子widget
|
||||
),
|
||||
),
|
||||
children: <Widget>[
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(6.sp),
|
||||
@ -747,9 +784,10 @@ class CirclePage extends StatelessWidget {
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
'1位圈友已私聊',
|
||||
style: TextStyle(color: Colors.white, fontSize: 12.sp),
|
||||
)),
|
||||
'1位圈友已私聊',
|
||||
style: TextStyle(color: Colors.white, fontSize: 12
|
||||
.sp),
|
||||
)),
|
||||
Image.asset(
|
||||
getCircleImage('chat'),
|
||||
width: 60.sp,
|
||||
|
||||
@ -30,8 +30,6 @@ class FeedbackLogic extends GetxController {
|
||||
|
||||
void _setImageFileListFromFile(XFile pickedFile) {
|
||||
PutController putController = PutController();
|
||||
|
||||
// 添加任务状态监听
|
||||
putController.addStatusListener((StorageStatus status) {
|
||||
print('状态变化: 当前任务状态:$status');
|
||||
});
|
||||
|
||||
@ -24,7 +24,7 @@ class HelpLogic extends GetxController {
|
||||
),
|
||||
FaqItem(
|
||||
question: '·发现图片或视频被人盗取了怎么办?',
|
||||
answer: '答:立即举报,并向在线客户反应情况。\n 划重点:核实后会对其做出处理并要求删除相关内容~',
|
||||
answer: '答:立即举报,并向在线客户反应情况。\n画重点:核实后会对其做出处理并要求删除相关内容~',
|
||||
),
|
||||
// 添加更多的问题和答案
|
||||
];
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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,25 +186,39 @@ class Complete_materialLogic extends GetxController {
|
||||
}
|
||||
|
||||
//时间戳转年龄
|
||||
String getAge(PDuration brt){
|
||||
String getAge(PDuration brt) {
|
||||
int age = 0;
|
||||
DateTime dateTime = DateTime.now();
|
||||
|
||||
int yearNow = dateTime.year; //当前年份
|
||||
int monthNow = dateTime.month; //当前月份
|
||||
int yearNow = dateTime.year; //当前年份
|
||||
int monthNow = dateTime.month; //当前月份
|
||||
int dayOfMonthNow = dateTime.day; //当前日期
|
||||
|
||||
int yearBirth = brt.year!;
|
||||
int monthBirth = brt.month!;
|
||||
int dayOfMonthBirth = brt.day!;
|
||||
age = yearNow - yearBirth; //计算整岁数
|
||||
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'],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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,11 +54,20 @@ class Complete_materialPage extends StatelessWidget {
|
||||
onTap: () {
|
||||
controller.getImageFile();
|
||||
},
|
||||
child: Image.asset(
|
||||
getLoginImage('add'),
|
||||
width: 86.sp,
|
||||
height: 86.sp,
|
||||
),
|
||||
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(
|
||||
height: 15.sp,
|
||||
@ -79,13 +88,13 @@ class Complete_materialPage extends StatelessWidget {
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 14.sp),
|
||||
decoration: InputDecoration(
|
||||
hintText: '请输入昵称',
|
||||
hintStyle: TextStyle(
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 14.sp),
|
||||
border: InputBorder.none,
|
||||
),
|
||||
hintText: '请输入昵称',
|
||||
hintStyle: TextStyle(
|
||||
color: Colors.white,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 14.sp),
|
||||
border: InputBorder.none,
|
||||
),
|
||||
),
|
||||
() {},
|
||||
img: 'edit'),
|
||||
@ -101,17 +110,19 @@ 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(
|
||||
'角色',
|
||||
Text(
|
||||
@ -120,10 +131,9 @@ class Complete_materialPage extends StatelessWidget {
|
||||
color: Colors.white,
|
||||
fontSize: 14.sp,
|
||||
fontWeight: FontWeight.w500),
|
||||
),
|
||||
() {
|
||||
showRolePiker(context, controller);
|
||||
}),
|
||||
), () {
|
||||
showRolePiker(context, controller);
|
||||
}),
|
||||
funcWidget(
|
||||
'取向',
|
||||
Text(
|
||||
@ -132,16 +142,19 @@ class Complete_materialPage extends StatelessWidget {
|
||||
color: Colors.white,
|
||||
fontSize: 14.sp,
|
||||
fontWeight: FontWeight.w500),
|
||||
),
|
||||
() {
|
||||
showOrientationPiker(context, controller);
|
||||
}),
|
||||
), () {
|
||||
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,
|
||||
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),
|
||||
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(
|
||||
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(
|
||||
controller.numbers[index].name,
|
||||
style: TextStyle(
|
||||
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) {
|
||||
|
||||
}
|
||||
var date = PDuration.now();
|
||||
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) {
|
||||
controller.state.role = p;
|
||||
controller.update();
|
||||
});
|
||||
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) {
|
||||
controller.state.orientation = p;
|
||||
controller.update();
|
||||
});
|
||||
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();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
@ -18,7 +20,7 @@ class LoginLogic extends GetxController {
|
||||
|
||||
bool sendCodeBtn = false; //判断发送短信按钮是否点击过标志
|
||||
int seconds = 60;
|
||||
Timer? t;
|
||||
Timer? t;
|
||||
|
||||
//倒计时
|
||||
starDownTimer() {
|
||||
@ -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');
|
||||
Future<void> getCode() async {
|
||||
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'];
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
prefs.setString('Authorization', authorization);
|
||||
|
||||
if(code == 200){
|
||||
Get.toNamed(AppRoutes.Home);
|
||||
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', 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?,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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),
|
||||
|
||||
@ -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';
|
||||
|
||||
|
||||
@ -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');
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
10
circle_app/lib/app/select_circle/binding.dart
Normal file
10
circle_app/lib/app/select_circle/binding.dart
Normal 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());
|
||||
}
|
||||
}
|
||||
49
circle_app/lib/app/select_circle/logic.dart
Normal file
49
circle_app/lib/app/select_circle/logic.dart
Normal 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);
|
||||
}
|
||||
5
circle_app/lib/app/select_circle/state.dart
Normal file
5
circle_app/lib/app/select_circle/state.dart
Normal file
@ -0,0 +1,5 @@
|
||||
class Select_circleState {
|
||||
Select_circleState() {
|
||||
///Initialize variables
|
||||
}
|
||||
}
|
||||
141
circle_app/lib/app/select_circle/view.dart
Normal file
141
circle_app/lib/app/select_circle/view.dart
Normal 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,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
10
circle_app/lib/app/splash/binding.dart
Normal file
10
circle_app/lib/app/splash/binding.dart
Normal file
@ -0,0 +1,10 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import 'logic.dart';
|
||||
|
||||
class SplashBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut(() => SplashLogic());
|
||||
}
|
||||
}
|
||||
44
circle_app/lib/app/splash/logic.dart
Normal file
44
circle_app/lib/app/splash/logic.dart
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
5
circle_app/lib/app/splash/state.dart
Normal file
5
circle_app/lib/app/splash/state.dart
Normal file
@ -0,0 +1,5 @@
|
||||
class SplashState {
|
||||
SplashState() {
|
||||
///Initialize variables
|
||||
}
|
||||
}
|
||||
28
circle_app/lib/app/splash/view.dart
Normal file
28
circle_app/lib/app/splash/view.dart
Normal 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(),),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@ -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(),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
40
circle_app/lib/network/api.dart
Normal file
40
circle_app/lib/network/api.dart
Normal 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/';
|
||||
}
|
||||
@ -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,15 +63,14 @@ class DioManager {
|
||||
}
|
||||
|
||||
/// post 请求
|
||||
Future post<T>(
|
||||
{required String url,
|
||||
Map<String, dynamic>? params,
|
||||
bool isAddTokenInHeader = true,
|
||||
bool isShowErrorToast = true,
|
||||
FormData? formData,
|
||||
CancelToken? cancelToken,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress}) async {
|
||||
Future post<T>({required String url,
|
||||
Map<String, dynamic>? params,
|
||||
bool isAddTokenInHeader = true,
|
||||
bool isShowErrorToast = true,
|
||||
FormData? formData,
|
||||
CancelToken? cancelToken,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress}) async {
|
||||
return await requestHttp<T>(url,
|
||||
method: DioMethod.post,
|
||||
isShowErrorToast: isShowErrorToast,
|
||||
@ -77,16 +81,42 @@ 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,
|
||||
Map<String, dynamic>? params,
|
||||
bool isShowErrorToast = true,
|
||||
bool isAddTokenInHeader = true,
|
||||
FormData? formData,
|
||||
CancelToken? cancelToken,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress}) async {
|
||||
Map<String, dynamic>? params,
|
||||
bool isShowErrorToast = true,
|
||||
bool isAddTokenInHeader = true,
|
||||
FormData? formData,
|
||||
CancelToken? cancelToken,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress}) async {
|
||||
const methodValues = {
|
||||
DioMethod.get: 'get',
|
||||
DioMethod.post: 'post',
|
||||
@ -96,21 +126,37 @@ 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的参数
|
||||
// 如果有formData参数,说明是传文件,忽略params的参数
|
||||
if (formData != null) {
|
||||
response = await _dio!.post(url,
|
||||
data: formData,
|
||||
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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构造函数设置
|
||||
|
||||
}
|
||||
@ -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(),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
@ -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';
|
||||
}
|
||||
@ -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,33 +23,63 @@ 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;
|
||||
imei = iosInfo.identifierForVendor;
|
||||
imei = iosInfo.identifierForVendor;
|
||||
// other specific iOS data
|
||||
}
|
||||
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") ?? "";
|
||||
}
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user