circle_app/circle_app/lib/circle_app/userinfo/view.dart
2024-08-13 09:42:07 +08:00

1775 lines
65 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:async';
import 'dart:ui';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:circle_app/circle_app/userinfo/widgets/home_call_out.dart';
import 'package:circle_app/commons/Widgets/base_tip_widget.dart';
import 'package:circle_app/commons/Widgets/user_share.dart';
import 'package:circle_app/commons/colors/app_color.dart';
import 'package:circle_app/commons/const.dart';
import 'package:circle_app/main.dart';
import 'package:circle_app/net/api.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../commons/Widgets/tag_widget.dart';
import '../../commons/Widgets/my_app_bar.dart';
import '../../router/routers.dart';
import '../../utils/cache_img.dart';
import '../../utils/eventBus.dart';
import '../../utils/util.dart';
import '../../view/notice.dart';
import '../circle_list/widgets/right_circle_iten.dart';
import '../home/logic.dart';
import '../select_circle/logic.dart';
import 'logic.dart';
class UserinfoPage extends StatefulWidget {
const UserinfoPage({super.key});
@override
MyTabbedScreenState createState() => MyTabbedScreenState();
}
class MyTabbedScreenState extends State<UserinfoPage>
with SingleTickerProviderStateMixin, RouteAware {
late TabController _tabController;
ScrollController scrollController = ScrollController();
bool isShowBlackTitle = false;
bool isSetState = false;
int countdown = 5;
Timer? timer = null;
var sub;
@override
void initState() {
super.initState();
sub = EventBusManager.on<ScrollViewScrollTop>().listen((event) {
if (isSetState) {
isSetState = false;
scrollController.animateTo(0,
duration: Duration(milliseconds: 250), curve: Curves.easeIn);
}
});
scrollController.addListener(() {
if (scrollController.position.pixels ==
scrollController.position.maxScrollExtent) {
print('2222');
isSetState = true;
EventBusManager.fire(ScrollViewIsEnd(true));
// setState(() {});
} else {
EventBusManager.fire(ScrollViewIsEnd(false));
if (isSetState) {
isSetState = false;
// setState(() {});
}
}
});
_tabController = TabController(length: 2, vsync: this);
_tabController.animation!.addListener(_handleTabChange);
starTimer();
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
/// 路由订阅
routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute);
}
void didPopNext() {
print('didPopNext');
if (logic.userId.isEmpty) {
logic.fetchUserInfo(Api.getUserInfo);
}
}
///当前页面进入时触发
void didPush() {
print('didPopNext');
}
void didPop() {
print('didPop');
}
void _handleTabChange() {
// 在这里可以执行滑动监听后的逻辑操作
// 比如根据当前选中的标签执行其他操作
// int currentIndex = .toString());
logic.isShowAlbum = _tabController.index == 0;
logic.update();
}
@override
void dispose() {
_tabController.dispose();
timer?.cancel();
sub.cancel();
routeObserver.unsubscribe(this);
super.dispose();
}
final logic = Get.find<UserinfoLogic>();
final state = Get.find<UserinfoLogic>().state;
HomeLogic homeLogic = Get.find<HomeLogic>();
@override
Widget build(BuildContext context) {
return GetBuilder<UserinfoLogic>(
builder: (logic) {
return _buildPage(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: homeLogic.isProd
? MyAppBar(
centerTitle: logic.userInfoBean != null
? "${logic.userInfoBean!.nickname}"
: "个人主页",
actionWdiget: logic.isMe
? GestureDetector(
onTap: () async {
if (logic.userInfoBean!.contact.isNotEmpty) {
showUpdateWxPicker();
} else {
await showAddWxPicker(
logic.userInfoBean!.contact!.isNotEmpty ?? false,
isHidden:
logic.userInfoBean!.contact!.isNotEmpty ??
false,
isWxHidden:
logic.userInfoBean!.contact.contains('*'),
);
logic.fetchUserInfo(Api.getUserInfo);
}
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 111.sp,
height: 26.sp,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.sp),
gradient: LinearGradient(
colors: [
Color(0xFF30FFD9),
Color(0xFFDD3DF4)
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
),
Container(
width: 110.sp,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(11.sp),
color: Color(0xFF240F3B)),
alignment: Alignment.center,
height: 24.sp,
child: Text(
logic.userInfoBean != null
? logic.userInfoBean!.contact.isNotEmpty
? '联系方式设置'
: '填联系方式赚钱'
: '填联系方式赚钱',
style: TextStyle(
color: Colors.white, fontSize: 14.sp),
),
)
],
),
)
: logic.userInfoBean != null
? logic.userInfoBean!.contact.isEmpty
? GestureDetector(
onTap: () {
logic.sendWhatToWx();
},
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 111.sp,
height: 26.sp,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(12.sp),
gradient: LinearGradient(
colors: [
Color(0xFF30FFD9),
Color(0xFFDD3DF4)
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
),
Container(
width: 110.sp,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(11.sp),
color: Color(0xFF240F3B)),
alignment: Alignment.center,
height: 24.sp,
child: Row(
mainAxisAlignment:
MainAxisAlignment.center,
children: [
Image.asset(
getDisCoverImage('wx'),
width: 20.sp,
),
SizedBox(
width: 2.sp,
),
Text(
'想要联系方式',
style: TextStyle(
color: Colors.white,
fontSize: 13.sp),
),
],
),
)
],
),
)
: Container(
alignment: Alignment.centerLeft,
// width: 200.sp,
// color: Colors.red,
margin:
EdgeInsets.only(left: 5.sp, bottom: 5.sp),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
userWxStatusWidget(
!logic.userInfoBean!.contact!
.contains('*'),
logic.userInfoBean!.contact!,
logic.userId.toString(),
logic.userInfoBean!.contactType!,
logic.userInfoBean!.avatar!, () {
logic.fetchUserInfo(
"${Api.getUserInfoTA + logic.userId}/home");
}),
],
))
: Container())
: MyAppBar(
centerTitle: logic.userInfoBean != null
? "${logic.userInfoBean!.nickname}"
: "个人主页",
),
body: Stack(
// fit: StackFit.expand,
children: [
Container(
height: Get.height,
width: Get.width,
// color: Colors.red,
child: NestedScrollView(
// controller: scrollController,
headerSliverBuilder: (context, isScrolled) {
return [
SliverToBoxAdapter(
child: buildContent(logic),
),
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver:SliverPersistentHeader(
pinned: true,
delegate: MySliverAppBarDelegate(
minHeight: 35,
maxHeight: 35,
child: titleTab(logic),
),
)),
];
},
body: contentWidget(logic),
)),
Positioned(
bottom: 27.sp,
width: Get.width,
child: _meInfoButton(logic),
),
// !logic.isShowAlbum && logic.isMe
// ? Positioned(
// bottom: 36.sp,
// right: 10.sp,
// child: GestureDetector(
// onTap: () async {
// List<MyConfigData> numbers = [];
//
// var data = await Get.toNamed(Routes.CallOutPage,
// arguments: {'numbers': numbers});
// },
// child: Image.asset(
// getCircleImage('send_msg'),
// width: 60.sp,
// )))
// : Container()
],
),
),
);
}
Widget _meInfoButton(UserinfoLogic controller) {
if (controller.isMe) {
return GestureDetector(
onTap: () async {
await Get.toNamed(
Routes.Complete_materialPage,
arguments: "user",
);
logic.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.symmetric(
vertical: 10.sp,
horizontal: 55.sp,
),
child: const Text(
"完善个人形象",
style: TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
));
} else {
final likeButton = GestureDetector(
onTap: () {
_showBottomSheet(context, controller);
},
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.isBlack || logic.isDestroy || logic.isBlackBeen) {
showOKToast("私聊失败,存在拉黑关系或者该账户已注销");
return;
}
if (logic.userInfoBean != null) {
String msg = Get.previousRoute;
if (msg == Routes.Chat) {
Get.back();
} else {
pushChatPage(logic.userInfoBean!.id.toString(), 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(0xffDC5BFD),
Color(0xff06F9FA),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
child: Center(child: chatText),
),
);
return Container(
margin: EdgeInsets.only(left: 18.sp, right: 18.sp),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
likeButton,
GestureDetector(
onTap: () {
logic.setLike();
},
child: Container(
width: 130.sp,
height: 34.sp,
decoration: gradientDecoration,
child: Center(child: likeText),
),
),
chatButton,
],
),
);
}
}
Widget buildContent(UserinfoLogic controller) {
final userInfoBean = controller.userInfoBean;
final interests = userInfoBean?.interests ?? [];
return Container(
width: Get.width,
padding: EdgeInsets.symmetric(vertical: 14.sp),
child: Column(
children: [
Container(
height: 68.sp,
padding: EdgeInsets.symmetric(horizontal: 15.sp),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_imagelistView(controller),
Expanded(
child: buildUserContainer(controller),
),
],
),
),
Container(
padding: EdgeInsets.symmetric(
horizontal: 15.sp,
),
margin: EdgeInsets.only(top: 13.sp),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Text(
userInfoBean?.nickname ?? "",
style: TextStyle(
color: Color.fromRGBO(247, 250, 250, 1.0),
fontSize: 14.sp,
),
),
SizedBox(width: 8.sp),
if ((controller.userInfoBean?.mark ?? 0) > 0)
UserTagWidget(controller.userInfoBean!.mark!),
],
),
Container(
child: Row(
children: [
Container(
margin: EdgeInsets.only(right: 5.sp),
width: 5.sp,
height: 5.sp,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: logic.isOnline
? const Color(0xFF00FFF4)
: const Color(0x00000000),
),
),
logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: Text(
controller.onLineCity,
style: TextStyle(
fontSize: 12.sp,
color: logic.isOnline
? const Color(0xFF00FFF4)
: const Color(0xFF00FFF4),
),
),
],
),
),
],
),
),
Container(
padding: EdgeInsets.symmetric(
horizontal: 15.sp,
),
margin: EdgeInsets.only(top: 4.sp),
child: Row(
children: [
logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: _buildInfoRow(controller),
Expanded(child: Container()),
Text(
'常住城市:' + (controller.userInfoBean?.city ?? ''),
style: TextStyle(
fontSize: 12.sp,
color: logic.isOnline
? const Color(0xFF00FFF4)
: const Color(0xFF00FFF4),
),
),
],
),
),
SizedBox(
height: 78.sp,
child: logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: _buildInterestsListView(interests),
),
// if (!logic.isMe)
// logic.userInfoBean != null
// ? logic.userInfoBean!.contact!.isNotEmpty
// ? Container(
// alignment: Alignment.centerLeft,
// // width: 200.sp,
// // color: Colors.red,
// margin: EdgeInsets.only(left: 5.sp, bottom: 5.sp),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.start,
// children: [
// wxStatusWidget(
// !logic.userInfoBean!.contact!.contains('*'),
// logic.userInfoBean!.contact!,
// logic.userId.toString(),
// logic.userInfoBean!.contactType!,
// logic.userInfoBean!.avatar!, () {
// logic.fetchUserInfo(
// "${Api.getUserInfoTA + logic.userId}/home");
// }),
// ],
// ))
// : Container()
// : Container(),
if (logic.userInfoBean != null && logic.giftList.isNotEmpty)
GestureDetector(
onTap: () async {
var result = await Get.toNamed(Routes.GiftShopPage,
arguments: logic.userId);
logic.loadGiftListData();
},
child: Container(
margin: EdgeInsets.only(
top: 0.sp, left: 15.sp, right: 10.sp, bottom: 0.sp),
padding: EdgeInsets.only(left: 12.sp, right: 12.sp, top: 16.sp),
height: 134.sp,
decoration: BoxDecoration(
color: Color(0x1AFFFFFF),
borderRadius: BorderRadius.circular(14.sp)),
child: Column(
children: [
Container(
child: Row(
children: [
Image.asset(
getMineImage('gift_shop'),
width: 65.sp,
),
Expanded(child: Container()),
Text(
logic.toUser.isNotEmpty ? '贡献之星' : '贡献之星还在路上',
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
),
),
if (logic.toUser.isNotEmpty)
SizedBox(
width: 6.sp,
),
if (logic.toUser.isNotEmpty)
Text(
'${logic.toUser['nickname']}',
style: TextStyle(
color: AppColor.mainColor,
fontSize: 14.sp,
),
),
SizedBox(
width: 8.sp,
),
Image.asset(
getMineImage('chevron_left'),
width: 14.sp,
),
],
),
),
Expanded(
child: Container(
margin: EdgeInsets.only(top: 10.sp),
alignment: Alignment.centerLeft,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: logic.giftList.length,
itemBuilder: (BuildContext context, int giftIndex) {
var info = logic.giftList[giftIndex];
bool isGet = false;
int num = 0;
logic.recevigiftList.forEach((element) {
if (element['giftId'] == info['id']) {
isGet = true;
num = element['num'];
}
});
return GestureDetector(
onTap: () {},
child: Container(
margin: EdgeInsets.only(right: 10.sp),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Stack(children: [
Opacity(
opacity: !isGet ? 0.6 : 1,
child: Image.network(
info['icon'],
width: 50.sp,
height: 50.sp,
fit: BoxFit.cover,
),
),
]),
SizedBox(
height: 6.sp,
),
GestureDetector(
onTap: () {
logic.sendGiftData(
logic.imId,
info['id'].toString(),
logic.imId.split('_').last,
);
},
child: Container(
height: 20.sp,
width: 52.sp,
// padding: EdgeInsets.only(left: 5.sp,right: 5.sp),
alignment: Alignment.center,
decoration: BoxDecoration(
gradient:
AppColor.mainVerLinearGradient,
borderRadius:
BorderRadius.circular(10.sp)),
child: Text(
!isGet ? '点亮' : '赠送',
style: TextStyle(
color: Colors.white,
fontSize: 11.sp),
),
),
)
],
),
),
);
}),
))
],
),
),
),
// titleTab(controller),
],
),
);
// Expanded(
// child: PageView(
// controller: _pageController,
// onPageChanged: (index) {
// _tabController.animateTo(index);
// },
// children: [
// logic.isBlack || logic.isDestroy || logic.isBlackBeen
// ? Container()
// : _imageAdapter(controller),
// logic.isBlack || logic.isDestroy || logic.isBlackBeen
// ? Container()
// : HomeCallOutView(controller.userId),
// ],
// ),
// ),
}
contentWidget(UserinfoLogic controller) {
return Column(
children: [
SizedBox(height: 35.sp,),
Expanded(
child: TabBarView(
controller: _tabController,
// controller: _pageController,
// onPageChanged: (index) {
// _tabController.animateTo(index);
// },
children: [
logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: _imageAdapter(controller),
logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: HomeCallOutView(controller.userId),
],
),
),
],
);
}
Widget _buildInterestsListView(List<Interest> interests) {
return ListView.builder(
itemCount: interests.length,
scrollDirection: Axis.horizontal,
padding: EdgeInsets.symmetric(vertical: 15.sp, horizontal: 15.sp),
itemBuilder: (context, index) {
final interest = interests[index];
return GestureDetector(
onTap: () {
Get.toNamed(Routes.SignalCircleListPage,
arguments: interests[index].id);
},
child: Container(
margin: EdgeInsets.only(right: 11.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
gradient: const LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
),
color: const Color(0xFF392D53),
),
child: Container(
margin: EdgeInsets.all(0.2.sp),
padding: EdgeInsets.only(left: 5.sp, right: 0.sp, top: 5.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
color: const Color(0xFF392D53),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
// color: Colors.red,
child: Row(
children: [
Text(
interest.title,
style: TextStyle(
fontSize: 13.sp,
color: Colors.white,
),
),
Container(
margin: EdgeInsets.only(
bottom: 2.sp,
),
child: Icon(
Icons.keyboard_arrow_right,
color: Colors.white,
size: 18.sp,
),
)
],
),
),
Text(
'${interest.viewTotal}人看过',
style: TextStyle(
fontSize: 13.sp,
color: AppColor.mainColor,
),
),
],
)),
),
);
},
);
}
Widget titleTab(UserinfoLogic controller) {
String buttonText = "";
if (controller.isMe) {
if (logic.isShowAlbum) {
buttonText = controller.isEdit ? "完成" : "管理";
} else {
buttonText = "发布喊话";
}
} else {
buttonText = controller.isUrgeStatus ? "已催更" : "催更";
}
return Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(left: 0, right: 10.sp),
height: 27.sp,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TabBar(
isScrollable: true,
controller: _tabController,
indicator: UnderlineTabIndicator(
borderSide: BorderSide(
color: const Color(0xFF00FFF4),
width: 2.sp,
),
insets: EdgeInsets.symmetric(horizontal: 12.0.sp),
borderRadius: BorderRadius.circular(18.0),
),
indicatorColor: const Color(0xFF00FFF4),
indicatorWeight: 2.sp,
labelColor: const Color(0xFF00FFF4),
unselectedLabelColor: const Color(0xB3FFFFFF),
indicatorSize: TabBarIndicatorSize.label,
tabs: const [
Tab(
text: "形象照",
),
Tab(text: "喊话"),
],
// onTap: (index) {
// _pageController.animateToPage(
// index, // 目标页面索引
// duration: const Duration(milliseconds: 300), // 动画时长
// curve: Curves.ease, // 动画曲线
// );
// },
),
logic.isBlack || logic.isDestroy || logic.isBlackBeen
? Container()
: _tabController.index == 0
? logic.isShowAlbum && logic.isMe
? Container(
child: ShaderMask(
shaderCallback: (Rect bounds) {
return LinearGradient(
begin: Alignment.centerRight,
end: Alignment.centerLeft,
colors: [Color(0xffF657FF), AppColor.mainColor],
).createShader(Offset.zero & bounds.size);
},
child: Text(
'真实露脸照更受欢迎',
style: TextStyle(
fontSize: 12.sp,
fontWeight: FontWeight.w600,
color: Colors.white),
),
),
)
: Container()
: _tabController.index == 1 && logic.isMe ? GestureDetector(
onTap: () {
if (!logic.isShowAlbum && controller.isMe) {
List<MyConfigData> numbers = [];
var data = Get.toNamed(Routes.CallOutPage,
arguments: {'numbers': numbers});
return;
}
if (controller.isMe) {
controller.isEdit = !controller.isEdit;
controller.update();
} else {
controller.urgeChange();
}
},
child: Container(
margin: EdgeInsets.only(left: 10.sp),
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(
buttonText,
style: const TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
) : Container(),
],
),
);
}
Widget _imageAdapter(UserinfoLogic controller) {
//print(controller.state.imaglist);
// :
return Container(
// margin: EdgeInsets.only( 0.sp),
padding: EdgeInsets.symmetric(horizontal: 19.sp),
child: Stack(
children: [
Column(
children: [
if (controller.isMe)
Container(
margin: EdgeInsets.only(top: 18.sp, bottom: 14.sp),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
controller.likeMeCount.toString(),
style: TextStyle(color: AppColor.mainColor),
),
Text(
'位圈友感兴趣,其中',
style: const TextStyle(color: Colors.white30),
),
Text(
controller.imageUrgeCount.toString(),
style: TextStyle(color: AppColor.mainColor),
),
Text(
'位已催您更新',
style: const TextStyle(color: Colors.white30),
),
],
),
),
controller.state.imaglist.isEmpty && !controller.isMe
? Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
const SizedBox(
height: 30,
),
Image.asset(
getBaseImage('no_result'),
width: 200,
// height: 11,
),
const SizedBox(
height: 26,
),
Text(
controller.isMe
? "点击管理即可上传形象照哦~"
: "TA还没有发布过形象照快去催TA更新吧~",
style: const TextStyle(color: Colors.white30),
),
]),
)
: Expanded(
child: GridView.builder(
physics: ClampingScrollPhysics(),
padding: const EdgeInsets.only(bottom: 58.0),
shrinkWrap: true,
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
),
itemCount: controller.isMe
// ? controller.isEdit
// ? controller.state.imaglist.length < 15
// ? controller.state.imaglist.length
? controller.state.imaglist.length + 1
: controller.state.imaglist.length,
itemBuilder: (BuildContext context, int index) {
// print("123123123123");
if (controller.isMe) {
if (index == 0) {
return GestureDetector(
onTap: () {
if (controller.state.imaglist.length >= 15) {
showOKToast("最多只能上传15张可长按删除一些再上传~");
return;
}
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,
controller.state.imaglist[index - 1].isTop,
),
),
);
}
} else {
return Container(
margin: EdgeInsets.all(5.sp),
child: Center(
child: _buildImageItem(
controller.state.imaglist[index].urlThumb,
controller,
index,
0),
),
);
}
},
),
),
],
),
],
),
);
}
Widget _buildInfoRow(UserinfoLogic controller) {
return Row(
children: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: const LinearGradient(
colors: [
Color.fromRGBO(141, 255, 248, 1.0),
Color.fromRGBO(181, 211, 255, 1.0),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
padding: EdgeInsets.only(
top: 2.sp,
bottom: 2.sp,
left: 10.sp,
right: 10.sp,
),
child: Text(
controller.ageMsg,
style: const TextStyle(
color: Colors.black,
fontSize: 10,
),
),
),
const SizedBox(width: 6),
],
);
}
Widget buildUserContainer(UserinfoLogic controller) {
return Container(
margin: EdgeInsets.only(left: 3.sp),
height: 58.sp,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getMineImage("icon_user_content")),
fit: BoxFit.fill,
),
),
child: Container(
margin: EdgeInsets.only(left: 24.sp),
child: Center(
child: Text(
controller.userInfoBean != null
? controller.userInfoBean!.signature
: "",
maxLines: 2,
style: TextStyle(color: Colors.white, fontSize: 15.sp),
overflow: TextOverflow.ellipsis,
),
),
),
);
}
Widget _imagelistView(UserinfoLogic controller) {
return Stack(
alignment: Alignment.center,
children: [
Container(
width: 68.sp,
height: 68.sp,
decoration: const BoxDecoration(
shape: BoxShape.circle,
gradient: LinearGradient(
colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
),
SizedBox(
width: 66.sp,
height: 66.sp,
child: _buildAvatar1(controller),
),
],
);
}
Widget _buildAvatar1(UserinfoLogic controller) {
if (controller.userInfoBean == null) {
return SizedBox(
width: 66.sp,
height: 66.sp,
);
} else {
return ClipOval(
child: GestureDetector(
onTap: () {
var imgList = <String>[];
imgList.add(controller.userInfoBean!.avatar);
Get.toNamed(Routes.SwiperPage,
arguments: {'imaglist': imgList, 'index': 0});
},
child: CachedImg(
fit: BoxFit.cover,
imageUrl: controller.userInfoBean != null
? controller.userInfoBean!.avatar
: "",
width: 66.sp,
height: 66.sp,
),
),
);
}
}
Widget _buildImageItem(
String url, UserinfoLogic controller, int index, int isTop) {
return Stack(
alignment: Alignment.center,
children: [
SizedBox(
width: double.infinity,
height: double.infinity,
child: ClipRRect(
borderRadius: BorderRadius.circular(0.0),
child: GestureDetector(
onLongPress: () {
if (logic.isMe) {
showImgTipPop(url, index, isTop == 1, controller);
}
},
onTap: () {
List<String> imaglist = [];
for (var element in controller.state.imaglist) {
imaglist.add(element.url);
}
Get.toNamed(Routes.SwiperPage, arguments: {
'imaglist': imaglist,
'index': index,
'isVague': homeLogic.model!.vip == 0
})!
.then((value) => logic.update());
},
child: Image.network(
fit: BoxFit.cover,
url,
),
),
),
),
if (!logic.isMe && index > 0 && homeLogic.model!.vip == 0)
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () async {
showOKToast('开通会员后可以解锁TA和其他所有人的形象照');
await showOepnVipDialog();
homeLogic.loadMyInfoData();
},
child: ClipRect(
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
child: Container(
color: Colors.transparent,
),
),
)),
if (!logic.isMe && index > 0 && homeLogic.model!.vip == 0)
Positioned(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
onTap: () async {
showOKToast('开通会员后可以解锁TA和其他所有人的形象照');
await showOepnVipDialog();
homeLogic.loadMyInfoData();
},
child: Container(
height: 30.sp,
width: 55.sp,
decoration: BoxDecoration(
gradient: AppColor.mainVerLinearGradient,
borderRadius: BorderRadius.circular(15.sp)),
alignment: Alignment.center,
child: Text(
'解锁全部',
style: TextStyle(color: Colors.white, fontSize: 12.sp),
),
),
)
],
),
),
if (isTop == 1)
Positioned(
top: 0,
left: 5,
child: Container(
height: 25.sp,
width: 25.sp,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.black.withOpacity(0.4),
borderRadius: BorderRadius.circular(15.sp)),
child: Icon(
Icons.vertical_align_top_sharp,
color: AppColor.mainColor,
size: 20.sp,
),
),
),
],
);
}
showImgTipPop(String url, int index, bool isTop, var contrller) {
Get.bottomSheet(
CupertinoActionSheet(
title: Text(
'形象照操作',
style: TextStyle(fontSize: 22),
), //标题
//提示内容
actions: <Widget>[
CupertinoActionSheetAction(
onPressed: () {
Get.back();
logic.setTopAlbum(!isTop, index);
},
child: Text(isTop ? '取消置顶' : '置顶'),
),
CupertinoActionSheetAction(
onPressed: () {
Get.back();
_showDelImgDialog(Get.context!, logic, index);
// toast('举报成功,等待反馈!');
},
child: Text('删除'),
),
],
cancelButton: CupertinoActionSheetAction(
//取消按钮
onPressed: () {
Get.back();
},
child: Text('取消'),
),
),
isScrollControlled: true);
}
void _showBottomSheet(BuildContext context, UserinfoLogic controller) {
showModalBottomSheet(
context: context,
backgroundColor: Colors.transparent,
builder: (BuildContext context) {
return Container(
decoration: const BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: 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,
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
GestureDetector(
onTap: () {
Navigator.pop(context);
if (logic.userInfoBean == null) return;
Get.bottomSheet(
UserShare(
userImgUrl: logic.userInfoBean!.avatar!,
userNIckName: '',
userInfoBean: logic.userInfoBean!),
isScrollControlled: true);
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image(
image: AssetImage(getMsgImage("msg_share")),
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);
Get.toNamed(Routes.ReportPage,
arguments: {"userId": logic.userId});
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image(
image: AssetImage(getMineImage("icon_report")),
width: 40.sp,
height: 40.sp,
),
Container(
margin: EdgeInsets.only(top: 2.sp),
child: const Text(
"举报",
style: TextStyle(color: Colors.white),
),
),
],
),
),
GestureDetector(
onTap: () {
if (controller.isBlack) {
logic.setBlock("0");
Navigator.pop(context);
} else {
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: Text(
controller.isBlack ? "取消拉黑" : "拉黑",
style: TextStyle(color: Colors.white),
),
),
],
),
),
],
),
);
},
);
}
void _showDelImgDialog(
BuildContext context, UserinfoLogic controller, int index) {
showDialog(
context: context,
builder: (BuildContext context) {
return Dialog(
backgroundColor: Colors.transparent,
child: Container(
height: 160.sp,
padding: const EdgeInsets.all(1.0),
child: Stack(
children: [
Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(10.0),
gradient: const LinearGradient(
colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
),
Container(
margin: EdgeInsets.all(1.sp),
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(10.0),
gradient: const LinearGradient(
colors: [Color(0xFF4C3E5F), Color(0xFF324140)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
),
Container(
margin: EdgeInsets.only(top: 24.sp),
child: Column(
children: [
Center(
child: Text(
"提示",
style:
TextStyle(color: Colors.white, fontSize: 16.sp),
),
),
Container(
margin: EdgeInsets.only(
top: 12.sp, left: 14.sp, right: 14.sp),
alignment: Alignment.center,
child: Text(
"是否确认删除该形象照。",
textAlign: TextAlign.center,
style: TextStyle(
color: const Color(0xCCF7FAFA), fontSize: 16.sp),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: EdgeInsets.only(top: 30.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: const LinearGradient(
colors: [
Color(0x26FFFFFF),
Color(0x26FFFFFF),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
padding: EdgeInsets.only(
top: 10.sp,
bottom: 10.sp,
left: 52.sp,
right: 52.sp),
child: const Text(
"",
style: TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
),
SizedBox(width: 24.sp),
GestureDetector(
onTap: () {
Navigator.pop(context);
controller.delAlbumImage(index);
},
child: Container(
margin: EdgeInsets.only(top: 24.sp),
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: 52.sp,
right: 52.sp),
child: const Text(
"",
style: TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
)
],
)
],
),
)
],
),
),
);
},
);
}
void _showReportDialog(BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context) {
return Dialog(
backgroundColor: Colors.transparent,
child: Container(
height: 277.sp,
padding: const EdgeInsets.all(1.0),
child: Stack(
children: [
Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(10.0),
gradient: const LinearGradient(
colors: [Color(0xFFDD3DF4), Color(0xFF30FFD9)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
),
Container(
margin: EdgeInsets.all(1.sp),
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(10.0),
gradient: const LinearGradient(
colors: [Color(0xFF4C3E5F), Color(0xFF324140)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
),
Container(
margin: EdgeInsets.only(top: 24.sp),
child: Column(
children: [
Center(
child: Text(
"是否拉黑",
style:
TextStyle(color: Colors.white, fontSize: 16.sp),
),
),
Container(
margin: EdgeInsets.only(top: 14.sp),
alignment: Alignment.center,
child: Image(
image: AssetImage(getMineImage("icon_dialog_black")),
width: 70.sp,
height: 70.sp,
),
),
Container(
margin: EdgeInsets.only(
top: 12.sp, left: 14.sp, right: 14.sp),
alignment: Alignment.center,
child: Text(
"拉黑后,你将屏蔽对方的任何信息若您关注了对方,将自动取消关注。",
textAlign: TextAlign.center,
style: TextStyle(
color: const Color(0xCCF7FAFA), fontSize: 16.sp),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Container(
margin: EdgeInsets.only(top: 24.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(17),
gradient: const LinearGradient(
colors: [
Color(0x26FFFFFF),
Color(0x26FFFFFF),
],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
padding: EdgeInsets.only(
top: 10.sp,
bottom: 10.sp,
left: 52.sp,
right: 52.sp),
child: const Text(
"",
style: TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
),
SizedBox(width: 24.sp),
GestureDetector(
onTap: () {
logic.setBlock("1");
},
child: Container(
margin: EdgeInsets.only(top: 24.sp),
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: 52.sp,
right: 52.sp),
child: const Text(
"",
style: TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
)
],
)
],
),
)
],
),
),
);
},
);
}
void starTimer() {
timer = Timer.periodic(const Duration(seconds: 1), (t) async {
if (countdown > 0) {
countdown--;
} else {
bool isTip = await logic.checkIsShowTip();
if (isTip && !logic.isMe && !logic.isLike) {
showFloatingButtonOverlay(context, logic.userInfoBean!.nickname ?? '',
logic.ageMsg, logic.userInfoBean!.avatarThumb, 0, () {
logic.setLike();
});
}
timer?.cancel(); // 倒计时结束,取消定时器
}
});
}
}
class ScrollViewIsEnd {
bool isEnd;
ScrollViewIsEnd(this.isEnd);
}
class ScrollViewScrollTop {}