邀请功能完善

This commit is contained in:
CYH 2023-08-23 17:52:04 +08:00
parent 668bf55348
commit d94bf206d5
23 changed files with 982 additions and 347 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@ -141,7 +141,6 @@
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
596550B3B6FD4574F751EEF4 /* [CP] Embed Pods Frameworks */,
043A78F4D9CB2782E40309BF /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@ -200,23 +199,6 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
043A78F4D9CB2782E40309BF /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;

View File

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>是否同意应用将图片保存到相册中?</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixinULAPI</string>
@ -62,5 +64,7 @@
<string>30dc517b609c8aefe297b9ac3eb8dbde</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>

View File

@ -1,3 +1,6 @@
import 'package:circle_app/network/api.dart';
import 'package:circle_app/network/dio_manager.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
@ -5,5 +8,157 @@ import 'state.dart';
class InviteLogic extends GetxController {
final InviteState state = InviteState();
bool isLoad = true;
TextEditingController codeEditingController = TextEditingController();
Data? homeData;
List sysData = [];
@override
void onInit() {
// TODO: implement onInit
super.onInit();
loadData();
}
void loadData() async {
var data = await DioManager.instance.get(url: Api.inviteMainPage);
if (data['code'] == 200) {
Autogenerated result = Autogenerated.fromJson(data);
homeData = result.data;
}
var recorddata = await DioManager.instance.get(url: Api.inviteSysRecord);
if (recorddata['code'] == 200) {
sysData = recorddata['data'];
isLoad = false;
update();
}
}
addCode(String code) async {
var recorddata = await DioManager.instance.post(url: Api.inviteFillIn,params: {'invite_code':code});
if (recorddata['code'] == 200) {
showOKToast('填写成功');
} else {
showOKToast(recorddata['msg']);
}
}
}
class Autogenerated {
int? code;
Data? data;
String? msg;
Autogenerated({this.code, this.data, this.msg});
Autogenerated.fromJson(Map<String, dynamic> json) {
code = json['code'];
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
msg = json['msg'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['code'] = this.code;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
data['msg'] = this.msg;
return data;
}
}
class Data {
int? achieveCount;
int? achieveRewardDay;
int? diffAwardCount;
List<InviteAwardConf>? inviteAwardConf;
int? inviteAwardCount;
String? inviteCode;
String? link;
int? inviteCount;
Data(
{this.achieveCount,
this.achieveRewardDay,
this.diffAwardCount,
this.inviteAwardConf,
this.inviteAwardCount,
this.inviteCode,
this.link,
this.inviteCount});
Data.fromJson(Map<String, dynamic> json) {
achieveCount = json['achieve_count'];
achieveRewardDay = json['achieve_reward_day'];
diffAwardCount = json['diff_award_count'];
if (json['invite_award_conf'] != null) {
inviteAwardConf = <InviteAwardConf>[];
json['invite_award_conf'].forEach((v) {
inviteAwardConf!.add(new InviteAwardConf.fromJson(v));
});
}
inviteAwardCount = json['invite_award_count'];
inviteCode = json['invite_code'];
link = json['site_link'];
inviteCount = json['invite_count'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['achieve_count'] = this.achieveCount;
data['achieve_reward_day'] = this.achieveRewardDay;
data['diff_award_count'] = this.diffAwardCount;
if (this.inviteAwardConf != null) {
data['invite_award_conf'] =
this.inviteAwardConf!.map((v) => v.toJson()).toList();
}
data['invite_award_count'] = this.inviteAwardCount;
data['invite_code'] = this.inviteCode;
data['invite_count'] = this.inviteCount;
return data;
}
}
class InviteAwardConf {
int? achieveId;
int? inviteCount;
int? isAchieved;
double? rebateRate;
int? rewardDay;
InviteAwardConf(
{this.achieveId,
this.inviteCount,
this.isAchieved,
this.rebateRate,
this.rewardDay});
InviteAwardConf.fromJson(Map<String, dynamic> json) {
achieveId = json['achieve_id'];
inviteCount = json['invite_count'];
isAchieved = json['is_achieved'];
rebateRate = json['rebate_rate'];
rewardDay = json['reward_day'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['achieve_id'] = this.achieveId;
data['invite_count'] = this.inviteCount;
data['is_achieved'] = this.isAchieved;
data['rebate_rate'] = this.rebateRate;
data['reward_day'] = this.rewardDay;
return data;
}
}

View File

@ -0,0 +1,421 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:circle_app/app/minefragment/logic.dart';
import 'package:circle_app/util/util.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:get/get_core/src/get_main.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'dart:ui' as ui;
import 'package:qr_flutter/qr_flutter.dart';
class Share extends StatefulWidget {
String code;
String link;
Share(this.code, this.link);
@override
State<Share> createState() => _ShareState();
}
class _ShareState extends State<Share> {
GlobalKey _globalKey = GlobalKey();
MinefragmentLogic logic = Get.find<MinefragmentLogic>();
@override
Widget build(BuildContext context) {
// TODO: add widget build method
return Scaffold(
backgroundColor: Colors.transparent,
body: Container(
child: Stack(
alignment: Alignment.center,
children: [
Positioned(
top: 100.sp,
child: SingleChildScrollView(
child: RepaintBoundary(
key: _globalKey,
child: Container(
height: 514.sp,
width: Get.width - 40.sp,
// margin: EdgeInsets.only(left: 20.sp, right: 20.sp),
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getCircleImage("open_vip_bg")),
fit: BoxFit.fill,
),
),
child: Column(
children: [
Container(
width: Get.width,
height: 65.sp,
margin: EdgeInsets.only(left: 15.sp, top: 20.sp),
child: Row(
children: [
Center(
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 47.sp,
height: 47.sp,
decoration: const BoxDecoration(
shape: BoxShape.circle,
gradient: LinearGradient(
colors: [
Color(0xFFDD3DF4),
Color(0xFF30FFD9)
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
),
SizedBox(
width: 46.sp,
height: 46.sp,
child: _buildAvatar1(logic),
)
],
),
),
Expanded(
child: Container(
padding: EdgeInsets.only(left: 10.sp),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
_buildNameRow(logic),
SizedBox(height: 10.sp),
_buildInfoRow(logic),
],
),
),
),
Image.asset(
getBaseImage("ic_launcher"),
width: 80.sp,
height: 80.sp,
)
],
),
),
Expanded(
child: Container(
// color: Colors.red,
child: Column(
children: [
SizedBox(
height: 20.sp,
),
Image.asset(
getMineImage('share_title'),
height: 22.sp,
),
SizedBox(
height: 10.sp,
),
Image.asset(
getMineImage('share_content_bg'),
fit: BoxFit.fill,
),
],
),
)),
Container(
height: 90.sp,
// color: Colors.yellow,
// width: Get.width-40.sp,
margin: EdgeInsets.only(bottom: 15.sp),
padding: EdgeInsets.only(left: 15.sp, right: 15.sp),
child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Container(
// color: Colors.red,
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Container(
// color: Colors.blue,
child: Row(
children: [
Text(
'专属邀请码',
style: TextStyle(
color: Colors.white,
fontSize: 16.sp),
),
SizedBox(
width: 8.sp,
),
Container(
alignment: Alignment.center,
padding: EdgeInsets.only(
left: 10.sp, right: 10.sp),
height: 25.sp,
decoration: BoxDecoration(
// color: Color(0xFFDC5BFD),
gradient:
const LinearGradient(
colors: [
Color(0xFF0DF5F7),
Color(0xFFD263FB)
],
begin:
Alignment.centerLeft,
end:
Alignment.centerRight,
),
borderRadius:
BorderRadius.circular(
12.5.sp)),
child: Text(
widget.code,
style: TextStyle(
color: Colors.black,
fontSize: 12.sp),
),
)
],
),
),
Container(
margin: EdgeInsets.only(top: 10.sp),
width: Get.width - 200.sp,
child: Text(
'扫码或长按识别下载APP认识更多小众圈子里的人给生活带来更多乐趣',
style: TextStyle(
color: Colors.white,
fontSize: 12.sp)),
)
],
),
),
),
// Image.asset(getBaseImage("ic_launcher"),width: 80.sp,height: 80.sp,)
QrImageView(
data: widget.link,
padding: EdgeInsets.zero,
version: QrVersions.auto,
size: 80.sp,
gapless: false,
backgroundColor: Colors.white,
)
],
),
)
],
),
)),
),
),
Positioned(
bottom: 0,
child: SafeArea(
top: false,
child: Container(
height: 164.sp,
width: Get.width,
color: Color(0xFF292247),
child: Column(
children: [
Expanded(
child: Container(
padding: EdgeInsets.only(
top: 15.sp, left: 15.sp, right: 15.sp),
alignment: Alignment.center,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
shareAction('wx', '微信', () {}),
shareAction('wxq', '朋友圈', () {}),
shareAction('qq', 'QQ', () {
copyInviteText(logic.name);
}),
shareAction('wb', '微博', () {
copyInviteText(logic.name);
}),
shareAction('hb', '保存海报', () {
_saveLocalImage();
}),
],
),
)),
Container(
height: 1.sp,
color: Color(0x33FFFFFF),
),
GestureDetector(
onTap: () {
Get.back();
},
child: Container(
height: 67.sp,
alignment: Alignment.center,
child: Text(
'取消',
style: TextStyle(
color: Colors.white, fontSize: 14.sp),
),
),
)
],
),
)))
],
),
),
);
}
Widget _buildAvatar1(MinefragmentLogic logic) {
return ClipOval(
child: GestureDetector(
onTap: () {
if (logic.userInfoBean != null) {
var imgList = <String>[];
imgList.add(logic.userInfoBean!.avatar);
// Get.toNamed(AppRoutes.Swiper,arguments:imgList);
// Get.toNamed(AppRoutes.Swiper, arguments: {
// 'imaglist': imgList,
// 'index': 0
// });
}
},
child: logic.userInfoBean == null
? SizedBox(
width: 63.sp,
height: 63.sp,
)
: CachedNetworkImage(
fit: BoxFit.cover,
placeholder: null,
imageUrl: logic.avatar,
width: 63.sp,
height: 63.sp,
),
),
);
}
Widget _buildNameRow(MinefragmentLogic logic) {
return Container(
margin: EdgeInsets.only(top: 6.sp),
child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
logic.name,
style: TextStyle(
color: const Color.fromRGBO(247, 250, 250, 1.0),
fontSize: 16.sp,
),
),
SizedBox(
width: 4.sp,
),
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(
logic.ageMsg,
style: TextStyle(
color: Colors.black,
fontSize: 10.sp,
),
),
),
],
),
);
}
Widget _buildInfoRow(MinefragmentLogic logic) {
return Row(
children: [
Text('邀请您加入',
style: TextStyle(
color: Colors.white,
fontSize: 12.sp,
)),
Text('【微乐园APP】',
style: TextStyle(
color: Color(0xFF0DF5F7),
fontSize: 12.sp,
)),
],
);
}
shareAction(String img, String name, GestureTapCallback onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
child: Column(
children: [
Image.asset(
getMineImage(img),
width: 40.sp,
),
SizedBox(
height: 10.sp,
),
Text(
name,
style: TextStyle(color: Colors.white, fontSize: 12.sp),
)
],
),
),
);
}
_saveLocalImage() async {
RenderRepaintBoundary boundary =
_globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
ui.Image image = await boundary.toImage(pixelRatio: ui.window.devicePixelRatio);
ByteData? byteData =
await (image.toByteData(format: ui.ImageByteFormat.png));
if (byteData != null) {
final result =
await ImageGallerySaver.saveImage(byteData.buffer.asUint8List());
print(result);
// isSuccess
if (result['isSuccess']) {
showOKToast('保存成功');
} else {
showOKToast('保存失败,请检查相册权限是否开启');
}
}
}
copyInviteText(
String username,
) {
Clipboard.setData(ClipboardData(
text: '${username}】邀请你加入“微乐园”,邀请码为${widget.code},点击进入${widget.link}'));
showOKToast('您已成功复制分享链接,前往对应平台粘贴发送即可~');
}
}

