新增我的反馈 举报等接口对接

This commit is contained in:
YangYuhao 2023-07-07 09:19:12 +08:00
parent 9255edfe38
commit 6236085e57
18 changed files with 871 additions and 400 deletions

View File

@ -94,8 +94,8 @@ class AboutappPage extends StatelessWidget {
GestureDetector( GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: (){ onTap: (){
Get.toNamed(AppRoutes.WebViewActivity,arguments: {'title':"用户协议","url":"https://www.baidu.com"}); navigateToUserAgreement();
}, },
child: Row( child: Row(
children: [ children: [
Text( Text(
@ -118,7 +118,7 @@ class AboutappPage extends StatelessWidget {
GestureDetector( GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: (){ onTap: (){
Get.toNamed(AppRoutes.WebViewActivity,arguments: {'title':"隐私协议","url":"https://www.baidu.com"}); navigateToPrivacyPolicy();
}, },
child: Row( child: Row(

View File

@ -1,5 +1,6 @@
import 'dart:io';
import 'package:circle_app/util/util.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
@ -9,11 +10,12 @@ import '../../common/config.dart';
import '../../network/api.dart'; import '../../network/api.dart';
import '../../network/dio_manager.dart'; import '../../network/dio_manager.dart';
import '../../util/qiniu.dart'; import '../../util/qiniu.dart';
import '../call_out/logic.dart';
import 'state.dart'; import 'state.dart';
class FeedbackLogic extends GetxController { class FeedbackLogic extends GetxController {
final FeedbackState state = FeedbackState(); final FeedbackState state = FeedbackState();
TextEditingController textEditingController = TextEditingController();
final ImagePicker _picker = ImagePicker(); final ImagePicker _picker = ImagePicker();
var storage = Storage(); var storage = Storage();
var quToken = ''; var quToken = '';
@ -39,12 +41,36 @@ class FeedbackLogic extends GetxController {
return; return;
} }
SmartDialog.showLoading(); SmartDialog.showLoading();
upDataImage(quToken,pickedFile!,CONFIG.USER_INFO_AVATAR,(result){ upDataImage(quToken,pickedFile,CONFIG.USER_INFO_AVATAR,(result){
SmartDialog.dismiss(force: true); SmartDialog.dismiss(force: true);
state.imaglist.add(result); state.imaglist.add(result);
update(); update();
}); });
} catch (e) { } catch (_) {
}
}
getFeedBack() async{
List myBean = [];
if (!state.imaglist.isEmpty) {
state.imaglist.forEach((element) {
myBean.add(MyBean(type: 1, url: element).toJson());
});
}
textEditingController.text;
var data =
await DioManager.instance.post(url: Api.getFeedBack, params: {
'album': myBean,
'content': textEditingController.text,
'type':1
});
var bean = BaseResponse<dynamic>.fromJson(data, (jsonData) => jsonData,);
showToast(bean.msg);
if(bean.isSuccess()){
Get.back();
} }
} }

View File

@ -52,7 +52,7 @@ class FeedbackPage extends StatelessWidget {
padding: EdgeInsets.all(13), padding: EdgeInsets.all(13),
child: TextField( child: TextField(
maxLength: 200, maxLength: 200,
controller: controller.textEditingController,
onChanged: (msg){ onChanged: (msg){
print(msg); print(msg);
controller.state.maxMsg = '${msg.length}/200'; controller.state.maxMsg = '${msg.length}/200';
@ -63,6 +63,7 @@ class FeedbackPage extends StatelessWidget {
decoration: InputDecoration( decoration: InputDecoration(
hintText: '请补充详细问题和意见,我们会认真看完的哦~', hintText: '请补充详细问题和意见,我们会认真看完的哦~',
counterText: '', counterText: '',
hintStyle: TextStyle( hintStyle: TextStyle(
color: Color(0xFFB7BECC), fontSize: 14.sp), color: Color(0xFFB7BECC), fontSize: 14.sp),
border: InputBorder.none, border: InputBorder.none,
@ -135,7 +136,8 @@ class FeedbackPage extends StatelessWidget {
GestureDetector( GestureDetector(
onTap: () { onTap: () {
// showToast("完善资料"); // showToast("完善资料");
Get.toNamed(AppRoutes.Complete_materialPage, arguments: "user"); controller.getFeedBack();
// Get.toNamed(AppRoutes.Complete_materialPage, arguments: "user");
// controller.onInit(); // controller.onInit();
}, },
child: Center( child: Center(

View File

@ -78,6 +78,24 @@ class FriendslistLogic extends GetxController {
refreshController.loadComplete(); refreshController.loadComplete();
} }
return ; return ;
case "3":
var data =
await DioManager.instance.get(url: Api.visitList, params: {
'page':page
});
var bean = BaseResponse<User>.fromJson(data, (data) => User.fromJson(data));
if (bean.isSuccess()) {
lists.addAll(bean.data.lists);
}
isLoad = false;
update();
if(page == 1){
refreshController.refreshCompleted();
}else{
refreshController.loadComplete();
}
break;
} }

View File

@ -1,8 +1,31 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import 'state.dart'; import 'state.dart';
class HelpLogic extends GetxController { class HelpLogic extends GetxController {
// @override
// void onInit() async{
// // TODO: implement onInit
// super.onInit();
// var data =
// await DioManager.instance.get(url: Api.getQuestions, params:{});
// BaseResponse<List<StoryBean>> bean = BaseResponse<List<StoryBean>>.fromJson(
// data,
// (jsonData) => List<StoryBean>.from(jsonData),
// );
// if (bean.isSuccess()) {
// msgList.clear();
// (bean.data as List<StoryBean> ).forEach((element) {
// lists.add(StoryBean(question:element.question,answers:element.answers,selected: false));
// });
// lists.addAll(bean.data);
// }
//
// }
List<StoryBean> lists = [];
final HelpState state = HelpState(); final HelpState state = HelpState();
List<FaqItem> msgList = [ List<FaqItem> msgList = [
@ -41,3 +64,23 @@ class FaqItem {
this.selected = false, this.selected = false,
}); });
} }
class StoryBean {
final String question;
final List<String> answers;
bool selected = false;
StoryBean({
required this.question,
required this.answers,
this.selected = false,
});
factory StoryBean.fromJson(Map<String, dynamic> json) {
return StoryBean(
question: json['question'],
answers: List<String>.from(json['answers']),
selected: false
);
}
}

View File

@ -29,6 +29,14 @@ class HelpPage extends StatelessWidget {
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
appBar: MyAppBar( appBar: MyAppBar(
centerTitle: '帮助与反馈', centerTitle: '帮助与反馈',
actionWdiget: const Text(
"我的反馈",
style: TextStyle(color: Colors.white),
),
onPressed: () {
Get.toNamed(AppRoutes.MyFeedBackListActivity);
//logic.onSubmit();
},
), ),
body: SafeArea( body: SafeArea(
child: Column( child: Column(

View File

@ -1,14 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'package:circle_app/network/dio_manager.dart'; import 'package:circle_app/network/dio_manager.dart';
import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/router/app_routers.dart';
import 'package:circle_app/util/util.dart'; import 'package:circle_app/util/util.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../network/api.dart'; import '../../../network/api.dart';
import '../../../util/SharedPreferencesHelper.dart'; import '../../../util/SharedPreferencesHelper.dart';
@ -86,8 +83,10 @@ class LoginLogic extends GetxController {
Get.offNamed(AppRoutes.Complete_materialPage); Get.offNamed(AppRoutes.Complete_materialPage);
return; return;
}else{
showToast(bean.msg.toString());
} }
showToast(bean.msg.toString());
// try { // try {
// var response = await dio.post('user-service/login/smscode', data: { // var response = await dio.post('user-service/login/smscode', data: {
// "phone": phoneEditingController.text, // "phone": phoneEditingController.text,

View File

@ -199,12 +199,17 @@ class LoginPage extends StatelessWidget {
SizedBox( SizedBox(
width: 2.sp, width: 2.sp,
), ),
Text( GestureDetector(
'《用户协议》', onTap: (){
style: TextStyle( navigateToUserAgreement();
color: Color(0xff00FFF4), },
fontSize: 11.sp, child: Text(
fontWeight: FontWeight.w400, '《用户协议》',
style: TextStyle(
color: Color(0xff00FFF4),
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
), ),
), ),
Text( Text(
@ -217,12 +222,17 @@ class LoginPage extends StatelessWidget {
SizedBox( SizedBox(
width: 2.sp, width: 2.sp,
), ),
Text( GestureDetector(
'《隐私协议》', onTap: (){
style: TextStyle( navigateToPrivacyPolicy();
color: Color(0xff00FFF4), },
fontSize: 11.sp, child: Text(
fontWeight: FontWeight.w400, '《隐私协议》',
style: TextStyle(
color: Color(0xff00FFF4),
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
), ),
), ),
], ],

View File

@ -3,7 +3,6 @@ import 'package:circle_app/router/app_routers.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../util/SharedPreferencesHelper.dart'; import '../../util/SharedPreferencesHelper.dart';
import '../../util/util.dart'; import '../../util/util.dart';
@ -401,8 +400,8 @@ class MinefragmentPage extends StatelessWidget {
), ),
), ),
SizedBox( SizedBox(
width: 65.sp, width: 63.sp,
height: 65.sp, height: 63.sp,
child: _buildAvatar1(logic), child: _buildAvatar1(logic),
) )
], ],
@ -410,12 +409,12 @@ class MinefragmentPage extends StatelessWidget {
), ),
Expanded( Expanded(
child: Container( child: Container(
padding: EdgeInsets.only(left: 10), padding: EdgeInsets.only(left: 10.sp),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
_buildNameRow(logic), _buildNameRow(logic),
SizedBox(height: 18.sp), SizedBox(height: 10.sp),
_buildInfoRow(logic), _buildInfoRow(logic),
], ],
), ),
@ -445,14 +444,14 @@ class MinefragmentPage extends StatelessWidget {
}, },
child:logic.userInfoBean==null ? Container( child:logic.userInfoBean==null ? Container(
width: 65.sp, width: 63.sp,
height: 65.sp, height: 63.sp,
): CachedNetworkImage( ): CachedNetworkImage(
fit: BoxFit.cover, fit: BoxFit.cover,
placeholder: null, placeholder: null,
imageUrl: logic.avatar, imageUrl: logic.avatar,
width: 65.sp, width: 63.sp,
height: 65.sp, height: 63.sp,
), ),
), ),

View File

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

View File

@ -0,0 +1,110 @@
import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import 'state.dart';
class MyfeedbacklistLogic extends GetxController {
@override
void onInit() {
// TODO: implement onInit
super.onInit();
initList();
}
final MyfeedbacklistState state = MyfeedbacklistState();
List<Post> lists = [];
final RefreshController refreshController = RefreshController();
bool isLoad = true;
int page = 1;
initList() async{
if(page==1){
lists.clear();
}
var data =
await DioManager.instance.get(url: Api.getFeedBackList, params: {
'page': page,
'page_size':20
});
var bean = BaseResponse<PostList>.fromJson(
data, (data) => PostList.fromJson(data));
if (bean.isSuccess()) {
lists.addAll(bean.data.lists);
}
isLoad = false;
update();
if (page == 1) {
refreshController.refreshCompleted();
} else {
refreshController.loadComplete();
}
}
}
class Post {
int id;
String content;
List<Album> album;
dynamic reply;
String createTime;
int auditState;
Post({
required this.id,
required this.content,
required this.album,
required this.reply,
required this.createTime,
required this.auditState,
});
factory Post.fromJson(Map<String, dynamic> json) {
return Post(
id: json['id'],
content: json['content'],
album: List<Album>.from(json['album'].map((album) => Album.fromJson(album))),
reply: json['reply'],
createTime: json['create_time'],
auditState: json['audit_state'],
);
}
}
class Album {
int type;
String url;
Album({
required this.type,
required this.url,
});
factory Album.fromJson(Map<String, dynamic> json) {
return Album(
type: json['type'],
url: json['url'],
);
}
}
class PostList {
List<Post> lists;
int total;
PostList({
required this.lists,
required this.total,
});
factory PostList.fromJson(Map<String, dynamic> json) {
return PostList(
lists: List<Post>.from(json['lists'].map((post) => Post.fromJson(post))),
total: json['total'],
);
}
}

View File

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

View File

@ -0,0 +1,161 @@
import 'dart:math';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import '../../components/my_app_bar.dart';
import '../../router/app_routers.dart';
import '../../util/util.dart';
import 'logic.dart';
class MyfeedbacklistPage extends StatelessWidget {
MyfeedbacklistPage({Key? key}) : super(key: key);
final logic = Get.find<MyfeedbacklistLogic>();
final state = Get.find<MyfeedbacklistLogic>().state;
@override
Widget build(BuildContext context) {
return GetBuilder<MyfeedbacklistLogic>(builder: (logic) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getBaseImage("home_back")),
fit: BoxFit.cover,
),
),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: const MyAppBar(centerTitle: '我的反馈',),
body: SafeArea(
child: logic.isLoad ? loaddingWidget(true) : logic.lists.isEmpty ? noResultWidget() : SmartRefresher(
controller: logic.refreshController,
child: ListView.builder(
itemCount: logic.lists.length,
itemBuilder: (context, index) {
return ListTile(
title: ListItem(logic.lists[index]),
);
},
),
onRefresh: _onRefresh,
onLoading: _onLoading,
),
),),
);
});
}
Widget ListItem(Post item) {
return Column(children: [
Text(item.createTime , style: TextStyle(
color: Colors.white,
fontSize: 14.0.sp,
),),
Container(
margin: EdgeInsets.only(bottom: 12.0,top: 12.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
color: Color(0xff282733),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding:
EdgeInsets.symmetric(vertical: 16.0.sp, horizontal: 16.0.sp),
decoration: BoxDecoration(
color: Color(0xff282733),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8.0.sp),
topRight: Radius.circular(8.0.sp),
),
),
child: Text(
item.content,
style: TextStyle(
color: Colors.white,
fontSize: 14.0.sp,
),
),
),
Container(
height: 120.sp,
child: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3, //
),
itemCount:item.album.length, // Replace with your item count
itemBuilder: (context, index) {
//
// data
// var itemData = data[index - 1]; //
return Container(
margin: EdgeInsets.all(5.sp),
child: Center(
child: _buildImageItem( item.album[index].url,// Replace with your item count
logic,index),
),
);
},
),
),
Container(
margin: EdgeInsets.only(left: 16.sp,right: 16.sp,bottom: 16.sp),
child: Text(
item.reply!=null?"反馈回复:"+item.reply:"审核中",
style: TextStyle(
color: Colors.grey,
fontSize: 12.0.sp,
),
),
),
],
),
)
],);
}
Widget _buildImageItem(String url, MyfeedbacklistLogic controller, int index) {
return ClipRRect(
borderRadius: BorderRadius.circular(0.0),
child: Container(
width: double.infinity, //
height: double.infinity, //
child: ClipRRect(
borderRadius: BorderRadius.circular(0.0),
child: GestureDetector(
onTap: () {
// Get.toNamed(AppRoutes.Swiper, arguments: {
// 'imaglist': controller.lists.album,
// 'index': index
// });
},
child: Image.network(
fit: BoxFit.cover,
url,
),
),
),
),
);
}
void _onRefresh() async {
logic.page = 1;
logic.initList();
}
void _onLoading() async {
logic.page = logic.page + 1;
logic.initList();
}
}

View File

@ -56,57 +56,120 @@ class _MyTabbedScreenState extends State<UserinfoPage>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GetBuilder(builder: (UserinfoLogic logic) { return GetBuilder<UserinfoLogic>(
return Container( builder: (logic) {
decoration: BoxDecoration( return _buildPage(logic);
image: DecorationImage( },
image: AssetImage(getBaseImage("home_back")), );
fit: BoxFit.cover,
),
),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: MyAppBar(
centerTitle: logic.userInfoBean != null
? "${logic.userInfoBean!.nickname}的主页"
: "个人主页",
),
body: Stack(
children: [
Container(
child: buildContent(logic),
),
Positioned(
bottom: 27.sp,
width: Get.width,
child: _MeInfoButton(logic),
)
],
),
));
});
} }
Widget _buildPage(UserinfoLogic logic) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getBaseImage("home_back")),
fit: BoxFit.cover,
),
),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: MyAppBar(
centerTitle: logic.userInfoBean != null
? "${logic.userInfoBean!.nickname}的主页"
: "个人主页",
),
body: Stack(
children: [
Container(
child: buildContent(logic),
),
Positioned(
bottom: 27.sp,
width: Get.width,
child: _MeInfoButton(logic),
),
],
),
),
);
}
Widget _MeInfoButton(UserinfoLogic controller) { Widget _MeInfoButton(UserinfoLogic controller) {
if (controller.isMe) { if (controller.isMe) {
return Container(); return const SizedBox();
} else { } else {
final likeButton = GestureDetector(
onTap: () {
_showBottomSheet(context);
},
child: Image(
image: AssetImage(getMineImage("icon_like")),
width: 40.sp,
height: 40.sp,
),
);
final likeText = Text(
controller.isLike ? "取消喜欢" : "喜欢",
style: TextStyle(
color: Colors.white,
fontSize: 12.sp,
),
);
final chatText = Text(
"私聊",
style: TextStyle(
color: Colors.white,
fontSize: 12.sp,
),
);
final gradientDecoration = BoxDecoration(
borderRadius: BorderRadius.circular(17.sp),
gradient: const LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
);
final chatButton = GestureDetector(
onTap: () {
if (logic.userInfoBean != null) {
pushChatPage(logic.imId, logic.userInfoBean!.nickname);
}
},
child: Container(
width: 130.sp,
height: 34.sp,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17.sp),
gradient: const LinearGradient(
colors: [
Color(0x26FFFFFF),
Color(0x26FFFFFF),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
child: Center(child: chatText),
),
);
return Container( return Container(
margin: EdgeInsets.only(left: 18.sp, right: 18.sp), margin: EdgeInsets.only(left: 18.sp, right: 18.sp),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
GestureDetector( likeButton,
onTap: () {
// showToast("鼓掌");
_showBottomSheet(context);
},
child: Image(
image: AssetImage(getMineImage("icon_like")),
width: 40.sp,
height: 40.sp,
),
),
GestureDetector( GestureDetector(
onTap: () { onTap: () {
logic.setLike(); logic.setLike();
@ -114,67 +177,22 @@ class _MyTabbedScreenState extends State<UserinfoPage>
child: Container( child: Container(
width: 130.sp, width: 130.sp,
height: 34.sp, height: 34.sp,
decoration: BoxDecoration( decoration: gradientDecoration,
borderRadius: BorderRadius.circular(17.sp), child: Center(child: likeText),
gradient: const LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
child: Center(
child: Text(
logic.isLike ? "取消喜欢" : "喜欢",
style: TextStyle(
color: Colors.white,
fontSize: 12.sp,
),
),
),
), ),
), ),
GestureDetector( chatButton,
onTap: () {
if (logic.userInfoBean != null) {
pushChatPage(logic.imId, logic.userInfoBean!.nickname);
}
},
child: Container(
width: 130.sp,
height: 34.sp,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17.sp),
gradient: const LinearGradient(
colors: [
Color(0x26FFFFFF),
Color(0x26FFFFFF),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
child: Center(
child: Text(
"私聊",
style: TextStyle(
color: Colors.white,
fontSize: 12.sp,
),
),
),
),
)
], ],
), ),
); );
} }
} }
Widget buildContent(UserinfoLogic controller) { Widget buildContent(UserinfoLogic controller) {
final userInfoBean = controller.userInfoBean;
final interests = userInfoBean?.interests ?? [];
return Container( return Container(
padding: EdgeInsets.symmetric(horizontal: 19.sp, vertical: 14.sp), padding: EdgeInsets.symmetric(horizontal: 19.sp, vertical: 14.sp),
child: Column( child: Column(
@ -182,7 +200,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
Row( Row(
children: [ children: [
_imagelistView(controller), _imagelistView(controller),
Flexible( Expanded(
child: buildUserContainer(controller), child: buildUserContainer(controller),
), ),
], ],
@ -193,9 +211,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
Row( Row(
children: [ children: [
Text( Text(
controller.userInfoBean != null userInfoBean?.nickname ?? "",
? controller.userInfoBean!.nickname
: "",
style: const TextStyle( style: const TextStyle(
color: Color.fromRGBO(247, 250, 250, 1.0), color: Color.fromRGBO(247, 250, 250, 1.0),
fontSize: 14, fontSize: 14,
@ -221,33 +237,29 @@ class _MyTabbedScreenState extends State<UserinfoPage>
Text( Text(
controller.onLineCity, controller.onLineCity,
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
color: logic.isOnline color: logic.isOnline
? const Color(0xFF00FFF4) ? const Color(0xFF00FFF4)
: const Color(0xFF787575)), : const Color(0xFF787575),
) ),
),
], ],
), ),
], ],
), ),
SizedBox( SizedBox(
// margin: EdgeInsets.only(top: 18.sp, bottom: 18.sp),
height: 59.sp, height: 59.sp,
child: ListView.builder( child: ListView.builder(
itemCount: controller.userInfoBean == null itemCount: interests.length,
? 0
: controller.userInfoBean!.interests.length,
// item
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
//
padding: EdgeInsets.symmetric(vertical: 18.sp), padding: EdgeInsets.symmetric(vertical: 18.sp),
//
itemBuilder: (context, index) { itemBuilder: (context, index) {
final interest = interests[index];
return Container( return Container(
margin: EdgeInsets.only(right: 11.sp), // item margin: EdgeInsets.only(right: 11.sp),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17.0), // borderRadius: BorderRadius.circular(17.0),
gradient: const LinearGradient( gradient: const LinearGradient(
colors: [ colors: [
Color(0xFF06F9FA), Color(0xFF06F9FA),
@ -260,15 +272,18 @@ class _MyTabbedScreenState extends State<UserinfoPage>
margin: EdgeInsets.all(0.2.sp), margin: EdgeInsets.all(0.2.sp),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17.0), borderRadius: BorderRadius.circular(17.0),
// shape: BoxShape.circle,
color: const Color(0xFF392D53), color: const Color(0xFF392D53),
), ),
child: Padding( child: Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: 2.sp, bottom: 2.sp, left: 15.sp, right: 15.sp), top: 2.sp,
bottom: 2.sp,
left: 15.sp,
right: 15.sp,
),
child: Center( child: Center(
child: Text( child: Text(
controller.userInfoBean!.interests[index].title, interest.title,
style: const TextStyle( style: const TextStyle(
fontSize: 11.0, fontSize: 11.0,
color: Colors.white, color: Colors.white,
@ -277,59 +292,185 @@ class _MyTabbedScreenState extends State<UserinfoPage>
), ),
), ),
), ),
), // ),
); );
}, },
), ),
), ),
titleTab(controller), titleTab(controller),
Expanded( Expanded(
child: TabBarView( child: TabBarView(
controller: _tabController, controller: _tabController,
children: [ children: [
_imageAdapter(controller), _imageAdapter(controller),
Container( Container(
margin: EdgeInsets.only(bottom: 26.sp), margin: EdgeInsets.only(bottom: 26.sp),
child: HomeCallOutView(controller.userId)), child: HomeCallOutView(controller.userId),
], ),
)) ],
),
),
], ],
), ),
); );
} }
Widget titleTab(UserinfoLogic controller) { Widget titleTab(UserinfoLogic controller) {
return Container( return Container(
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
height: 27.sp, height: 27.sp,
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
TabBar( TabBar(
isScrollable: true, isScrollable: true,
controller: _tabController, controller: _tabController,
indicatorColor: const Color(0xFF00FFF4), indicatorColor: const Color(0xFF00FFF4),
indicatorWeight: 2.sp, indicatorWeight: 2.sp,
labelColor: const Color(0xFF00FFF4), labelColor: const Color(0xFF00FFF4),
unselectedLabelColor: const Color(0xB3FFFFFF), unselectedLabelColor: const Color(0xB3FFFFFF),
indicatorSize: TabBarIndicatorSize.label, indicatorSize: TabBarIndicatorSize.label,
tabs: const [ tabs: const [
Tab( Tab(
text: "形象照", text: "形象照",
), ),
Tab(text: "喊话") Tab(text: "喊话"),
], ],
), ),
GestureDetector( GestureDetector(
onTap: () { onTap: () {
controller.isMe if (controller.isMe) {
? controller.isEdit = !controller.isEdit controller.isEdit = !controller.isEdit;
: controller.urgeChange();
controller.update(); controller.update();
// controller.updataImage(); } else {
controller.urgeChange();
}
},
child: Visibility(
visible: logic.isShowAlbum,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: const LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
padding: EdgeInsets.symmetric(
vertical: 2.sp,
horizontal: 12.sp,
),
child: Text(
controller.isMe
? controller.isEdit
? "完成"
: "管理"
: controller.isUrgeStatus
? "已催更"
: "催更",
style: const TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
),
),
],
),
);
}
Widget _imageAdapter(UserinfoLogic controller) {
return Stack(
children: [
Column(
children: [
if (controller.isMe)
Container(
margin: EdgeInsets.only(top: 18.sp, bottom: 14.sp),
child: Text(
controller.isLikeFoMsg,
style: const TextStyle(color: Colors.white30),
),
),
Expanded(
child: Container(
margin: const EdgeInsets.only(bottom: 58.0),
child: GridView.builder(
shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
),
itemCount: controller.isMe
? controller.isEdit
? controller.state.imaglist.length + 1
: controller.state.imaglist.length
: controller.state.imaglist.length,
itemBuilder: (BuildContext context, int index) {
if (controller.isMe && controller.isEdit) {
if (index == 0) {
return GestureDetector(
onTap: () {
controller.getImageFile();
},
child: Container(
margin: EdgeInsets.all(5.sp),
child: Image(
image: AssetImage(getMineImage("icon_img_add")),
),
),
);
} else {
return Container(
margin: EdgeInsets.all(5.sp),
child: Center(
child: _buildImageItem(
controller.state.imaglist[index - 1].url,
controller,
index - 1,
),
),
);
}
} else {
return Container(
margin: EdgeInsets.all(5.sp),
child: Center(
child: _buildImageItem(
controller.state.imaglist[index].url,
controller,
index,
),
),
);
}
},
),
),
),
],
),
if (logic.isMe)
Positioned(
left: 0,
right: 0,
bottom: 26.sp,
child: GestureDetector(
onTap: () async {
var data = await Get.toNamed(
AppRoutes.Complete_materialPage,
arguments: "user",
);
logic.onInit();
}, },
child: Visibility( child: Center(
visible: logic.isShowAlbum,
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17), borderRadius: BorderRadius.circular(17),
@ -342,17 +483,13 @@ class _MyTabbedScreenState extends State<UserinfoPage>
end: Alignment.centerRight, end: Alignment.centerRight,
), ),
), ),
padding: EdgeInsets.only( padding: EdgeInsets.symmetric(
top: 2.sp, bottom: 2.sp, left: 12.sp, right: 12.sp), vertical: 10.sp,
child: Text( horizontal: 55.sp,
controller.isMe ),
? controller.isEdit child: const Text(
? "完成" "完善个人形象",
: "管理" style: TextStyle(
: controller.isUrgeStatus
? "已催更"
: "催更",
style: const TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 12, fontSize: 12,
), ),
@ -360,113 +497,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
), ),
), ),
), ),
], ),
));
}
Widget _imageAdapter(UserinfoLogic controller) {
return Stack(
children: [
Column(
// mainAxisAlignment: MainAxisAlignment.center,
children: [
controller.isMe? Container(
margin: EdgeInsets.only(top: 18.sp, bottom: 14.sp),
child:
Text(
controller.isLikeFoMsg,
style: const TextStyle(color: Colors.white30),
)):Container(),
Expanded(child: Container(
margin: const EdgeInsets.only(bottom: 58.0),
child: GridView.builder(
shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3, //
),
itemCount: controller.isMe
? controller.isEdit
? controller.state.imaglist.length + 1
: controller.state.imaglist.length
: controller.state.imaglist.length, //
itemBuilder: (BuildContext context, int index) {
if (controller.isMe && controller.isEdit) {
if (index == 0) {
//
return GestureDetector(
onTap: () {
controller.getImageFile();
},
child: Container(
margin: EdgeInsets.all(5.sp),
child: Image(
image: AssetImage(getMineImage("icon_img_add")),
),
),
);
} else {
return Container(
margin: EdgeInsets.all(5.sp),
child: Center(
child: _buildImageItem(
controller.state.imaglist[index - 1].url,
controller,
index - 1)),
);
}
} else {
return Container(
margin: EdgeInsets.all(5.sp),
child: Center(
child: _buildImageItem(
controller.state.imaglist[index].url,
controller,
index)),
);
}
},
),
))
],
),
logic.isMe
? Positioned(
left: 0,
right: 0,
bottom: 26.sp,
child: GestureDetector(
onTap: () async{
// showToast("完善资料");
var data = await Get.toNamed(AppRoutes.Complete_materialPage, arguments: "user");
logic.onInit();
// controller.onInit();
},
child: Center(
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: const LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
padding: EdgeInsets.only(
top: 10.sp, bottom: 10.sp, left: 55.sp, right: 55.sp),
child: const Text(
"完善个人形象",
style: TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
),
))
: Container()
], ],
); );
} }
@ -487,7 +518,11 @@ class _MyTabbedScreenState extends State<UserinfoPage>
), ),
), ),
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp), top: 2.sp,
bottom: 2.sp,
left: 10.sp,
right: 10.sp,
),
child: Text( child: Text(
controller.ageMsg, controller.ageMsg,
style: const TextStyle( style: const TextStyle(
@ -496,18 +531,18 @@ class _MyTabbedScreenState extends State<UserinfoPage>
), ),
), ),
), ),
SizedBox(width: 6.sp), const SizedBox(width: 6),
controller.isVip > 0 if (controller.isVip > 0)
? Image( Image(
image: AssetImage(getBaseImage("vip")), image: AssetImage(getBaseImage("vip")),
width: 44.sp, width: 44.sp,
height: 18.sp, height: 18.sp,
) ),
: Container(),
], ],
); );
} }
Widget buildUserContainer(UserinfoLogic controller) { Widget buildUserContainer(UserinfoLogic controller) {
return Container( return Container(
margin: EdgeInsets.symmetric(horizontal: 1.sp, vertical: 14.sp), margin: EdgeInsets.symmetric(horizontal: 1.sp, vertical: 14.sp),
@ -554,11 +589,12 @@ class _MyTabbedScreenState extends State<UserinfoPage>
width: 66.sp, width: 66.sp,
height: 66.sp, height: 66.sp,
child: _buildAvatar1(controller), child: _buildAvatar1(controller),
) ),
], ],
); );
} }
Widget _buildAvatar1(UserinfoLogic controller) { Widget _buildAvatar1(UserinfoLogic controller) {
if (controller.userInfoBean == null) { if (controller.userInfoBean == null) {
return SizedBox( return SizedBox(
@ -588,11 +624,12 @@ class _MyTabbedScreenState extends State<UserinfoPage>
} }
} }
Widget _buildImageItem(String url, UserinfoLogic controller, int index) { Widget _buildImageItem(String url, UserinfoLogic controller, int index) {
return Stack( return Stack(
children: [ children: [
SizedBox( SizedBox(
width: double.infinity, // width: double.infinity,
height: double.infinity, height: double.infinity,
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(0.0), borderRadius: BorderRadius.circular(0.0),
@ -614,104 +651,102 @@ class _MyTabbedScreenState extends State<UserinfoPage>
), ),
if (controller.userId == "") if (controller.userId == "")
Positioned( Positioned(
top: 0, top: 0,
right: 0, right: 0,
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
// showToast("删除"); _showDelImgDialog(context, controller, index);
_showDelImgDialog(context, controller, index); },
}, child: Visibility(
child: controller.isEdit visible: controller.isEdit,
? Image( child: Image(
image: AssetImage(getMineImage("icon_img_del")), image: AssetImage(getMineImage("icon_img_del")),
width: 20.sp, width: 20.sp,
height: 20.sp, height: 20.sp,
) ),
: Container(), ),
)) ),
),
], ],
); );
} }
void _showBottomSheet(BuildContext context) { void _showBottomSheet(BuildContext context) {
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (BuildContext context) { builder: (BuildContext context) {
return Container( return Container(
decoration: const BoxDecoration( decoration: const BoxDecoration(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
topLeft: Radius.circular(16.0), topLeft: Radius.circular(16.0),
topRight: Radius.circular(16.0), topRight: Radius.circular(16.0),
),
gradient: LinearGradient(
colors: [
Color(0xFF4A3E5D),
Color(0xFF344143),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
), ),
height: 118.0, gradient: LinearGradient(
width: double.infinity, colors: [
child: Container( Color(0xFF4A3E5D),
alignment: Alignment.center, Color(0xFF344143),
child: Row( ],
mainAxisAlignment: MainAxisAlignment.center, begin: Alignment.centerLeft,
// mainAxisAlignment: MainAxisAlignment.spaceBetween, end: Alignment.centerRight,
children: [ ),
GestureDetector( ),
onTap: () { height: 118.0,
Navigator.pop(context); width: double.infinity,
Get.toNamed(AppRoutes.ReportActivity, child: Row(
arguments: {"userId": logic.userId}); mainAxisAlignment: MainAxisAlignment.spaceEvenly,
}, children: [
child: Column( GestureDetector(
mainAxisAlignment: MainAxisAlignment.center, onTap: () {
children: [ Navigator.pop(context);
Image( Get.toNamed(AppRoutes.ReportActivity,
image: AssetImage(getMineImage("icon_report")), arguments: {"userId": logic.userId});
width: 40.sp, },
height: 40.sp, child: Column(
), mainAxisAlignment: MainAxisAlignment.center,
Container( children: [
margin: EdgeInsets.only(top: 2.sp), Image(
child: const Text( image: AssetImage(getMineImage("icon_report")),
"举报", width: 40.sp,
style: TextStyle(color: Colors.white), height: 40.sp,
),
)
],
), ),
), Container(
SizedBox(width: 75.sp), margin: EdgeInsets.only(top: 2.sp),
GestureDetector( child: const Text(
onTap: () { "举报",
Navigator.pop(context); style: TextStyle(color: Colors.white),
_showReportDialog(context); ),
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image(
image: AssetImage(getMineImage("icon_block")),
width: 40.sp,
height: 40.sp,
),
Container(
margin: EdgeInsets.only(top: 2.sp),
child: const Text(
"拉黑",
style: TextStyle(color: Colors.white),
),
)
],
), ),
), ],
], ),
), ),
)); GestureDetector(
onTap: () {
Navigator.pop(context);
_showReportDialog(context);
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image(
image: AssetImage(getMineImage("icon_block")),
width: 40.sp,
height: 40.sp,
),
Container(
margin: EdgeInsets.only(top: 2.sp),
child: const Text(
"拉黑",
style: TextStyle(color: Colors.white),
),
),
],
),
),
],
),
);
}, },
); );
} }

View File

@ -135,6 +135,33 @@ class Api {
//
static const getFeedBack = 'up-service/feedback';
//
static const getFeedBackList = 'up-service/my/feedbacks';
// //访
// static const getInterestList = 'up-service/interest/20/users';
//
static const getQuestions = 'up-service/guide/feedback/questions';

View File

@ -25,6 +25,8 @@ import 'package:circle_app/app/msg/binding.dart';
import 'package:circle_app/app/msg/view.dart'; import 'package:circle_app/app/msg/view.dart';
import 'package:circle_app/app/my_circle/binding.dart'; import 'package:circle_app/app/my_circle/binding.dart';
import 'package:circle_app/app/my_circle/view.dart'; import 'package:circle_app/app/my_circle/view.dart';
import 'package:circle_app/app/myfeedbacklist/binding.dart';
import 'package:circle_app/app/myfeedbacklist/view.dart';
import 'package:circle_app/app/offaccount/binding.dart'; import 'package:circle_app/app/offaccount/binding.dart';
import 'package:circle_app/app/offaccount/view.dart'; import 'package:circle_app/app/offaccount/view.dart';
import 'package:circle_app/app/photoinfo/binding.dart'; import 'package:circle_app/app/photoinfo/binding.dart';
@ -172,5 +174,10 @@ class AppPages {
page: () => My_circlePage(), page: () => My_circlePage(),
binding: My_circleBinding(), binding: My_circleBinding(),
), ),
GetPage(
name: AppRoutes.MyFeedBackListActivity,
page: () => MyfeedbacklistPage(),
binding: MyfeedbacklistBinding(),
),
]; ];
} }

View File

@ -23,4 +23,6 @@ abstract class AppRoutes {
static const SelectCircleActivity = '/user/SelectCircleActivity'; static const SelectCircleActivity = '/user/SelectCircleActivity';
static const SplashActivity = '/user/SplashActivity'; static const SplashActivity = '/user/SplashActivity';
static const MyCircle = '/myCircle'; static const MyCircle = '/myCircle';
static const MyFeedBackListActivity = '/mine/MyFeedBackListActivity';
} }

View File

@ -249,3 +249,12 @@ Future<String> getLibraryDirectoryPath() async {
final directory = await getLibraryDirectory(); final directory = await getLibraryDirectory();
return directory.path; return directory.path;
} }
//
navigateToUserAgreement(){
Get.toNamed(AppRoutes.WebViewActivity,arguments: {'title':"用户协议","url":"https://docs.qq.com/doc/DZVV1SkttZGlPUW1H"});
}
//
navigateToPrivacyPolicy(){
Get.toNamed(AppRoutes.WebViewActivity,arguments: {'title':"隐私协议","url":"https://docs.qq.com/doc/DZXhvcXV6b1RNTUx1"});
}