关注和访客记录 列表 个人中心

This commit is contained in:
YangYuhao 2023-07-04 09:23:30 +08:00
parent eebdf6a442
commit 303a47604a
9 changed files with 747 additions and 320 deletions

View File

@ -1,7 +1,153 @@
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 FriendslistLogic extends GetxController {
final RefreshController refreshController = RefreshController();
final FriendslistState state = FriendslistState();
final type = Get.arguments as String;
int page = 1;
int isVip = 0;
List<UserInfo> lists = [];
@override
void onInit() async{
super.onInit();
initList();
}
initList() async{
if(page==1){
lists.clear();
}
switch(type){
case "0":
var data =
await DioManager.instance.get(url: Api.followList, params: {
'page':page
});
var bean = BaseResponse<User>.fromJson(data, (data) => User.fromJson(data));
if (bean.isSuccess()) {
lists.addAll(bean.data.lists);
}
update();
if(page == 1){
refreshController.refreshCompleted();
}else{
refreshController.loadComplete();
}
return ;
case "1":
var data =
await DioManager.instance.get(url: Api.fansList, params: {
'page':page
});
var bean = BaseResponse<User>.fromJson(data, (data) => User.fromJson(data));
if (bean.isSuccess()) {
lists.addAll(bean.data.lists);
}
update();
if(page == 1){
refreshController.refreshCompleted();
}else{
refreshController.loadComplete();
}
return ;
case "2":
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);
}
update();
if(page == 1){
refreshController.refreshCompleted();
}else{
refreshController.loadComplete();
}
return ;
}
}
}
class User {
final List<UserInfo> lists;
final int total;
User({required this.lists, required this.total});
factory User.fromJson(Map<String, dynamic> json) {
final List<dynamic> userList = json['lists'];
final List<UserInfo> users = userList.map((user) => UserInfo.fromJson(user)).toList();
final int total = json['total'];
return User(lists: users, total: total);
}
}
class UserInfo {
final int id;
final String nickname;
final String avatar;
final String signature;
final String birthday;
final int age;
final int vip;
final int gender;
final int role;
final int orientation;
final double lng;
final double lat;
final String city;
final String avatarThumb;
UserInfo({
required this.id,
required this.nickname,
required this.avatar,
required this.signature,
required this.birthday,
required this.age,
required this.vip,
required this.gender,
required this.role,
required this.orientation,
required this.lng,
required this.lat,
required this.city,
required this.avatarThumb,
});
factory UserInfo.fromJson(Map<String, dynamic> json) {
return UserInfo(
id: json['id'],
nickname: json['nickname'],
avatar: json['avatar'],
signature: json['signature'],
birthday: json['birthday'],
age: json['age'],
vip: json['vip'],
gender: json['gender'],
role: json['role'],
orientation: json['orientation'],
lng: json['lng'],
lat: json['lat'],
city: json['city'],
avatarThumb: json['avatar_thumb'],
);
}
}

View File

@ -1,9 +1,11 @@
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';
@ -15,8 +17,7 @@ class FriendslistPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final type = Get.arguments as String;
return GetBuilder<FriendslistLogic>(builder: (logic) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
@ -26,28 +27,152 @@ class FriendslistPage extends StatelessWidget {
),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: MyAppBar(centerTitle: _getTitleName(type),),
appBar: MyAppBar(
centerTitle: _getTitleName(logic.type),
),
body: SafeArea(
child: SmartRefresher(
controller: _refreshController,
child: ListView.builder(
padding: EdgeInsets.all(16.sp),
itemCount: itemCount,
itemBuilder: (context, index) {
return ListTile(
title: Text('Item $index'),
);
},
),
controller: logic.refreshController,
onRefresh: _onRefresh,
onLoading: _onLoading,
child: ListView.builder(
padding: EdgeInsets.all(16.sp),
itemCount: logic.lists.length,
itemBuilder: (context, index) {
return ListItem(logic.lists[index]);
},
),
),
),
),
);
});
}
Widget ListItem(UserInfo item) {
return GestureDetector(
onTap: (){
Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id);
},
child: Container(
margin: EdgeInsets.only(bottom: 21),
child: Row(
children: [
Stack(children: [
ClipOval(
child: GestureDetector(
onTap: () {
var imgList = <String>[];
imgList.add(item.avatar);
Get.toNamed(AppRoutes.Swiper, arguments: {
'imaglist': imgList,
'index': 0
});
},
child: CachedNetworkImage(
imageUrl: item.avatar,
width: 53.sp,
height: 53.sp,
),
),
),
Positioned(
right: 0,
left: 0,
bottom: 0,
child: item.vip>0 ?
Image(
image: AssetImage(getBaseImage("vip")),
width: 44.sp,
height: 18.sp,
):Container(),)
],),
SizedBox(width: 10.sp),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Text(
item.nickname,
style: const TextStyle(color :Colors.white70,fontSize: 14, fontWeight: FontWeight.bold),
),
SizedBox(width: 4.sp),
// SizedBox(height: 8.sp),
_buildInfoRow(item),
// Placeholder image
],
),
SizedBox(height: 8.sp),
Container(
width: 150.sp,
child: Text(
item.signature,
style: TextStyle(fontSize: 12.sp, color: Color(0xFFB7BECC)),
),
),
],
),
// Pla
Spacer(),
GestureDetector(onTap: (){
showToast("私聊");
},
child: Container(
width: 60,
height: 28,
decoration: BoxDecoration(
color: Color(0xFFFF4D7C),
borderRadius: BorderRadius.circular(14),
),
child: Center(
child: Text(
"私聊",
style: TextStyle(fontSize: 14, color: Colors.white),
),
),
),),
);
],
),
),);
}
Widget _buildInfoRow(UserInfo userInfoBean) {
String ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age,
userInfoBean!.role, userInfoBean!.orientation);
return Row(
children: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: LinearGradient(
colors: [
Color.fromRGBO(141, 255, 248, 1.0),
Color.fromRGBO(181, 211, 255, 1.0),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
padding: EdgeInsets.only(
top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp),
child: Text(
ageMsg ,
style: TextStyle(
color: Colors.black,
fontSize: 10,
),
),
),
SizedBox(width: 6.sp),
],
);
}
String _getTitleName(String type) {
switch (type) {
case "0":
@ -61,23 +186,13 @@ class FriendslistPage extends StatelessWidget {
}
}
final RefreshController _refreshController = RefreshController();
int itemCount = 20;
void _onRefresh() async {
// Perform your refresh logic here
// For example, make an API call to fetch new data
await Future.delayed(Duration(seconds: 2));
itemCount = 20;
_refreshController.refreshCompleted();
logic.page = 1;
logic.initList();
}
void _onLoading() async {
// Perform your loading logic here
// For example, make an API call to fetch more data
await Future.delayed(Duration(seconds: 2));
itemCount += 10;
_refreshController.loadComplete();
logic.page = logic.page + 1;
logic.initList();
}
}

View File

@ -1,70 +1,95 @@
import 'dart:ffi';
import 'package:get/get.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import '../../router/app_routers.dart';
import '../../util/util.dart';
import '../userinfo/logic.dart';
import 'state.dart';
import 'package:shared_preferences/shared_preferences.dart';
class MinefragmentLogic extends GetxController {
final MinefragmentState state = MinefragmentState();
UserData? userInfoBean = null;
User? userInfoBean = null;
String ageMsg = "";
var isVip = 0;
var like_count = "0";
var like_me_count = "0";
var recent_visit_count = "0";
num like_me_count_new = 0;
num recent_visit_count_new = 0;
@override
void onInit() async{
void onInit() async {
super.onInit();
var data = await DioManager.instance
.get(url: Api.getUserMine);
var bean = BaseResponse<UserData>.fromJson(
data, (data) => UserData.fromJson(data));
if(bean.isSuccess()){
userInfoBean = bean.data;
if(userInfoBean!=null){
var data = await DioManager.instance.get(url: Api.getUserMine);
var bean = BaseResponse<ResponseBean>.fromJson(
data, (data) => ResponseBean.fromJson(data));
if (bean.isSuccess()) {
SharedPreferences prefs = await SharedPreferences.getInstance();
int likeMeCount = prefs.getInt("likeMeCount") ?? 0;
int recentVisitCount = prefs.getInt("recentVisitCount") ?? 0;
like_count = bean.data.likeCount.toString();
like_me_count = bean.data.likeMeCount.toString();
recent_visit_count = bean.data.recentVisitCount.toString();
// like_me_count_new = recentVisitCount.toInt() - bean.data.likeMeCount.toInt();
like_me_count_new = (likeMeCount as int) - (bean.data.likeMeCount).toInt();
recent_visit_count_new = recentVisitCount-bean.data.recentVisitCount;
prefs.setInt("likeMeCount", bean.data.likeMeCount);
prefs.setInt("recentVisitCount", bean.data.recentVisitCount);
userInfoBean = bean.data.user;
if (userInfoBean != null) {
isVip = userInfoBean!.vip;
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setInt('vip', isVip);
prefs.setInt('userId', userInfoBean!.id);
ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age, userInfoBean!.role, userInfoBean!.orientation);
ageMsg = getAgeCOntent(userInfoBean!.gender, userInfoBean!.age,
userInfoBean!.role, userInfoBean!.orientation);
}
update();
}else{
} else {
showToast(bean.msg);
}
}
jumpSetUp() {
Get.toNamed(AppRoutes.SetUpActivity);
}
}
class UserData {
final int id;
final String nickname;
final String avatar;
final String birthday;
final int age;
final int vip;
final int gender;
final int role;
final int orientation;
final double lng;
final double lat;
final String city;
UserData({
class User {
int id;
String nickname;
String avatar;
String signature;
String birthday;
int age;
int vip;
int gender;
int role;
int orientation;
double lng;
double lat;
String city;
String avatarThumb;
User({
required this.id,
required this.nickname,
required this.avatar,
required this.signature,
required this.birthday,
required this.age,
required this.vip,
@ -74,42 +99,54 @@ class UserData {
required this.lng,
required this.lat,
required this.city,
required this.avatarThumb,
});
factory UserData.fromJson(Map<String, dynamic> json) {
return UserData(
id: json['user']['id'],
nickname: json['user']['nickname'],
avatar: json['user']['avatar'],
birthday: json['user']['birthday'],
age: json['user']['age'],
vip: json['user']['vip'],
gender: json['user']['gender'],
role: json['user']['role'],
orientation: json['user']['orientation'],
lng: json['user']['lng'],
lat: json['user']['lat'],
city: json['user']['city'],
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'],
nickname: json['nickname'],
avatar: json['avatar'],
signature: json['signature'],
birthday: json['birthday'],
age: json['age'],
vip: json['vip'],
gender: json['gender'],
role: json['role'],
orientation: json['orientation'],
lng: json['lng'],
lat: json['lat'],
city: json['city'],
avatarThumb: json['avatar_thumb'],
);
}
}
class UserResponse {
final int code;
final String msg;
final UserData data;
class ResponseBean {
User user;
int likeCount;
int likeMeCount;
int recentVisitCount;
String? vipExpireDate;
int? vipExpireDays;
UserResponse({
required this.code,
required this.msg,
required this.data,
ResponseBean({
required this.user,
required this.likeCount,
required this.likeMeCount,
required this.recentVisitCount,
this.vipExpireDate,
this.vipExpireDays,
});
factory UserResponse.fromJson(Map<String, dynamic> json) {
return UserResponse(
code: json['code'],
msg: json['msg'],
data: UserData.fromJson(json['data']),
factory ResponseBean.fromJson(Map<String, dynamic> json) {
return ResponseBean(
user: User.fromJson(json['user']),
likeCount: json['like_count'],
likeMeCount: json['like_me_count'],
recentVisitCount: json['recent_visit_count'],
vipExpireDate: json['vip_expire_date'],
vipExpireDays: json['vip_expire_days'],
);
}
}

View File

@ -43,7 +43,7 @@ class MinefragmentPage extends StatelessWidget {
child: Column(
children: [
_buildAvatarRow(logic),
_FriendsRow(),
_FriendsRow(logic),
Container(
child: Image(
image: AssetImage(getHomeImage("icon_vip")),
@ -194,7 +194,7 @@ class MinefragmentPage extends StatelessWidget {
);
}
Widget _FriendsRow() {
Widget _FriendsRow(MinefragmentLogic logic) {
return Center(
child: Container(
width: Get.width,
@ -214,7 +214,7 @@ class MinefragmentPage extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"0",
logic.like_count,
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
@ -254,7 +254,7 @@ class MinefragmentPage extends StatelessWidget {
children: [
Container(
child: Text(
"0",
logic.like_me_count,
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
@ -287,7 +287,7 @@ class MinefragmentPage extends StatelessWidget {
right: 0.sp,
top: 15.sp,
child: Text(
"+123",
logic.like_me_count_new>0 ? logic.like_me_count_new.toString():"",
style: TextStyle(color: Color.fromRGBO(0, 255, 210, 1.0)),
),
)
@ -309,7 +309,7 @@ class MinefragmentPage extends StatelessWidget {
children: [
Container(
child: Text(
"0",
logic.recent_visit_count,
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
@ -342,7 +342,7 @@ class MinefragmentPage extends StatelessWidget {
right: 0.sp,
top: 15.sp,
child: Text(
"+123",
logic.recent_visit_count_new>0 ? logic.recent_visit_count_new.toString():"",
style: TextStyle(color: Color.fromRGBO(0, 255, 210, 1.0)),
),
)

View File

@ -1,3 +1,4 @@
import 'package:circle_app/util/util.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
@ -7,10 +8,13 @@ import '../../common/config.dart';
import '../../network/api.dart';
import '../../network/dio_manager.dart';
import '../../util/qiniu.dart';
import '../call_out/logic.dart';
import 'state.dart';
class ReportLogic extends GetxController {
final ReportState state = ReportState();
var userId = Get.arguments["userId"] ?? "";
int myPosition = -1;
TextEditingController textEditingController = TextEditingController();
List<MyObject> arrList = <MyObject>[
MyObject("涉嫌欺诈", false),
@ -26,6 +30,33 @@ class ReportLogic extends GetxController {
List<MyObject> getItemList() {
return arrList;
}
onSubmit()async{
if(myPosition== -1){
showToast("请选择举报类目");
return;
}
List myBean = [];
state.imaglist.forEach((element) {
myBean.add(MyBean(type: 1, url: element).toJson());
});
var data = await DioManager.instance.post(url: Api.postReport, params: {
"user_id" : userId,
"words" : textEditingController.text,
"obj_type" :1,
"obj_id":userId,
"reason":arrList[myPosition].name,
"album" :myBean
});
var bean = BaseResponse<String>.fromJson(data, (data) => data);
if(bean.isSuccess()){
Get.back();
}
showToast(bean.msg);
}
final ImagePicker _picker = ImagePicker();
var quToken = '';

View File

@ -32,7 +32,7 @@ class ReportPage extends StatelessWidget {
style: TextStyle(color: Colors.white),
),
onPressed: () {
showToast("提交");
logic.onSubmit();
},
),
body: Column(
@ -112,7 +112,7 @@ class ReportPage extends StatelessWidget {
),
),
Positioned(
right: 15.sp,
// right: 1.sp,
top: 160.sp,
child: Text(
'${controller.textEditingController.text.length}/200',
@ -169,8 +169,11 @@ class ReportPage extends StatelessWidget {
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: () {
controller.arrList[index].isSelect =
!controller.arrList[index].isSelect;
if(controller.myPosition != -1){
controller.arrList[controller.myPosition].isSelect = false;
}
controller.myPosition = index;
controller.arrList[index].isSelect = true;
controller.update();
},
child: _getItemSelect(controller.arrList[index]),

View File

@ -1,6 +1,6 @@
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
@ -28,8 +28,8 @@ class UserinfoLogic extends GetxController {
bool isUrgeStatus = false;
bool isOnline = false;
bool isShowAlbum = true;
bool isLike = false;
@override
void onInit() async {
@ -56,18 +56,16 @@ class UserinfoLogic extends GetxController {
showToast(bean.msg);
}
var myAlbumData = await DioManager.instance.get(url: Api.getMyAlbum,);
var myAlbumBean = BaseResponse<AlbumResponseBean>.fromJson(
myAlbumData, (myAlbumData) => AlbumResponseBean.fromJson(myAlbumData));
if(myAlbumBean.isSuccess()){
var myAlbumData = await DioManager.instance.get(
url: Api.getMyAlbum,
);
var myAlbumBean = BaseResponse<AlbumResponseBean>.fromJson(myAlbumData,
(myAlbumData) => AlbumResponseBean.fromJson(myAlbumData));
if (myAlbumBean.isSuccess()) {
myAlbumBean.data.lists.forEach((element) {
state.imaglist.add(element);
});
}
} else {
isMe = false;
var data = await DioManager.instance
@ -75,10 +73,11 @@ class UserinfoLogic extends GetxController {
var bean = BaseResponse<ResponseBean>.fromJson(
data, (data) => ResponseBean.fromJson(data));
if (bean.isSuccess()) {
isLikeFoMsg =
"${bean.data.imageUrgeCount}位圈友感兴趣,其中${bean.data.likeMeCount}位已催您更新";
isLike = bean.data.is_follow;
isLikeFoMsg = "${bean.data.imageUrgeCount}位圈友感兴趣,其中${bean.data.likeMeCount}位已催您更新";
userInfoBean = bean.data!.user;
isVip = userInfoBean!.vip;
onLineCity = userInfoBean!.isOnline == true ? "在线" : "离线";
if (userInfoBean!.city != null) {
onLineCity = "$onLineCity·${userInfoBean!.city}";
@ -90,22 +89,24 @@ class UserinfoLogic extends GetxController {
showToast(bean.msg);
}
var myAlbumData = await DioManager.instance.get(url: Api.getTaAlbum+userId+"/albums");
var myAlbumBean = BaseResponse<AlbumResponseBean>.fromJson(
myAlbumData, (myAlbumData) => AlbumResponseBean.fromJson(myAlbumData));
if(myAlbumBean.isSuccess()){
var myAlbumData = await DioManager.instance
.get(url: Api.getTaAlbum + userId + "/albums");
var myAlbumBean = BaseResponse<AlbumResponseBean>.fromJson(myAlbumData,
(myAlbumData) => AlbumResponseBean.fromJson(myAlbumData));
if (myAlbumBean.isSuccess()) {
myAlbumBean.data.lists.forEach((element) {
state.imaglist.add(AlbumListItem(id: element.id,type: element.type,url:element.url));
state.imaglist.add(AlbumListItem(
id: element.id, type: element.type, url: element.url));
});
}
var urgedata = await DioManager.instance.get(url: Api.getUrgeStatus+userId+"/urge/album/status");
var urgedata = await DioManager.instance
.get(url: Api.getUrgeStatus + userId + "/urge/album/status");
var urgeBean = BaseResponse<UrgentStatus>.fromJson(
urgedata, (urgedata) => UrgentStatus.fromJson(urgedata));
//if(urgedata.isSuccess()){
isUrgeStatus = urgeBean.data.isUrgent;
//}
}
update();
@ -119,28 +120,53 @@ class UserinfoLogic extends GetxController {
}
}
urgeChange() async{
var data = await DioManager.instance.post(url: Api.urgeAlbum+userId+"/urge/album");
urgeChange() async {
var data = await DioManager.instance
.post(url: "${Api.urgeAlbum + userId}/urge/album");
var bean = BaseResponse<String>.fromJson(data, (data) => data);
if(bean.isSuccess()){
if (bean.isSuccess()) {
showToast("催更成功");
isUrgeStatus = true;
update();
}
}
delAlbumImage(int index) async{
var data = await DioManager.instance.delete(url: Api.deleteAlbum+state.imaglist[index].id.toString());
delAlbumImage(int index) async {
var data = await DioManager.instance
.get(url: Api.deleteAlbum + state.imaglist[index].id.toString());
var bean = BaseResponse<String>.fromJson(data, (data) => data);
if(bean.code == 200){
if (bean.code == 200) {
state.imaglist.removeAt(index);
Navigator.pop(Get.context!);
update();
}
}
setLike() async {
var data = await DioManager.instance
.post(url: "${Api.setBlock + userId}/follow", params: {
'status': isLike?"0":"1"
});
var bean = BaseResponse<dynamic>.fromJson(data, (jsonData) => jsonData,);
if(bean.isSuccess()){
isLike = !isLike;
update();
}
showToast(bean.msg);
}
setBlock() async {
var data = await DioManager.instance
.post(url: "${Api.setBlock + userId}/block", params: {});
var bean = BaseResponse<dynamic>.fromJson(data, (jsonData) => jsonData,);
if(bean.isSuccess()){
Navigator.pop(Get.context!);
update();
}
showToast(bean.msg);
}
Future getImageFile() async {
try {
final XFile? pickedFile = await _picker.pickImage(
@ -152,23 +178,22 @@ class UserinfoLogic extends GetxController {
SmartDialog.showLoading();
upDataImage(quToken, pickedFile, CONFIG.USER_ALBUM_IMAGE, (result) async {
var data = await DioManager.instance.post(url: Api.updataAlbum,params: {
"type" :1,
"url": result
});
var data = await DioManager.instance
.post(url: Api.updataAlbum, params: {"type": 1, "url": result});
var myAlbumBean = BaseResponse<AddAlbum>.fromJson(
data, (data) => AddAlbum.fromJson(data));
if (myAlbumBean.code == 200) {
SmartDialog.dismiss();
state.imaglist.add(AlbumListItem(id:myAlbumBean.data.id,type:myAlbumBean.data.type,url: result));
state.imaglist.add(AlbumListItem(
id: myAlbumBean.data.id,
type: myAlbumBean.data.type,
url: result));
update();
}
});
} catch (e) {}
}
}
class UserBean {
@ -258,11 +283,13 @@ class ResponseBean {
UserBean user;
int likeMeCount;
int imageUrgeCount;
bool is_follow;
ResponseBean({
required this.user,
required this.likeMeCount,
required this.imageUrgeCount,
required this.is_follow
});
factory ResponseBean.fromJson(Map<String, dynamic> json) {
@ -270,6 +297,7 @@ class ResponseBean {
user: UserBean.fromJson(json['user']),
likeMeCount: json['like_me_count'],
imageUrgeCount: json['image_urge_count'],
is_follow: json['is_follow'],
);
}
}
@ -285,7 +313,8 @@ class AlbumResponseBean {
factory AlbumResponseBean.fromJson(Map<String, dynamic> json) {
return AlbumResponseBean(
lists: List<AlbumListItem>.from(json['lists'].map((x) => AlbumListItem.fromJson(x))),
lists: List<AlbumListItem>.from(
json['lists'].map((x) => AlbumListItem.fromJson(x))),
total: json['total'],
);
}
@ -311,7 +340,6 @@ class AlbumListItem {
}
}
class AddAlbum {
int id;
int type;
@ -345,5 +373,3 @@ class UrgentStatus {
);
}
}

View File

@ -23,12 +23,13 @@ class _MyTabbedScreenState extends State<UserinfoPage>
ScrollController scrollController = ScrollController();
bool isShowBlackTitle = false;
@override
void initState() {
super.initState();
_tabController = TabController(length: 2, vsync: this,animationDuration: Duration(seconds: 0));
_tabController.addListener(_handleTabChange);
_tabController = TabController(
length: 2, vsync: this, animationDuration: Duration(milliseconds: 200));
_tabController.animation!.addListener(_handleTabChange);
// _tabController.addListener(_handleTabChange);
// _tabController
}
@ -47,6 +48,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
_tabController.dispose();
super.dispose();
}
void _onScroll(offset) {
if (offset > 100) {
setState(() {
@ -79,7 +81,9 @@ class _MyTabbedScreenState extends State<UserinfoPage>
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: MyAppBar(
centerTitle: logic.userInfoBean!=null? logic.userInfoBean!.nickname+"的主页":"个人主页",
centerTitle: logic.userInfoBean != null
? logic.userInfoBean!.nickname + "的主页"
: "个人主页",
),
body: Stack(
children: [
@ -89,7 +93,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
Positioned(
bottom: 27.sp,
width: Get.width,
child: _MeInfoButton(logic),
child: logic.isShowAlbum ? _MeInfoButton(logic) : Container(),
)
],
),
@ -98,38 +102,8 @@ class _MyTabbedScreenState extends State<UserinfoPage>
}
Widget _MeInfoButton(UserinfoLogic controller) {
if (controller.userId == "") {
return GestureDetector(
onTap: () {
// showToast("完善资料");
Get.toNamed(AppRoutes.Complete_materialPage, arguments: "user");
// controller.onInit();
},
child: Center(
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: 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: Text(
"完善个人形象",
style: TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
),
);
if (controller.isMe) {
return Container();
} else {
return Container(
margin: EdgeInsets.only(left: 18.sp, right: 18.sp),
@ -149,9 +123,11 @@ class _MyTabbedScreenState extends State<UserinfoPage>
),
GestureDetector(
onTap: () {
showToast("喜欢");
logic.setLike();
},
child: Container(
width: 130.sp,
height: 34.sp,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17.sp),
gradient: LinearGradient(
@ -163,10 +139,9 @@ class _MyTabbedScreenState extends State<UserinfoPage>
end: Alignment.centerRight,
),
),
padding: EdgeInsets.only(
top: 10.sp, bottom: 10.sp, left: 52.sp, right: 52.sp),
child: Center(
child: Text(
"喜欢",
logic.isLike ? "取消喜欢" : "喜欢",
style: TextStyle(
color: Colors.white,
fontSize: 12.sp,
@ -174,11 +149,14 @@ class _MyTabbedScreenState extends State<UserinfoPage>
),
),
),
),
GestureDetector(
onTap: () {
showToast("私聊");
},
child: Container(
width: 130.sp,
height: 34.sp,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17.sp),
gradient: LinearGradient(
@ -190,8 +168,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
end: Alignment.centerRight,
),
),
padding: EdgeInsets.only(
top: 10.sp, bottom: 10.sp, left: 52.sp, right: 52.sp),
child: Center(
child: Text(
"私聊",
style: TextStyle(
@ -200,6 +177,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
),
),
),
),
)
],
),
@ -226,7 +204,9 @@ class _MyTabbedScreenState extends State<UserinfoPage>
Row(
children: [
Text(
controller.userInfoBean!=null ?controller.userInfoBean!.nickname:"" ,
controller.userInfoBean != null
? controller.userInfoBean!.nickname
: "",
style: TextStyle(
color: Color.fromRGBO(247, 250, 250, 1.0),
fontSize: 16,
@ -240,16 +220,21 @@ class _MyTabbedScreenState extends State<UserinfoPage>
children: [
Container(
margin: EdgeInsets.only(right: 5.sp),
width:5.sp,
width: 5.sp,
height: 5.sp,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: logic.isOnline? Color(0xFF00FFF4): Color(0xFF787575),
color: logic.isOnline
? Color(0xFF00FFF4)
: Color(0xFF787575),
),
),
Text(
controller.onLineCity,
style: TextStyle(color: logic.isOnline? Color(0xFF00FFF4): Color(0xFF787575)),
style: TextStyle(
color: logic.isOnline
? Color(0xFF00FFF4)
: Color(0xFF787575)),
)
],
),
@ -259,7 +244,9 @@ class _MyTabbedScreenState extends State<UserinfoPage>
// margin: EdgeInsets.only(top: 18.sp, bottom: 18.sp),
height: 59.sp,
child: ListView.builder(
itemCount: controller.userInfoBean==null ? 0 : controller.userInfoBean!.interests.length,
itemCount: controller.userInfoBean == null
? 0
: controller.userInfoBean!.interests.length,
// item
scrollDirection: Axis.horizontal,
//
@ -306,14 +293,6 @@ class _MyTabbedScreenState extends State<UserinfoPage>
),
),
titleTab(controller),
Visibility(
visible: logic.isShowAlbum,
child: Container(
margin: EdgeInsets.only(top: 18.sp, bottom: 14.sp),
child: controller.isMe? Text(
controller.isLikeFoMsg,
style: TextStyle(color: Colors.white30),
) :Container())) ,
Expanded(
child: Container(
// color: Colors.blue,
@ -329,7 +308,8 @@ class _MyTabbedScreenState extends State<UserinfoPage>
),
);
}
Widget titleTab(UserinfoLogic controller){
Widget titleTab(UserinfoLogic controller) {
return Container(
alignment: Alignment.centerLeft,
height: 27.sp,
@ -351,9 +331,11 @@ class _MyTabbedScreenState extends State<UserinfoPage>
Tab(text: "喊话")
],
),
GestureDetector(onTap: (){
controller.isMe? controller.isEdit = !controller.isEdit : controller.urgeChange();
GestureDetector(
onTap: () {
controller.isMe
? controller.isEdit = !controller.isEdit
: controller.urgeChange();
controller.update();
// controller.updataImage();
},
@ -374,34 +356,59 @@ class _MyTabbedScreenState extends State<UserinfoPage>
padding: EdgeInsets.only(
top: 2.sp, bottom: 2.sp, left: 12.sp, right: 12.sp),
child: Text(
controller.isMe? controller.isEdit?"完成": "管理" : controller.isUrgeStatus? "已催更":"催更",
controller.isMe
? controller.isEdit
? "完成"
: "管理"
: controller.isUrgeStatus
? "已催更"
: "催更",
style: const TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),),),
),
),
),
],
));
}
Widget _imageAdapter(UserinfoLogic controller) {
return GridView.builder(
return Stack(children: [
Container(
child: Column(
// mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
margin: EdgeInsets.only(top: 18.sp, bottom: 14.sp),
child: controller.isMe
? Text(
controller.isLikeFoMsg,
style: const TextStyle(color: Colors.white30),
)
: Container()),
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, //
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 (controller.isMe && controller.isEdit) {
if (index == 0) {
//
return GestureDetector(
onTap: () {
controller.getImageFile();
},
child: Container(
margin: EdgeInsets.all(5.sp),
@ -415,24 +422,62 @@ class _MyTabbedScreenState extends State<UserinfoPage>
margin: EdgeInsets.all(5.sp),
child: Center(
child: _buildImageItem(
controller.state.imaglist[index-1].url,
controller,index-1)),
controller.state.imaglist[index - 1].url,
controller,
index - 1)),
);
}
}else{
} else {
return Container(
margin: EdgeInsets.all(5.sp),
child: Center(
child: _buildImageItem(
controller.state.imaglist[index].url,
controller,index)),
controller,
index)),
);
}
},
);
)
],
),
),
Positioned(
left: 0,
right: 0,
bottom: 27.sp,
child: GestureDetector(
onTap: () {
// showToast("完善资料");
Get.toNamed(AppRoutes.Complete_materialPage, arguments: "user");
// controller.onInit();
},
child: Center(
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: 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: Text(
"完善个人形象",
style: TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
),
))
],);
}
Widget _buildInfoRow(UserinfoLogic controller) {
@ -453,7 +498,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
padding: EdgeInsets.only(
top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp),
child: Text(
controller.ageMsg ,
controller.ageMsg,
style: TextStyle(
color: Colors.black,
fontSize: 10,
@ -461,12 +506,13 @@ class _MyTabbedScreenState extends State<UserinfoPage>
),
),
SizedBox(width: 6.sp),
controller.isVip>0 ?
Image(
controller.isVip > 0
? Image(
image: AssetImage(getBaseImage("vip")),
width: 44.sp,
height: 18.sp,
):Container(),
)
: Container(),
],
);
}
@ -485,7 +531,9 @@ class _MyTabbedScreenState extends State<UserinfoPage>
margin: EdgeInsets.only(left: 24.sp),
child: Center(
child: Text(
controller.userInfoBean!=null ? controller.userInfoBean!.signature:"",
controller.userInfoBean != null
? controller.userInfoBean!.signature
: "",
maxLines: 2,
style: TextStyle(color: Colors.white),
overflow: TextOverflow.ellipsis,
@ -521,21 +569,19 @@ class _MyTabbedScreenState extends State<UserinfoPage>
}
Widget _buildAvatar1(UserinfoLogic controller) {
if(controller.userInfoBean==null){
if (controller.userInfoBean == null) {
return Container(
width: 66.sp,
height: 66.sp,
);
}else {
} else {
return ClipOval(
child: GestureDetector(
onTap: () {
var imgList = <String>[];
imgList.add(controller.userInfoBean!.avatar);
Get.toNamed(AppRoutes.Swiper, arguments: {
'imaglist': imgList,
'index': 0
});
Get.toNamed(AppRoutes.Swiper,
arguments: {'imaglist': imgList, 'index': 0});
},
child: CachedNetworkImage(
imageUrl: controller.userInfoBean != null
@ -549,7 +595,7 @@ class _MyTabbedScreenState extends State<UserinfoPage>
}
}
Widget _buildImageItem(String url, UserinfoLogic controller,int index) {
Widget _buildImageItem(String url, UserinfoLogic controller, int index) {
return Stack(
children: [
Container(
@ -563,10 +609,8 @@ class _MyTabbedScreenState extends State<UserinfoPage>
controller.state.imaglist.forEach((element) {
imaglist.add(element.url);
});
Get.toNamed(AppRoutes.Swiper, arguments: {
'imaglist':imaglist,
'index':index
});
Get.toNamed(AppRoutes.Swiper,
arguments: {'imaglist': imaglist, 'index': index});
},
child: Image.network(
fit: BoxFit.cover,
@ -582,14 +626,15 @@ class _MyTabbedScreenState extends State<UserinfoPage>
child: GestureDetector(
onTap: () {
// showToast("删除");
_showDelImgDialog(context,controller,index);
_showDelImgDialog(context, controller, index);
},
child:controller.isEdit? Image(
child: controller.isEdit
? Image(
image: AssetImage(getMineImage("icon_img_del")),
width: 20.sp,
height: 20.sp,
):Container(),
)
: Container(),
))
],
);
@ -626,7 +671,8 @@ class _MyTabbedScreenState extends State<UserinfoPage>
GestureDetector(
onTap: () {
Navigator.pop(context);
Get.toNamed(AppRoutes.ReportActivity);
Get.toNamed(AppRoutes.ReportActivity,
arguments: {"userId": logic.userId});
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
@ -677,9 +723,8 @@ class _MyTabbedScreenState extends State<UserinfoPage>
);
}
void _showDelImgDialog(BuildContext context,UserinfoLogic controller,int index) {
void _showDelImgDialog(
BuildContext context, UserinfoLogic controller, int index) {
showDialog(
context: context,
builder: (BuildContext context) {
@ -775,9 +820,6 @@ class _MyTabbedScreenState extends State<UserinfoPage>
onTap: () {
Navigator.pop(context);
controller.delAlbumImage(index);
},
child: Container(
margin: EdgeInsets.only(top: 24.sp),
@ -819,10 +861,6 @@ class _MyTabbedScreenState extends State<UserinfoPage>
);
}
void _showReportDialog(BuildContext context) {
showDialog(
context: context,
@ -925,7 +963,9 @@ class _MyTabbedScreenState extends State<UserinfoPage>
),
SizedBox(width: 24.sp),
GestureDetector(
onTap: () {},
onTap: () {
logic.setBlock();
},
child: Container(
margin: EdgeInsets.only(top: 24.sp),
decoration: BoxDecoration(

View File

@ -86,6 +86,35 @@ class Api {
static const getUrgeStatus = 'up-service/user/';
//
static const setBlock = 'user-service/user/';
//
static const setLike = 'user-service/user/';
//
static const followList = 'user-service/follow/users';
//
static const fansList = 'user-service/fans/users';
//
static const visitList = 'user-service/visit/users';
//
static const postReport = 'up-service/report';