View File

@ -1,3 +1,5 @@
import 'package:circle_app/app/invite/share.dart';
import 'package:circle_app/app/swiper/view.dart';
import 'package:circle_app/common/Widgets/rich_text.dart';
import 'package:circle_app/components/my_app_bar.dart';
@ -14,7 +16,9 @@ class InvitePage extends StatelessWidget {
InvitePage({Key? key}) : super(key: key);
final logic = Get.find<InviteLogic>();
final state = Get.find<InviteLogic>().state;
final state = Get
.find<InviteLogic>()
.state;
@override
Widget build(BuildContext context) {
@ -28,348 +32,386 @@ class InvitePage extends StatelessWidget {
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: MyAppBar(
centerTitle: "邀请有奖",
centerTitle: "邀请得会员",
actionWdiget: Container(
alignment: Alignment.center,
height: 22.sp,
width: 62.sp,
decoration: BoxDecoration(
color: Color(0xffD739EA),
borderRadius: BorderRadius.circular(31.sp)),
child: Text(
'邀请攻略',
style: TextStyle(color: Colors.white, fontSize: 11.sp),
child: Image.asset(getMineImage('invite_right_icon'),
),
),
),
body: SingleChildScrollView(
child: Column(children: [
Container(
height: 203.sp,
margin: EdgeInsets.only(
left: 20.sp,
right: 20.sp,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.sp),
color: Color(0x1AFFFFFF),
),
child: Column(
children: [
body: GetBuilder<InviteLogic>(builder: (logic) {
List<Widget> peopleCountList = [];
List<Widget> dayCountList = [];
List<TextSpan> allSpan = [];
if (logic.isLoad == false) {
logic.homeData!.inviteAwardConf!.forEach((element) {
peopleCountList.add(peopleCountWidget('${element!.inviteCount! ?? '0'}',(element!.inviteCount! ?? 0) <= logic.homeData!.inviteCount!));
if ((element.rewardDay! ?? 0) > 365) {
dayCountList.add(timeWidget('${(element.rewardDay! / 365).toInt()}'));
} else {
dayCountList.add(timeWidget('${element.rewardDay!}'));
}
// timeWidget(
// '+30天',
// ),
});
getTextSpanList(
'Tip您已成功邀请 ${logic.homeData!.inviteCount! ?? 0}位同好,免费获得会员${logic.homeData!.achieveRewardDay! ?? '0'}天, 再邀请${logic.homeData!.diffAwardCount}位同友可领取更多奖励~',
Color(0xFFDC5BFD),
12.sp,
searchContent: 'Tip');
allSpan.addAll(getTextSpanList(
'Tip您已成功邀请',
Color(0xFF0DF5F7),
12.sp,
searchContent: 'Tip'));
allSpan.addAll(getTextSpanList(
' ${logic.homeData!.inviteCount! ?? 0} 位同好,',
Color(0xFFDC5BFD),
12.sp,
searchContent: '${logic.homeData!.inviteCount! ?? 0}'));
allSpan.addAll(getTextSpanList(
'免费获得会员 ${logic.homeData!.achieveRewardDay! ?? '0'} 天,',
Color(0xFFDC5BFD),
12.sp,
searchContent: '${logic.homeData!.achieveRewardDay! ?? '0'} '));
allSpan.addAll(getTextSpanList(
' 再邀请 ${logic.homeData!.diffAwardCount} 位同友可领取更多奖励~',
Color(0xFFDC5BFD),
12.sp,
searchContent: '${logic.homeData!.diffAwardCount}'));
}
return logic.isLoad ? loaddingWidget(true) : SingleChildScrollView(
child: Column(children: [
Container(
padding: EdgeInsets.only(
left: 14.sp, right: 14.sp, top: 24.sp),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'我的专属邀请码',
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
fontWeight: FontWeight.w500),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
showCodePicker(logic);
},
child: Container(
alignment: Alignment.center,
height: 29.sp,
width: 76.sp,
decoration: BoxDecoration(
border: Border.all(
color: Color(0xffD739EA), width: 1.sp),
borderRadius: BorderRadius.circular(14.5.sp)),
child: Text(
'填码对接',
style: TextStyle(
color: Color(0xffD739EA), fontSize: 12.sp),
),
),
)
],
height: 203.sp,
margin: EdgeInsets.only(
left: 20.sp,
right: 20.sp,
top: 10.sp
),
),
Container(
margin: EdgeInsets.only(top: 40.sp),
child: Row(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getCircleImage("pic_bg")),
fit: BoxFit.fill,
),
),
child: Column(
children: [
Expanded(child: Container()),
Semantics(
namesRoute: true,
header: true,
child: ShaderMask(
shaderCallback: (Rect bounds) {
return const LinearGradient(
begin: Alignment(0.0, -1.0),
end: Alignment.bottomCenter,
colors: [
Color(0xff71F3F2),
Color(0xffF657FF)
],
).createShader(Offset.zero & bounds.size);
},
child: Text(
'F2324424',
Container(
padding: EdgeInsets.only(
left: 14.sp, right: 14.sp, top: 24.sp),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'我的专属邀请码',
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
fontWeight: FontWeight.w500),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
showCodePicker(logic);
},
child: Container(
alignment: Alignment.center,
width: 84.sp,
child: Image.asset(getMineImage('add_code_icon')),
),
)
],
),
),
Container(
margin: EdgeInsets.only(top: 10.sp),
child: Row(
children: [
SizedBox(width: 20.sp,),
Text(
logic.homeData!.inviteCode! ?? '',
style: TextStyle(
fontSize: 30.sp,
fontWeight: FontWeight.w600,
color: Colors.white,
shadows: [
Shadow(
color: Color(0xffF657FF),
offset: Offset(0.0, -1))
]),
color: Color(0xffF657FF)
),
),
)),
SizedBox(
width: 4.sp,
SizedBox(
width: 4.sp,
),
GestureDetector(
onTap: () {
Clipboard.setData(
ClipboardData(text: logic.homeData!.inviteCode! ?? ''));
showOKToast('复制成功');
},
child: Text(
'复制',
style: TextStyle(
color: Color(0xff0DF5F7),
fontSize: 14.sp),
)),
Expanded(child: Container())
],
),
),
GestureDetector(
onTap: () {
Clipboard.setData(
ClipboardData(text: '复制到剪切板'));
showOKToast('复制成功');
},
onTap: () {
shopSharePiker(logic.homeData!.inviteCode! ?? '',(logic.homeData!.link! ?? '') +
'?code=${logic.homeData!.inviteCode! ?? ''}');
},
child: Container(
width: 174.sp,
height: 42.sp,
margin: EdgeInsets.only(top: 35.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(21.sp),
gradient: const LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
)),
alignment: Alignment.center,
child: Text(
'复制',
'立即邀请',
style: TextStyle(
color: Color(0xB3FFFFFF), fontSize: 14.sp),
)),
Expanded(child: Container())
color: Color(0xFF000000),
fontSize: 16,
fontWeight: FontWeight.w600),
),
),
),
],
),
),
Container(
width: 224.sp,
height: 42.sp,
margin: EdgeInsets.only(top: 15.sp),
height: 62.sp,
margin: EdgeInsets.only(
left: 20.sp, right: 20.sp, top: 15.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(21.sp),
gradient: const LinearGradient(
colors: [
Color(0xFF06F9FA),
Color(0xFFDC5BFD),
],
)),
alignment: Alignment.center,
child: Text(
'立即邀请',
style: TextStyle(
color: Colors.white,
fontSize: 16,
fontWeight: FontWeight.w600),
image: DecorationImage(
image: AssetImage(getMineImage("invite_sys_bg")),
fit: BoxFit.fill,
),
),
child: Swiper(
physics: NeverScrollableScrollPhysics(),
autoplay: true,
// controller: 5,
index: 0,
itemBuilder: (BuildContext context, int index) {
Map data = logic.sysData[index];
return Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
data['inviter_name'],
style: TextStyle(
color: Color(0xff0DF5F7),
fontSize: 14.sp,
fontWeight: FontWeight.w500),
),
Container(
margin: EdgeInsets.only(
left: 5.sp, right: 5.sp),
child: Text(
'邀请',
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
)),
Text(
data['invitee_name'],
style: TextStyle(
color: Color(0xff0DF5F7),
fontSize: 14.sp,
fontWeight: FontWeight.w500),
),
Container(
margin: EdgeInsets.only(left: 5.sp),
child: Text(
'加入微乐园',
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
)),
],
),
);
},
itemCount: logic.sysData.length,
),
),
],
),
),
Container(
height: 40.sp,
margin: EdgeInsets.only(left: 20.sp, right: 20.sp, top: 30.sp),
decoration: BoxDecoration(
color: Color(0x1AFFFFFF),
borderRadius: BorderRadius.circular(10.sp)),
child: Swiper(
physics: NeverScrollableScrollPhysics(),
autoplay: true,
// controller: 5,
index: 0,
itemBuilder: (BuildContext context, int index) {
return Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'哟刚说A',
style: TextStyle(
color: Color(0xFFDC5BFD),
fontSize: 14.sp,
fontWeight: FontWeight.w500),
Container(
height: 220.sp,
width: Get.width-30.sp,
margin:
EdgeInsets.only(top: 15.sp),
padding: EdgeInsets.only(top: 10.sp,bottom: 10.sp,left: 10.sp,right: 10.sp),
decoration: BoxDecoration(
image:DecorationImage(
image: AssetImage(getMineImage("invite_count_bg")),
fit: BoxFit.fill,
),
Container(
margin: EdgeInsets.only(left: 5.sp, right: 5.sp),
child: Text(
'邀请',
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
)),
Text(
'扥扥',
style: TextStyle(
color: Color(0xFFDC5BFD),
fontSize: 14.sp,
fontWeight: FontWeight.w500),
),
Container(
margin: EdgeInsets.only(left: 5.sp),
child: Text(
'加入微乐园',
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
fontWeight: FontWeight.w500),
)),
],
),
child: Column(
children: [
Container(
margin: EdgeInsets.only(top: 15.sp),
alignment: Alignment.center,
child: Image.asset(getMineImage('invite_title'),width: 256.sp,),
),
Container(
margin: EdgeInsets.only(top: 10.sp),
alignment: Alignment.center,
child: Image.asset(getMineImage('invite_line'),width: 328.sp,),
),
Container(
height: 70.sp,
margin: EdgeInsets.only(
left: 15.sp, right: 15.sp),
child: Row(
children: [
Text(
'邀请人数',
style: TextStyle(
color: Color(0xFF0DF5F7),
fontSize: 14.sp,
fontWeight: FontWeight.w500),
),
Expanded(
child: Stack(
// fit: StackFit.expand,
alignment: Alignment.center,
children: [
Container(
margin: EdgeInsets.only(
left: 61.sp, right: 46.sp),
height: 2.sp,
color: Color(0xFF0DF5F7),
),
Container(
margin: EdgeInsets.only(
left: 15.sp),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children:peopleCountList,
),
)
],
))
],
)),
Container(
height: 20.sp,
margin: EdgeInsets.only(
left: 15.sp, right: 15.sp),
child: Row(
children: [
Text(
'会员时长',
style: TextStyle(
color: Color(0xFF0DF5F7),
fontSize: 14.sp,
fontWeight: FontWeight.w500),
),
Expanded(
child: Stack(
// fit: StackFit.expand,
alignment: Alignment.center,
children: [
Container(
margin: EdgeInsets.only(
left: 25.sp, right: 15.sp),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: dayCountList
),
)
],
)),
],
)),
Expanded(child: Container()),
Container(
margin: EdgeInsets.only(
left: 15.sp, right: 15.sp,bottom: 20.sp),
child: RichText(
text: TextSpan(
children: allSpan
)))
],
)),
SafeArea(
child: Container(
margin: EdgeInsets.only(top: 15.sp),
alignment: Alignment.center,
child: Image.asset(getMineImage('invite_vip_desc'),width: Get.width-30.sp,),
),
);
},
itemCount: 5,
),
),
Container(
height: 203.sp,
margin:
EdgeInsets.only(left: 20.sp, right: 20.sp, top: 20.sp),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.sp),
color: Color(0x1AFFFFFF),
),
child: Column(
children: [
Container(
height: 80.sp,
margin: EdgeInsets.only(left: 15.sp, right: 15.sp),
child: Row(
children: [
Text(
'邀请人数',
style: TextStyle(
color: Color(0xFFDC5BFD),
fontSize: 14.sp,
fontWeight: FontWeight.w500),
),
Expanded(
child: Stack(
// fit: StackFit.expand,
alignment: Alignment.center,
children: [
Container(
margin: EdgeInsets.only(
left: 61.sp, right: 46.sp),
height: 2.sp,
color: Color(0xFFDC5BFD).withOpacity(0.4),
),
Container(
margin: EdgeInsets.only(left: 15.sp),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
peopleCountWidget('20', true),
peopleCountWidget('50', true),
peopleCountWidget('100', true),
peopleCountWidget('500', true),
],
),
)
],
))
],
)),
Container(
height: 80.sp,
margin: EdgeInsets.only(left: 15.sp, right: 15.sp),
child: Row(
children: [
Text(
'会员时长',
style: TextStyle(
color: Color(0xFFDC5BFD),
fontSize: 14.sp,
fontWeight: FontWeight.w500),
),
Expanded(
child: Stack(
// fit: StackFit.expand,
alignment: Alignment.center,
children: [
Container(
margin: EdgeInsets.only(
left: 20.sp, right: 10.sp),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
timeWidget(
'+30天',
),
timeWidget(
'+100天',
),
timeWidget(
'+365天',
),
timeWidget(
'+3年',
),
],
),
)
],
)),
],
)),
Container(
margin: EdgeInsets.only(left: 15.sp, right: 15.sp),
child: RichText(
text: TextSpan(
children: getTextSpanList(
'Tip您已成功邀请 19位同好免费获得会员120天 再邀请1位同友可领取更多奖励~',
Color(0xFFDC5BFD),
14.sp,
searchContent: 'Tip'),
)))
],
)),
// Container(
// height: 203.sp,
// margin:
// EdgeInsets.only(left: 20.sp, right: 20.sp, top: 20.sp),
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(10.sp),
// color: Color(0x1AFFFFFF),
// ),
// child: Column(children: [
// Expanded(
// child: ListView.builder(
// itemBuilder: (BuildContext context, int index) {
// return Container(
// margin: EdgeInsets.only(top: 10.sp),
// padding: EdgeInsets.only(left: 15.sp, right: 15.sp),
// child: Row(
// children: [
// ClipOval(
// child: Image.network(
// 'https://p26-passport.byteacctimg.com/img/user-avatar/b0541a2a377dd239a22eea2934709967~100x100.awebp',
// width: 40.sp,
// height: 40.sp,
// ),
// ),
// SizedBox(
// width: 4.sp,
// ),
// Column(
// children: [
// Text(
// '2222',
// style: TextStyle(
// color: Colors.white, fontSize: 14.sp),
// ),
// ],
// )
// ],
// ),
// );
// },
// itemCount: 5,
// ))
// ])),
]))));
),
// Container(
// height: 203.sp,
// margin:
// EdgeInsets.only(left: 20.sp, right: 20.sp, top: 20.sp),
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(10.sp),
// color: Color(0x1AFFFFFF),
// ),
// child: Column(children: [
// Expanded(
// child: ListView.builder(
// itemBuilder: (BuildContext context, int index) {
// return Container(
// margin: EdgeInsets.only(top: 10.sp),
// padding: EdgeInsets.only(left: 15.sp, right: 15.sp),
// child: Row(
// children: [
// ClipOval(
// child: Image.network(
// 'https://p26-passport.byteacctimg.com/img/user-avatar/b0541a2a377dd239a22eea2934709967~100x100.awebp',
// width: 40.sp,
// height: 40.sp,
// ),
// ),
// SizedBox(
// width: 4.sp,
// ),
// Column(
// children: [
// Text(
// '2222',
// style: TextStyle(
// color: Colors.white, fontSize: 14.sp),
// ),
// ],
// )
// ],
// ),
// );
// },
// itemCount: 5,
// ))
// ])),
]));
})));
}
peopleCountWidget(String count, bool isCheck) {
@ -378,10 +420,10 @@ class InvitePage extends StatelessWidget {
height: 46.sp,
alignment: Alignment.center,
decoration:
BoxDecoration(color: Color(0xFFDC5BFD), shape: BoxShape.circle),
BoxDecoration(color: isCheck ? Color(0xFF0DF5F7) : Color(0xFF504261), shape: BoxShape.circle),
child: Text(
'$count人',
style: TextStyle(color: Colors.white, fontSize: 12.sp),
style: TextStyle(color:isCheck ? Color(0xFF000000) : Colors.white, fontSize: 12.sp),
),
);
}
@ -392,6 +434,13 @@ class InvitePage extends StatelessWidget {
style: TextStyle(color: Colors.white, fontSize: 12.sp),
);
}
void shopSharePiker(String code,String link) {
Get.bottomSheet(
Share(code,link), isScrollControlled: true,
enableDrag: false
);
}
}
void showCodePicker(InviteLogic logic) {
@ -420,7 +469,7 @@ void showCodePicker(InviteLogic logic) {
),
),
Container(
margin: EdgeInsets.only(left: 20, right: 20.sp,top: 30.sp),
margin: EdgeInsets.only(left: 20, right: 20.sp, top: 30.sp),
decoration: BoxDecoration(
color: Color(0x1AFFFFFF),
borderRadius: BorderRadius.circular(6.sp)),
@ -434,7 +483,7 @@ void showCodePicker(InviteLogic logic) {
decoration: InputDecoration(
hintText: '请输入邀请码',
hintStyle:
TextStyle(color: Colors.white70, fontSize: 16.sp),
TextStyle(color: Colors.white70, fontSize: 16.sp),
border: InputBorder.none,
counterText: '',
contentPadding: EdgeInsets.only(left: 16.sp)),
@ -450,7 +499,8 @@ void showCodePicker(InviteLogic logic) {
),
Expanded(child: Container()),
Container(
margin: EdgeInsets.only(left: 40.sp,right: 40.sp,bottom: 20.sp),
margin: EdgeInsets.only(
left: 40.sp, right: 40.sp, bottom: 20.sp),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
@ -467,12 +517,20 @@ void showCodePicker(InviteLogic logic) {
color: Color(0x1AFFFFFF)),
child: const Text(
'放弃对接',
style: TextStyle(color: Colors.white, fontSize: 16),
style: TextStyle(
color: Colors.white, fontSize: 16),
),
),
),
GestureDetector(
onTap: () {},
onTap: () {
if (logic.codeEditingController.text.isEmpty) {
showOKToast('请输入邀请码');
return;
}
Get.back();
logic.addCode(logic.codeEditingController.text);
},
child: Container(
alignment: Alignment.center,
width: 114.sp,
@ -488,7 +546,7 @@ void showCodePicker(InviteLogic logic) {
child: const Text(
'确认对接',
style: TextStyle(
color: Colors.white, fontSize: 16),
color: Colors.black, fontSize: 16),
),
),
)

View File

@ -40,7 +40,7 @@ class MinefragmentPage extends StatelessWidget {
fit: BoxFit.cover,
),
),
child: Padding(
child: Padding(
padding: EdgeInsets.only(
top: 20.0 + statusBarHeight.sp,
left: 11.sp,
@ -80,7 +80,7 @@ class MinefragmentPage extends StatelessWidget {
Widget _circleLiveView(MinefragmentLogic logic) {
return Column(
children: [_circleItemView(logic), _helpItemView(), _invienItemView(), _setUpItemView()],
children: [_circleItemView(logic), _invienItemView(), _helpItemView(),_setUpItemView()],
);
}
@ -188,7 +188,7 @@ class MinefragmentPage extends StatelessWidget {
Row(
children: [
Image(
image: AssetImage(getHomeImage("mine_help")),
image: AssetImage(getMineImage("invite_icon")),
width: 24.sp,
height: 24.sp,
),
@ -203,7 +203,7 @@ class MinefragmentPage extends StatelessWidget {
Row(
children: [
const Text(
"免费领会员",
"免费领会员",
style: TextStyle(color: Colors.white60),
),
Image(

View File

@ -246,4 +246,15 @@ class Api {
//
static const applePayCallBack = 'mall-service/payment/apple/notify';
//
static const inviteMainPage = 'user-service/invite/mainPage';
//
static const inviteSysRecord = 'user-service/invite/record/rand';
//
static const inviteFillIn = 'user-service/invite/fillin';
}

View File

@ -100,8 +100,12 @@ dependencies:
tencent_chat_push_for_china: ^2.6.2+1
#苹果内购
in_app_purchase: ^3.0.8
#图片保存到相册
image_gallery_saver: ^1.7.1
#二维码生成
qr_flutter: ^4.0.0
#第三方分享平台
sharesdk_plugin: ^1.3.6
# sharesdk_plugin: 1.3.6
dev_dependencies:
flutter_test: