From 2312ab70843e98698281cef74410140c3eb10387 Mon Sep 17 00:00:00 2001 From: YangYuhao Date: Thu, 15 Jun 2023 17:01:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=91=E5=AE=9A=E9=82=AE=E7=AE=B1=20=20=20?= =?UTF-8?q?=E6=84=8F=E8=A7=81=E5=8F=8D=E9=A6=88=20=E6=B3=A8=E9=94=80?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=20=E4=B8=BE=E6=8A=A5=20=20=E7=9C=8B=E5=A4=A7?= =?UTF-8?q?=E5=9B=BE=20=E5=A2=9E=E5=8A=A0=E4=B8=83=E7=89=9B=E4=BA=91sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/assets/images/mine/icon_block.png | Bin 0 -> 8857 bytes .../assets/images/mine/icon_dialog_black.png | Bin 0 -> 21098 bytes circle_app/assets/images/mine/icon_report.png | Bin 0 -> 9338 bytes circle_app/lib/app/account/view.dart | 339 +++--- circle_app/lib/app/bindmail/binding.dart | 10 + circle_app/lib/app/bindmail/logic.dart | 7 + circle_app/lib/app/bindmail/state.dart | 5 + circle_app/lib/app/bindmail/view.dart | 208 ++++ circle_app/lib/app/feedback/binding.dart | 10 + circle_app/lib/app/feedback/logic.dart | 40 + circle_app/lib/app/feedback/state.dart | 5 + circle_app/lib/app/feedback/view.dart | 131 +++ circle_app/lib/app/help/view.dart | 43 +- .../app/login/complete_material/logic.dart | 2 +- .../lib/app/login/complete_material/view.dart | 11 +- circle_app/lib/app/minefragment/view.dart | 102 +- circle_app/lib/app/offaccount/binding.dart | 10 + circle_app/lib/app/offaccount/logic.dart | 10 + circle_app/lib/app/offaccount/state.dart | 12 + circle_app/lib/app/offaccount/view.dart | 322 ++++++ circle_app/lib/app/photoinfo/logic.dart | 4 + circle_app/lib/app/photoinfo/view.dart | 573 +++++----- circle_app/lib/app/report/binding.dart | 10 + circle_app/lib/app/report/logic.dart | 44 + circle_app/lib/app/report/state.dart | 13 + circle_app/lib/app/report/view.dart | 234 ++++ circle_app/lib/app/swiper/binding.dart | 10 + circle_app/lib/app/swiper/logic.dart | 8 + circle_app/lib/app/swiper/state.dart | 5 + circle_app/lib/app/swiper/view.dart | 44 + circle_app/lib/app/text/binding.dart | 10 + circle_app/lib/app/text/logic.dart | 7 + circle_app/lib/app/text/state.dart | 5 + circle_app/lib/app/text/view.dart | 998 ++++++++++++++++++ circle_app/lib/app/userinfo/logic.dart | 1 + circle_app/lib/app/userinfo/view.dart | 462 +++++--- circle_app/lib/router/app_pages.dart | 44 +- circle_app/lib/router/app_routers.dart | 6 + circle_app/pubspec.yaml | 2 + 39 files changed, 3154 insertions(+), 593 deletions(-) create mode 100644 circle_app/assets/images/mine/icon_block.png create mode 100644 circle_app/assets/images/mine/icon_dialog_black.png create mode 100644 circle_app/assets/images/mine/icon_report.png create mode 100644 circle_app/lib/app/bindmail/binding.dart create mode 100644 circle_app/lib/app/bindmail/logic.dart create mode 100644 circle_app/lib/app/bindmail/state.dart create mode 100644 circle_app/lib/app/bindmail/view.dart create mode 100644 circle_app/lib/app/feedback/binding.dart create mode 100644 circle_app/lib/app/feedback/logic.dart create mode 100644 circle_app/lib/app/feedback/state.dart create mode 100644 circle_app/lib/app/feedback/view.dart create mode 100644 circle_app/lib/app/offaccount/binding.dart create mode 100644 circle_app/lib/app/offaccount/logic.dart create mode 100644 circle_app/lib/app/offaccount/state.dart create mode 100644 circle_app/lib/app/offaccount/view.dart create mode 100644 circle_app/lib/app/report/binding.dart create mode 100644 circle_app/lib/app/report/logic.dart create mode 100644 circle_app/lib/app/report/state.dart create mode 100644 circle_app/lib/app/report/view.dart create mode 100644 circle_app/lib/app/swiper/binding.dart create mode 100644 circle_app/lib/app/swiper/logic.dart create mode 100644 circle_app/lib/app/swiper/state.dart create mode 100644 circle_app/lib/app/swiper/view.dart create mode 100644 circle_app/lib/app/text/binding.dart create mode 100644 circle_app/lib/app/text/logic.dart create mode 100644 circle_app/lib/app/text/state.dart create mode 100644 circle_app/lib/app/text/view.dart diff --git a/circle_app/assets/images/mine/icon_block.png b/circle_app/assets/images/mine/icon_block.png new file mode 100644 index 0000000000000000000000000000000000000000..490bca83b26b67c3ac028ba1f8ddb98cdd2d429e GIT binary patch literal 8857 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 b(kJ?V1F3k2F6s~v00000NkvXXu0mjf44qYb literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/mine/icon_dialog_black.png b/circle_app/assets/images/mine/icon_dialog_black.png new file mode 100644 index 0000000000000000000000000000000000000000..2de0b6b28d89d90e802a9d873755d64b35dda497 GIT binary patch literal 21098 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/mine/icon_report.png b/circle_app/assets/images/mine/icon_report.png new file mode 100644 index 0000000000000000000000000000000000000000..7a574470b303e86ef2640e46c9d12a160b63f02b GIT binary patch literal 9338 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 literal 0 HcmV?d00001 diff --git a/circle_app/lib/app/account/view.dart b/circle_app/lib/app/account/view.dart index 37f40a0..8c0f7dd 100644 --- a/circle_app/lib/app/account/view.dart +++ b/circle_app/lib/app/account/view.dart @@ -25,7 +25,7 @@ class AccountPage extends StatelessWidget { child: Scaffold( backgroundColor: Colors.transparent, appBar: MyAppBar( - centerTitle: '设置', + centerTitle: '账号中心', ), body: Scaffold( backgroundColor: Colors.transparent, @@ -53,35 +53,39 @@ class AccountPage extends StatelessWidget { // ], // ), // ), - - // Container( - // margin: EdgeInsets.only(top: 16.0), - // child: Row( - // children: [ - // Text( - // "换绑手机号", - // style: TextStyle( - // color: Color(0xFFF7FAFA), - // fontSize: 16.0, - // ), - // ), - // Spacer(), - // Text( - // "16677778888", - // style: TextStyle( - // color: Color(0xFFB7BECC), - // fontSize: 16.0, - // ), - // ), - // SizedBox(width: 8.0), - // Image.asset( - // getHomeImage("icon_in"), - // width: 24.0, - // height: 24.0, - // ), - // ], - // ), - // ), + GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.PhotoActivity); + }, + child: Container( + margin: EdgeInsets.only(top: 16.0), + child: Row( + children: [ + Text( + "换绑手机号", + style: TextStyle( + color: Color(0xFFF7FAFA), + fontSize: 16.0, + ), + ), + Spacer(), + Text( + "16677778888", + style: TextStyle( + color: Color(0xFFB7BECC), + fontSize: 16.0, + ), + ), + SizedBox(width: 8.0), + Image.asset( + getHomeImage("icon_in"), + width: 24.0, + height: 24.0, + ), + ], + ), + ), + ), // Container( // margin: EdgeInsets.only(top: 16.0), // child: Row( @@ -102,149 +106,160 @@ class AccountPage extends StatelessWidget { // ], // ), // ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: (){ + Get.toNamed(AppRoutes.OffAccountActivity); + }, + child: Container( + margin: EdgeInsets.only(top: 16.0), + child: Row( + children: [ + Text( + "注销账号", + style: TextStyle( + color: Color(0xFFF7FAFA), + fontSize: 16.0, + ), + ), + Spacer(), + Image.asset( + getHomeImage("icon_in"), + width: 24.0, + height: 24.0, + ), + ], + ), + ) ,) + , // Container( - // margin: EdgeInsets.only(top: 16.0), + // margin: EdgeInsets.only(top: 0.0.sp, left: 0.sp), + // child: Text( + // "账号绑定", + // style: TextStyle( + // color: Color(0xFFF7FAFA), + // fontSize: 16.0.sp, + // ), + // ), + // ), + // Container( + // margin: EdgeInsets.only(top: 16.0.sp), // child: Row( // children: [ // Text( - // "注销账号", + // "已绑定手机号", // style: TextStyle( - // color: Color(0xFFF7FAFA), - // fontSize: 16.0, + // color: Color(0xFFB7BECC), + // fontSize: 16.0.sp, // ), // ), // Spacer(), - // Image.asset( - // getHomeImage("icon_in"), - // width: 24.0, - // height: 24.0, - // ), + // Container( + // alignment: Alignment.center, + // width: 60.sp, + // height: 28.sp, + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(14.0.sp), + // border: Border.all( + // width: 0.4.sp, + // color: Colors.white, + // ), + // ), + // child: GestureDetector( + // onTap: (){ + // Get.toNamed(AppRoutes.PhotoActivity); + // }, + // child:Text( + // "换绑", + // style: TextStyle( + // color: Color(0xFFB7BECC), + // fontSize: 14.0.sp, + // ), + // )) ,) // ], // ), // ), - Container( - margin: EdgeInsets.only(top: 0.0.sp, left: 16.0.sp), - child: Text( - "账号绑定", - style: TextStyle( - color: Color(0xFFF7FAFA), - fontSize: 16.0.sp, - ), - ), - ), - Container( - margin: EdgeInsets.only(top: 16.0.sp), - child: Row( - children: [ - Text( - "已绑定手机号", - style: TextStyle( - color: Color(0xFFB7BECC), - fontSize: 16.0.sp, - ), - ), - Spacer(), - Container( - alignment: Alignment.center, - width: 60.sp, - height: 28.sp, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(14.0.sp), - border: Border.all( - width: 0.4.sp, - color: Colors.white, - ), - ), - child: GestureDetector( - onTap: (){ - Get.toNamed(AppRoutes.PhotoActivity); - }, - child:Text( - "换绑", - style: TextStyle( - color: Color(0xFFB7BECC), - fontSize: 14.0.sp, - ), - )) ,) - ], - ), - ), - Container( - margin: EdgeInsets.only(top: 16.0.sp), - child: Row( - children: [ - Text( - "微信", - style: TextStyle( - color: Color(0xFFB7BECC), - fontSize: 16.0.sp, - ), - ), - Spacer(), - Container( - alignment: Alignment.center, - width: 60.sp, - height: 28.sp, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(14.0.sp), - border: Border.all( - width: 0.4.sp, - color: Colors.white, - ), - ), - child: Text( - "去绑定", - style: TextStyle( - color: Color(0xFFB7BECC), - fontSize: 14.0.sp, - ), - )), - ], - ), - ), - Container( - margin: EdgeInsets.only(top: 16.0.sp), - child: Row( - children: [ - Text( - "邮箱", - style: TextStyle( - color: Color(0xFFB7BECC), - fontSize: 16.0.sp, - ), - ), - Spacer(), - Container( - alignment: Alignment.center, - width: 60.sp, - height: 28.sp, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(14.0.sp), - border: Border.all( - width: 0.4.sp, - color: Colors.white, - ), - ), - child: Text( - "去绑定", - style: TextStyle( - color: Color(0xFFB7BECC), - fontSize: 14.0.sp, - ), - )), - ], - ), - ), - Container( - margin: EdgeInsets.only(top: 16.0.sp), - child: Text( - "温馨提示:完成账号绑定后,手机丢失或忘记密码也可以通过其他方式登录", - style: TextStyle( - color: Color(0xFFB7BECC), - fontSize: 12.0.sp, - ), - ), - ), + // Container( + // margin: EdgeInsets.only(top: 16.0.sp), + // child: Row( + // children: [ + // Text( + // "微信", + // style: TextStyle( + // color: Color(0xFFB7BECC), + // fontSize: 16.0.sp, + // ), + // ), + // Spacer(), + // Container( + // alignment: Alignment.center, + // width: 60.sp, + // height: 28.sp, + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(14.0.sp), + // border: Border.all( + // width: 0.4.sp, + // color: Colors.white, + // ), + // ), + // child: Text( + // "去绑定", + // style: TextStyle( + // color: Color(0xFFB7BECC), + // fontSize: 14.0.sp, + // ), + // )), + // ], + // ), + // ), + // Container( + // margin: EdgeInsets.only(top: 16.0.sp), + // child: Row( + // children: [ + // Text( + // "邮箱", + // style: TextStyle( + // color: Color(0xFFB7BECC), + // fontSize: 16.0.sp, + // ), + // ), + // Spacer(), + // GestureDetector( + // onTap: (){ + // Get.toNamed(AppRoutes.BindMailActivity); + // }, + // child: Container( + // alignment: Alignment.center, + // width: 60.sp, + // height: 28.sp, + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(14.0.sp), + // border: Border.all( + // width: 0.4.sp, + // color: Colors.white, + // ), + // ), + // child: Text( + // "去绑定", + // style: TextStyle( + // color: Color(0xFFB7BECC), + // fontSize: 14.0.sp, + // ), + // )),) + // + // ], + // ), + // ), + // Container( + // margin: EdgeInsets.only(top: 16.0.sp), + // child: Text( + // "温馨提示:完成账号绑定后,手机丢失或忘记密码也可以通过其他方式登录", + // style: TextStyle( + // color: Color(0xFFB7BECC), + // fontSize: 12.0.sp, + // ), + // ), + // ), Container( margin: EdgeInsets.only( top: 40.0.sp, left: 72.0.sp, right: 72.0.sp), diff --git a/circle_app/lib/app/bindmail/binding.dart b/circle_app/lib/app/bindmail/binding.dart new file mode 100644 index 0000000..4faad6b --- /dev/null +++ b/circle_app/lib/app/bindmail/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class BindmailBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => BindmailLogic()); + } +} diff --git a/circle_app/lib/app/bindmail/logic.dart b/circle_app/lib/app/bindmail/logic.dart new file mode 100644 index 0000000..73d20ae --- /dev/null +++ b/circle_app/lib/app/bindmail/logic.dart @@ -0,0 +1,7 @@ +import 'package:get/get.dart'; + +import 'state.dart'; + +class BindmailLogic extends GetxController { + final BindmailState state = BindmailState(); +} diff --git a/circle_app/lib/app/bindmail/state.dart b/circle_app/lib/app/bindmail/state.dart new file mode 100644 index 0000000..f617a6c --- /dev/null +++ b/circle_app/lib/app/bindmail/state.dart @@ -0,0 +1,5 @@ +class BindmailState { + BindmailState() { + ///Initialize variables + } +} diff --git a/circle_app/lib/app/bindmail/view.dart b/circle_app/lib/app/bindmail/view.dart new file mode 100644 index 0000000..4b12e9e --- /dev/null +++ b/circle_app/lib/app/bindmail/view.dart @@ -0,0 +1,208 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../components/my_app_bar.dart'; +import '../../util/util.dart'; +import 'logic.dart'; + +class BindmailPage extends StatefulWidget { + BindmailPage({Key? key}) : super(key: key); + + @override + _BindmailPageState createState() => _BindmailPageState(); +} + +class _BindmailPageState extends State { + int _countdownSeconds = 60; + bool _isCountingDown = false; + Timer? _timer; + + @override + void dispose() { + _timer?.cancel(); + super.dispose(); + } + + void startCountdown() { + setState(() { + _isCountingDown = true; + _countdownSeconds = 60; + }); + + _timer = Timer.periodic(Duration(seconds: 1), (timer) { + setState(() { + if (_countdownSeconds > 0) { + _countdownSeconds--; + } else { + _isCountingDown = false; + _timer?.cancel(); + } + }); + }); + } + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: MyAppBar( + centerTitle: '绑定邮箱', + ), + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Existing code... + Container( + margin: EdgeInsets.only( + left: 16.0.sp, + top: 16.0.sp, + right: 16.0.sp, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0.sp), + color: Color(0xff282733), + ), + height: 40.0.sp, + child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.only(left: 16.0.sp, right: 10.sp), + child: Text( + " 邮箱 ", + style: TextStyle( + color: Colors.white, + fontSize: 14.0.sp, + ), + )), + Expanded( + child: Container( + height: 32.sp, + alignment: Alignment.center, + child: TextField( + textAlignVertical: TextAlignVertical.center, + decoration: InputDecoration( + hintText: "请输入邮箱", + hintStyle: TextStyle( + color: Colors.grey.shade300, + fontSize: 14.0, + ), + border: InputBorder.none, + ), + style: TextStyle( + color: Colors.white, + fontSize: 14.0, + height: 1.0, + ), + ), + ), + ) + ], + ), + ), + Row( + children: [ + Expanded( + flex: 4, + child: Container( + margin: EdgeInsets.fromLTRB( + 16.0.sp, 20.0.sp, 8.0.sp, 0.0.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0.sp), + color: Color(0xff282733), + ), + height: 40.0.sp, + child: Row( + children: [ + Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.only( + left: 10.0.sp, right: 10.sp), + child: Text( + "验证码", + style: TextStyle(color: Colors.white), + ), + ), + Expanded( + child: Container( + height: 32.sp, + alignment: Alignment.center, + child: TextField( + textAlignVertical: + TextAlignVertical.center, + decoration: InputDecoration( + hintText: "请输入验证码", + hintStyle: TextStyle( + color: Colors.grey.shade300, + fontSize: 14.0, + ), + border: InputBorder.none, + ), + style: TextStyle( + color: Colors.white, + fontSize: 14.0, + height: 1.0, + ), + ), + ), + ) + ], + ), + ), + ), + Expanded( + flex: 2, + child: GestureDetector( + onTap: () { + if (!_isCountingDown) { + // Only start countdown if not already counting down + startCountdown(); + } + }, + child: Container( + margin: EdgeInsets.fromLTRB( + 8.0.sp, 20.0.sp, 16.0.sp, 0.0.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0.sp), + color: Color(0xff282733), + ), + height: 40.0.sp, + child: Center( + child: Text( + _isCountingDown + ? '$_countdownSeconds 秒' + : '获取验证码', + style: TextStyle( + color: _isCountingDown + ? Colors.grey.shade400 + : Colors.white, + fontSize: 14.0.sp, + ), + ), + ), + ), + ), + ), + ], + ), + + // Existing code... + ], + ), + ), + ), + ); + } +} diff --git a/circle_app/lib/app/feedback/binding.dart b/circle_app/lib/app/feedback/binding.dart new file mode 100644 index 0000000..3b0dd60 --- /dev/null +++ b/circle_app/lib/app/feedback/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class FeedbackBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => FeedbackLogic()); + } +} diff --git a/circle_app/lib/app/feedback/logic.dart b/circle_app/lib/app/feedback/logic.dart new file mode 100644 index 0000000..dc3f8d3 --- /dev/null +++ b/circle_app/lib/app/feedback/logic.dart @@ -0,0 +1,40 @@ +import 'dart:io'; + +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart'; + +import 'state.dart'; + +class FeedbackLogic extends GetxController { + final FeedbackState state = FeedbackState(); + + final ImagePicker _picker = ImagePicker(); + var storage = Storage(); + + Future getImageFile() async { + try { + final XFile? pickedFile = await _picker.pickImage( + source: ImageSource.gallery, + ); + _setImageFileListFromFile(pickedFile!); + // setState(() { + // _setImageFileListFromFile(pickedFile); + // }); + } catch (e) { + // setState(() { + // _pickImageError = e; + // }); + } + } + + void _setImageFileListFromFile(XFile pickedFile) { + PutController putController = PutController(); + + // 添加任务状态监听 + putController.addStatusListener((StorageStatus status) { + print('状态变化: 当前任务状态:$status'); + }); + storage.putFile(File(pickedFile.path), "",options: PutOptions(controller: putController)); + } +} diff --git a/circle_app/lib/app/feedback/state.dart b/circle_app/lib/app/feedback/state.dart new file mode 100644 index 0000000..4aeb851 --- /dev/null +++ b/circle_app/lib/app/feedback/state.dart @@ -0,0 +1,5 @@ +class FeedbackState { + FeedbackState() { + ///Initialize variables + } +} diff --git a/circle_app/lib/app/feedback/view.dart b/circle_app/lib/app/feedback/view.dart new file mode 100644 index 0000000..452eb04 --- /dev/null +++ b/circle_app/lib/app/feedback/view.dart @@ -0,0 +1,131 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../components/my_app_bar.dart'; +import '../../util/util.dart'; +import 'logic.dart'; + +class FeedbackPage extends StatelessWidget { + FeedbackPage({Key? key}) : super(key: key); + + final logic = Get.find(); + final state = Get + .find() + .state; + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (FeedbackLogic controller){ + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: MyAppBar( + centerTitle: '意见反馈', + ), + body: SingleChildScrollView(child: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 200, + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 20), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(13), + color: Color( + 0xFF4C3E5F), // Use your desired background color + ), + padding: EdgeInsets.all(13), + child: TextField( + decoration: InputDecoration( + hintText: '请补充详细问题和意见,我们会认真看完的哦~', + hintStyle: TextStyle( + color: Color(0xFFB7BECC), fontSize: 14.sp), + border: InputBorder.none, + + ), + maxLines: null, + maxLength: 200, + + inputFormatters: [ + LengthLimitingTextInputFormatter(200), + ], + style: TextStyle(color: Colors.white), + + ), + ), + Container( + height: 120.sp, + margin: EdgeInsets.only(left: 16.sp,right: 16.sp), + child: GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, // 每行显示的项目数量 + ), + itemCount: 4, // Replace with your item count + itemBuilder: (context, index) { + if (index == 0) { + // 第一个项目,显示固定的图片 + return GestureDetector( + onTap: () { + controller.getImageFile(); + }, + child: Container( + margin: EdgeInsets.all(5.sp), + child: Image( + image: AssetImage(getMineImage("icon_img_add")), + ), + ), + ); + } else { + // 后续项目,根据接口获取数据 + // 假设通过接口获取到的数据存储在一个名为 data 的列表中 + // var itemData = data[index - 1]; // 减去第一个固定图片的索引 + return Container( + margin: EdgeInsets.all(5.sp), + child: Center( + // child: _buildImageItem( + // 'https://book.flutterchina.club/assets/img/logo.png'), + ), + ); + } + }, + ), + ), + Padding( + padding: EdgeInsets.only(left: 16, top: 10), + child: Text( + '最多选择3张图片', + style: TextStyle(color: Color(0xFFB7BECC), fontSize: 12), + ), + ), + SizedBox(height: 50), + Container( + margin: EdgeInsets.symmetric(horizontal: 72), + height: 42, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21), + color: Color(0xFF21BEAB), + ), + child: Center( + child: Text( + '提交', + style: TextStyle(color: Colors.white, fontSize: 16), + ), + ), + ), + ], + ), + ),) + ), + ); + }); + } + +} \ No newline at end of file diff --git a/circle_app/lib/app/help/view.dart b/circle_app/lib/app/help/view.dart index cfc9271..9e31afb 100644 --- a/circle_app/lib/app/help/view.dart +++ b/circle_app/lib/app/help/view.dart @@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../components/my_app_bar.dart'; +import '../../router/app_routers.dart'; import '../../util/util.dart'; import 'logic.dart'; @@ -28,13 +29,13 @@ class HelpPage extends StatelessWidget { ), body: SafeArea( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + children: [ Padding( padding: EdgeInsets.only(top: 30.sp), child: Center( child: Text( - '04-10 19:50', + '04-10 19:51', style: TextStyle( color: Color(0xFFB7BECC), fontSize: 12.sp, @@ -44,10 +45,20 @@ class HelpPage extends StatelessWidget { ), SizedBox(height: 16.sp), Padding( - padding: EdgeInsets.only(left: 16.sp,right: 16.sp), + padding: EdgeInsets.only(left: 16.sp, right: 16.sp), child: Row( children: [ - Image.asset(getMineImage("im_feedback"),width: 32.sp,height: 32.sp,), + Container( + height: 200.sp, + child: Align( + alignment: Alignment.topCenter, + child: Image.asset( + getMineImage("im_feedback"), + width: 32.sp, + height: 32.sp, + ), + ), + ), SizedBox(width: 8.sp), Expanded( child: Container( @@ -91,9 +102,14 @@ class HelpPage extends StatelessWidget { children: [ TextButton.icon( onPressed: () { + Get.toNamed(AppRoutes.FeedbackActivity); // Handle feedback button press }, - icon: Image.asset(getMineImage("im_feedback_write"),width: 14.sp,height: 14.sp,), + icon: Image.asset( + getMineImage("im_feedback_write"), + width: 14.sp, + height: 14.sp, + ), label: Text( '意见反馈', style: TextStyle( @@ -103,18 +119,23 @@ class HelpPage extends StatelessWidget { ), style: TextButton.styleFrom( backgroundColor: Color(0xFF21BEAB), - padding: EdgeInsets.symmetric(horizontal: 16.sp, vertical: 4.sp), + padding: EdgeInsets.symmetric( + horizontal: 16.sp, vertical: 4.sp), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20.sp), ), ), ), - SizedBox(width: 10), + SizedBox(width: 20), TextButton.icon( onPressed: () { // Handle contact service button press }, - icon: Image.asset(getMineImage("im_service"),width: 14.sp,height: 14.sp,), + icon: Image.asset( + getMineImage("im_service"), + width: 14.sp, + height: 14.sp, + ), label: Text( '联系客服', style: TextStyle( @@ -124,7 +145,8 @@ class HelpPage extends StatelessWidget { ), style: TextButton.styleFrom( backgroundColor: Color(0xFF21BEAB), - padding: EdgeInsets.symmetric(horizontal: 16.sp, vertical: 4.sp), + padding: EdgeInsets.symmetric( + horizontal: 16.sp, vertical: 4.sp), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20.sp), ), @@ -139,7 +161,4 @@ class HelpPage extends StatelessWidget { ), ); } - - - } diff --git a/circle_app/lib/app/login/complete_material/logic.dart b/circle_app/lib/app/login/complete_material/logic.dart index c62ab85..7f6638e 100644 --- a/circle_app/lib/app/login/complete_material/logic.dart +++ b/circle_app/lib/app/login/complete_material/logic.dart @@ -9,7 +9,7 @@ import 'state.dart'; class Complete_materialLogic extends GetxController { final Complete_materialState state = Complete_materialState(); final ImagePicker _picker = ImagePicker(); - + var type = Get.arguments ?? ""; Future getImageFile() async { try { final XFile? pickedFile = await _picker.pickImage( diff --git a/circle_app/lib/app/login/complete_material/view.dart b/circle_app/lib/app/login/complete_material/view.dart index 359a010..2bc25c3 100644 --- a/circle_app/lib/app/login/complete_material/view.dart +++ b/circle_app/lib/app/login/complete_material/view.dart @@ -18,6 +18,7 @@ class Complete_materialPage extends StatelessWidget { // PickerStyle pickerStyle = PickerStyle(); @override Widget build(BuildContext context) { + return GetBuilder(builder: (Complete_materialLogic controller) { return Stack( children: [ @@ -179,7 +180,12 @@ class Complete_materialPage extends StatelessWidget { ), GestureDetector( onTap: () { - controller.pushHome(); + if(controller.type=="user"){ + Navigator.pop(context); + }else{ + controller.pushHome(); + } + // controller.checkInfo(); }, child: Container( @@ -192,7 +198,7 @@ class Complete_materialPage extends StatelessWidget { image: AssetImage(getLoginImage('start_bg'))), ), child: Text( - '开启小圈之旅', + controller.type=="user"? "完成" : '开启小圈之旅', style: TextStyle( color: Color(0xff00FFF4), fontSize: 16.sp, @@ -211,6 +217,7 @@ class Complete_materialPage extends StatelessWidget { }); } + Widget funcWidget( String leftStr, Widget tipWidget, GestureTapCallback callback, {String img = 'down_arr'}) { diff --git a/circle_app/lib/app/minefragment/view.dart b/circle_app/lib/app/minefragment/view.dart index 54313e7..9ef4358 100644 --- a/circle_app/lib/app/minefragment/view.dart +++ b/circle_app/lib/app/minefragment/view.dart @@ -9,7 +9,7 @@ import 'logic.dart'; class MinefragmentPage extends StatelessWidget { MinefragmentPage({Key? key}) : super(key: key); - // final logic = Get.lazyPut(() => MinefragmentLogic()); + // final logic = Get.lazyPut(() => MinefragmentLogic()); // final state = Get.find().state; @@ -59,55 +59,53 @@ class MinefragmentPage extends StatelessWidget { } Widget _SetUpItemView() { - return GestureDetector( + return GestureDetector( behavior: HitTestBehavior.opaque, - onTap: () { - Get.toNamed(AppRoutes.SetUpActivity); - // controller.state.hearUrl - - }, - child: Container( - // color: Colors.red, - margin: EdgeInsets.only(top: 18), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Image( - image: AssetImage(getHomeImage("mine_setup")), - width: 24, - height: 24, - ), - SizedBox(width: 10), - Text( - "设置", - style: TextStyle(color: Colors.white), - ), - ], - ), - Row( - children: [ - Image( - image: AssetImage(getHomeImage("icon_in")), - width: 24, - height: 24, - ), - ], - ) - ], - ), + onTap: () { + Get.toNamed(AppRoutes.SetUpActivity); + // controller.state.hearUrl + }, + child: Container( + // color: Colors.red, + margin: EdgeInsets.only(top: 18), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Image( + image: AssetImage(getHomeImage("mine_setup")), + width: 24, + height: 24, + ), + SizedBox(width: 10), + Text( + "设置", + style: TextStyle(color: Colors.white), + ), + ], + ), + Row( + children: [ + Image( + image: AssetImage(getHomeImage("icon_in")), + width: 24, + height: 24, + ), + ], + ) + ], ), - ); + ), + ); } Widget _HelpItemView() { - return GestureDetector( + return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { Get.toNamed(AppRoutes.HelpActivity); // controller.state.hearUrl - }, child: Container( margin: EdgeInsets.only(top: 18), @@ -194,7 +192,7 @@ class MinefragmentPage extends StatelessWidget { behavior: HitTestBehavior.opaque, onTap: () { print("我喜欢的"); - Get.toNamed(AppRoutes.FriendsActivity,arguments: "0"); + Get.toNamed(AppRoutes.FriendsActivity, arguments: "0"); }, child: Container( child: Column( @@ -230,9 +228,9 @@ class MinefragmentPage extends StatelessWidget { behavior: HitTestBehavior.opaque, onTap: () { print("喜欢我的"); - Get.toNamed(AppRoutes.FriendsActivity,arguments: "1"); + Get.toNamed(AppRoutes.FriendsActivity, arguments: "1"); }, - child: Stack( + child: Stack( children: [ Column( mainAxisAlignment: MainAxisAlignment.center, @@ -285,9 +283,9 @@ class MinefragmentPage extends StatelessWidget { behavior: HitTestBehavior.opaque, onTap: () { print("最近来访"); - Get.toNamed(AppRoutes.FriendsActivity,arguments: "2"); + Get.toNamed(AppRoutes.FriendsActivity, arguments: "2"); }, - child: Stack( + child: Stack( children: [ Column( mainAxisAlignment: MainAxisAlignment.center, @@ -336,8 +334,6 @@ class MinefragmentPage extends StatelessWidget { ], ), ), - - ], ), ), @@ -348,7 +344,7 @@ class MinefragmentPage extends StatelessWidget { return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { - Get.toNamed(AppRoutes.UserInfoActivity,arguments: ""); + Get.toNamed(AppRoutes.UserInfoActivity, arguments: ""); }, child: Container( width: Get.width, @@ -378,12 +374,10 @@ class MinefragmentPage extends StatelessWidget { } Widget _buildAvatar1() { - return ClipOval( + return ClipOval( child: GestureDetector( onTap: () { - // controller.state.hearUrl = - // 'https://book.flutterchina.club/assets/img/logo.png'; - // controller.update(); + // Get.toNamed(AppRoutes.Swiper,arguments:imgList); }, child: Image.network( 'https://book.flutterchina.club/assets/img/logo.png', @@ -391,8 +385,8 @@ class MinefragmentPage extends StatelessWidget { height: 65, ), ), - ); + ); } Widget _buildNameRow() { diff --git a/circle_app/lib/app/offaccount/binding.dart b/circle_app/lib/app/offaccount/binding.dart new file mode 100644 index 0000000..a26fffb --- /dev/null +++ b/circle_app/lib/app/offaccount/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class OffaccountBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => OffaccountLogic()); + } +} diff --git a/circle_app/lib/app/offaccount/logic.dart b/circle_app/lib/app/offaccount/logic.dart new file mode 100644 index 0000000..0783eb8 --- /dev/null +++ b/circle_app/lib/app/offaccount/logic.dart @@ -0,0 +1,10 @@ +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; + +import 'state.dart'; + +class OffaccountLogic extends GetxController { + final OffaccountState state = OffaccountState(); + + +} diff --git a/circle_app/lib/app/offaccount/state.dart b/circle_app/lib/app/offaccount/state.dart new file mode 100644 index 0000000..b99fba8 --- /dev/null +++ b/circle_app/lib/app/offaccount/state.dart @@ -0,0 +1,12 @@ +import 'package:flutter/cupertino.dart'; + +class OffaccountState { + OffaccountState() { + ///Initialize variables + } + + String offReasonMsg = "请选择"; + TextEditingController photoController = TextEditingController(); + + +} diff --git a/circle_app/lib/app/offaccount/view.dart b/circle_app/lib/app/offaccount/view.dart new file mode 100644 index 0000000..3ac36fb --- /dev/null +++ b/circle_app/lib/app/offaccount/view.dart @@ -0,0 +1,322 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../components/my_app_bar.dart'; +import '../../util/util.dart'; +import 'logic.dart'; + +class OffaccountPage extends StatefulWidget { + OffaccountPage({Key? key}) : super(key: key); + + @override + _OffaccountState createState() => _OffaccountState(); +} + +class _OffaccountState extends State { + int countdown = 10; // 初始倒计时时间 + bool isButtonDisabled = false; // 按钮是否禁用 + late Timer timer; + + @override + void initState() { + super.initState(); + startCountdown(); + } + + @override + void dispose() { + timer.cancel(); + super.dispose(); + } + + void startCountdown() { + timer = Timer.periodic(Duration(seconds: 1), (Timer t) { + setState(() { + if (countdown > 0) { + countdown--; + } else { + timer.cancel(); + } + }); + }); + } + + void handleLogout(OffaccountLogic logic) { + if(countdown > 0 ){ + + }else{ + showToast(logic.state.photoController.text.toString()+""); + } + + // 执行注销操作 + } + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (logic) { + + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: MyAppBar(centerTitle: '注销账号'), + body: Scaffold( + backgroundColor: Colors.transparent, + body: SingleChildScrollView( + child: Container( + padding: EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 注销提示信息 + Text( + "注销后,你的账号将", + style: TextStyle( + color: Colors.white, + fontSize: 16, + ), + ), + SizedBox(height: 8), + Text( + "1、无法登录跨友app;", + style: TextStyle( + color: Color(0xFFB7BECC), + fontSize: 12, + ), + ), + Text( + "2、所有信息将被永远删除:身份信息、账户信息、会员、喊话、相册等内容;", + style: TextStyle( + color: Color(0xFFB7BECC), + fontSize: 12, + ), + ), + Text( + "3、您的好友无法与你取得联系(包括关注、粉丝等);", + style: TextStyle( + color: Color(0xFFB7BECC), + fontSize: 12, + ), + ), + Text( + "4、注销后,一个月内该手机号将无法注册新的账号。", + style: TextStyle( + color: Color(0xFFB7BECC), + fontSize: 12, + ), + ), + SizedBox(height: 10), + + // 输入手机号或邮箱 + Text( + "请输入绑定的手机号", + style: TextStyle( + color: Color(0xFF898F99), + fontSize: 10, + ), + ), + SizedBox(height: 10), + TextFormField( + controller: logic.state.photoController, + keyboardType: TextInputType.phone, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + FilteringTextInputFormatter.deny(RegExp('[^0-9]')), + ], + decoration: InputDecoration( + hintText: "请输入手机号", + hintStyle: TextStyle( + color: Colors.white, + fontSize: 14, + ), + filled: true, + fillColor: Color(0xFF000000), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(4), + borderSide: BorderSide.none, + ), + contentPadding: EdgeInsets.symmetric(horizontal: 16), + ), + style: TextStyle( + color: Colors.white, + fontSize: 14, + ), + // enabled: countdown == 0, // 当倒计时结束后才可编辑 + ), + SizedBox(height: 16), + + // 选择注销原因 + Text( + "请选择你的注销原因", + style: TextStyle( + color: Color(0xFF898F99), + fontSize: 10, + ), + ), + SizedBox(height: 10), + GestureDetector(onTap: () { + showBottomSheetDialog(context,logic); + }, + child: Container( + width: double.infinity, + height: 40, + margin: EdgeInsets.only(top: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + color: Color(0xFF000000), + ), + child: Row( + children: [ + Expanded( + child: TextFormField( + enabled: false, + decoration: InputDecoration( + hintText: logic.state.offReasonMsg, + hintStyle: TextStyle( + color: Color(0xFFF7FAFA), + fontSize: 14, + ), + border: InputBorder.none, + contentPadding: EdgeInsets.only(left: 16), + ), + style: TextStyle( + color: Color(0xFFF7FAFA), + fontSize: 14, + ), + ), + ), + Image.asset( + getHomeImage("icon_in"), + width: 14, + height: 14, + ), + ], + ), + ),) + , + SizedBox(height: 42), + + // 注销按钮 + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + + }, child: Align( + alignment: Alignment.bottomCenter, + child: Container( + width: 160, + child: ElevatedButton( + onPressed: (){ + handleLogout(logic); + }, + child: Text( + countdown > 0 ? "注销($countdown s)" : "注销", + ), + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + countdown > 0 ? Colors.grey : Color(0xFF21BEAB), + ), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(17), + ), + ), + ), + ), + ), + ),) + , + ], + ), + ), + ), + ), + ), + ); + }); + } + + + void showBottomSheetDialog(BuildContext context,OffaccountLogic logic) { + showModalBottomSheet( + context: context, + backgroundColor: Colors.transparent, + builder: (BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.6), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + buildOptionItem("体验太差", context,logic), + buildDivider(), + buildOptionItem("换平台了", context,logic), + buildDivider(), + buildOptionItem("担心隐私泄露", context,logic), + ], + ), + ); + }, + ); + } + + Widget buildOptionItem(String title, BuildContext context,OffaccountLogic logic) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + // 处理选项点击事件 + Navigator.pop(context); + logic.state.offReasonMsg = title; + logic.update(); + // 执行相应操作 + // switch (title) { + // case "体验太差": + // + // // 执行体验操作 + // break; + // case "换平台了": + // // 执行换平台操作 + // break; + // case "担心隐私泄露": + // // 执行泄露隐私操作 + // break; + // } + }, + child: Container( + width: Get.width, + alignment: Alignment.center, + padding: EdgeInsets.symmetric(vertical: 16), + child: Text( + title, + style: TextStyle( + fontSize: 16, + color: Colors.white, + ), + ), + ), + ); + } + + Widget buildDivider() { + return Container( + height: 0.5, + color: Color(0xff2E2E3B), + margin: EdgeInsets.symmetric(horizontal: 16), + ); + } + +} \ No newline at end of file diff --git a/circle_app/lib/app/photoinfo/logic.dart b/circle_app/lib/app/photoinfo/logic.dart index 512353f..9e016ac 100644 --- a/circle_app/lib/app/photoinfo/logic.dart +++ b/circle_app/lib/app/photoinfo/logic.dart @@ -1,7 +1,11 @@ +import 'package:circle_app/util/util.dart'; +import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'state.dart'; class PhotoinfoLogic extends GetxController { final PhotoinfoState state = PhotoinfoState(); + + } diff --git a/circle_app/lib/app/photoinfo/view.dart b/circle_app/lib/app/photoinfo/view.dart index f71a461..0e034ce 100644 --- a/circle_app/lib/app/photoinfo/view.dart +++ b/circle_app/lib/app/photoinfo/view.dart @@ -1,4 +1,7 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -6,281 +9,373 @@ import '../../components/my_app_bar.dart'; import '../../util/util.dart'; import 'logic.dart'; -class PhotoinfoPage extends StatelessWidget { +class PhotoinfoPage extends StatefulWidget { PhotoinfoPage({Key? key}) : super(key: key); - final logic = Get.find(); - final state = Get.find().state; + @override + _PhotoinfoPage createState() => _PhotoinfoPage(); +} + +class _PhotoinfoPage extends State { + + int _countdownSeconds = 60; + bool _isCountingDown = false; + Timer? _timer; + TextEditingController _photoController = TextEditingController(); + TextEditingController _passwordController = TextEditingController(); + TextEditingController _newPhotoController = TextEditingController(); + TextEditingController _codeController = TextEditingController(); + @override + void dispose() { + _timer?.cancel(); + super.dispose(); + } + + void startCountdown() { + setState(() { + _isCountingDown = true; + _countdownSeconds = 60; + }); + + _timer = Timer.periodic(Duration(seconds: 1), (timer) { + setState(() { + if (_countdownSeconds > 0) { + _countdownSeconds--; + } else { + _isCountingDown = false; + _timer?.cancel(); + } + }); + }); + } + @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage(getBaseImage("home_back")), - fit: BoxFit.cover, + return GetBuilder(builder: (logic) { + + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), ), - ), - child: Scaffold( - backgroundColor: Colors.transparent, - appBar: MyAppBar( - centerTitle: '换绑手机号', - ), - body: Scaffold( + child: Scaffold( backgroundColor: Colors.transparent, - body: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - margin: EdgeInsets.only( - left: 16.0.sp, - top: 16.0.sp, - right: 16.0.sp, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4.0.sp), - color: Color(0xff282733), - ), - height: 40.0.sp, - child: Row( - // mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - alignment: Alignment.centerLeft, - padding: EdgeInsets.only(left: 16.0.sp, right: 10.sp), - child: Text( - "+86", - style: TextStyle( - color: Colors.white, - fontSize: 14.0.sp, - ), - )), - Expanded( - child: Container( - height: 32.sp, - alignment: Alignment.center, - child: TextField( - textAlignVertical: TextAlignVertical.center, - decoration: InputDecoration( - hintText: "请输入已绑定手机号", - hintStyle: TextStyle( - color: Colors.grey.shade300, - fontSize: 14.0, - ), - border: InputBorder.none, - ), - style: TextStyle( - color: Colors.white, - fontSize: 14.0, - height: 1.0, - ), - ), - ), - ) - ], - ), - ), - Container( - margin: EdgeInsets.fromLTRB(16.0, 20.0, 16.0, 0.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4.0), - color: Color(0xff282733), - ), - height: 40.0, - child: Row( - children: [ - Container( - alignment: Alignment.centerLeft, - padding: EdgeInsets.only(left: 10.0.sp, right: 10.sp), - child: Image( - image: AssetImage(getMineImage("im_lock")), - width: 24.sp, - height: 24.sp, - ), - ), - Expanded( - child: Container( - height: 32.sp, - alignment: Alignment.center, - child: TextField( - textAlignVertical: TextAlignVertical.center, - decoration: InputDecoration( - hintText: "请输入密码", - hintStyle: TextStyle( - color: Colors.grey.shade300, - fontSize: 14.0, - ), - border: InputBorder.none, - ), - style: TextStyle( - color: Colors.white, - fontSize: 14.0, - height: 1.0, - ), - ), - ), - ) - ], - ), - ), - Container( - margin: - EdgeInsets.fromLTRB(16.0.sp, 20.0.sp, 16.0.sp, 0.0.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4.0.sp), - color: Color(0xff282733), - ), - height: 40.0.sp, - child: Row( - children: [ - Padding( - padding: EdgeInsets.only(left: 16.0.sp,right: 10.sp), - child: Center( + appBar: MyAppBar( + centerTitle: '换绑手机号', + ), + body: Scaffold( + backgroundColor: Colors.transparent, + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.only( + left: 16.0.sp, + top: 16.0.sp, + right: 16.0.sp, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0.sp), + color: Color(0xff282733), + ), + height: 40.0.sp, + child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.only( + left: 16.0.sp, right: 10.sp), child: Text( "+86", style: TextStyle( color: Colors.white, fontSize: 14.0.sp, ), - ), - )), - Expanded( - child: Container( - height: 32.sp, - alignment: Alignment.center, - child: TextField( - textAlignVertical: TextAlignVertical.center, - decoration: InputDecoration( - hintText: "请输入新手机号", - hintStyle: TextStyle( - color: Colors.grey.shade300, - fontSize: 14.0, + )), + Expanded( + child: Container( + height: 32.sp, + alignment: Alignment.center, + child: TextField( + controller: _photoController, + textAlignVertical: TextAlignVertical.center, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + FilteringTextInputFormatter.deny(RegExp('[^0-9]')), + ], + keyboardType: TextInputType.phone, + decoration: InputDecoration( + hintText: "请输入已绑定手机号", + hintStyle: TextStyle( + color: Colors.grey.shade300, + fontSize: 14.0, + ), + border: InputBorder.none, + ), + style: TextStyle( + color: Colors.white, + fontSize: 14.0, + height: 1.0, ), - border: InputBorder.none, - ), - style: TextStyle( - color: Colors.white, - fontSize: 14.0, - height: 1.0, ), ), - ), - ) - ], + ) + ], + ), ), - ), - Row( - children: [ - Expanded( - flex: 4, - child: Container( - margin: EdgeInsets.fromLTRB( - 16.0.sp, 20.0.sp, 8.0.sp, 0.0.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4.0.sp), - color: Color(0xff282733), + Container( + margin: EdgeInsets.fromLTRB(16.0, 20.0, 16.0, 0.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0), + color: Color(0xff282733), + ), + height: 40.0, + child: Row( + children: [ + Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.only(left: 10.0.sp, right: 10.sp), + child: Image( + image: AssetImage(getMineImage("im_lock")), + width: 24.sp, + height: 24.sp, + ), ), - height: 40.0.sp, - child: Row( - children: [ - Container( - alignment: Alignment.centerLeft, - padding: EdgeInsets.only(left: 10.0.sp, right: 10.sp), - child: Image( - image: AssetImage(getMineImage("im_shield")), - width: 24.sp, - height: 24.sp, + Expanded( + child: Container( + height: 32.sp, + alignment: Alignment.center, + child: TextField( + controller: _passwordController, + textAlignVertical: TextAlignVertical.center, + obscureText: true, // 设置为true以隐藏用户输入的内容 + + decoration: InputDecoration( + hintText: "请输入密码", + hintStyle: TextStyle( + color: Colors.grey.shade300, + fontSize: 14.0, + ), + border: InputBorder.none, + ), + style: TextStyle( + color: Colors.white, + fontSize: 14.0, + height: 1.0, ), ), - Expanded( - child: Container( - height: 32.sp, - alignment: Alignment.center, - child: TextField( - textAlignVertical: TextAlignVertical.center, - decoration: InputDecoration( - hintText: "请输入验证码", - hintStyle: TextStyle( - color: Colors.grey.shade300, - fontSize: 14.0, - ), - border: InputBorder.none, - ), - style: TextStyle( - color: Colors.white, - fontSize: 14.0, - height: 1.0, - ), + ), + ) + ], + ), + ), + Container( + margin: + EdgeInsets.fromLTRB(16.0.sp, 20.0.sp, 16.0.sp, 0.0.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0.sp), + color: Color(0xff282733), + ), + height: 40.0.sp, + child: Row( + children: [ + Padding( + padding: EdgeInsets.only( + left: 16.0.sp, right: 10.sp), + child: Center( + child: Text( + "+86", + style: TextStyle( + color: Colors.white, + fontSize: 14.0.sp, ), ), - ) - ], + )), + Expanded( + child: Container( + height: 32.sp, + alignment: Alignment.center, + child: TextField( + controller: _newPhotoController, + textAlignVertical: TextAlignVertical.center, + keyboardType: TextInputType.phone, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + FilteringTextInputFormatter.deny(RegExp('[^0-9]')), + ], + decoration: InputDecoration( + hintText: "请输入新手机号", + hintStyle: TextStyle( + color: Colors.grey.shade300, + fontSize: 14.0, + ), + border: InputBorder.none, + ), + style: TextStyle( + color: Colors.white, + fontSize: 14.0, + height: 1.0, + ), + ), + ), + ) + ], + ), + ), + Row( + children: [ + Expanded( + flex: 4, + child: Container( + margin: EdgeInsets.fromLTRB( + 16.0.sp, 20.0.sp, 8.0.sp, 0.0.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0.sp), + color: Color(0xff282733), + ), + height: 40.0.sp, + child: Row( + children: [ + Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.only( + left: 10.0.sp, right: 10.sp), + child: Image( + image: AssetImage(getMineImage("im_shield")), + width: 24.sp, + height: 24.sp, + ), + ), + Expanded( + child: Container( + height: 32.sp, + alignment: Alignment.center, + child: TextField( + controller: _codeController, + textAlignVertical: TextAlignVertical.center, + decoration: InputDecoration( + hintText: "请输入验证码", + hintStyle: TextStyle( + color: Colors.grey.shade300, + fontSize: 14.0, + ), + border: InputBorder.none, + ), + style: TextStyle( + color: Colors.white, + fontSize: 14.0, + height: 1.0, + ), + ), + ), + ) + ], + ), ), ), - ), - Expanded( - flex: 2, - child: Container( - margin: EdgeInsets.fromLTRB( - 8.0.sp, 20.0.sp, 16.0.sp, 0.0.sp), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4.0.sp), - color: Color(0xff282733), - ), - height: 40.0.sp, - child: Center( - child: Text( - "获取验证码", - style: TextStyle( - color: Colors.grey.shade400, - fontSize: 14.0.sp, + Expanded( + flex: 2, + child: GestureDetector( + onTap: () { + if (!_isCountingDown) { + // Only start countdown if not already counting down + startCountdown(); + } + }, + child: Container( + margin: EdgeInsets.fromLTRB( + 8.0.sp, 20.0.sp, 16.0.sp, 0.0.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4.0.sp), + color: Color(0xff282733), + ), + height: 40.0.sp, + child: Center( + child: Text( + _isCountingDown + ? '$_countdownSeconds 秒' + : '获取验证码', + style: TextStyle( + color: _isCountingDown + ? Colors.grey.shade400 + : Colors.white, + fontSize: 14.0.sp, + ), + ), ), ), ), ), - ), - ], - ), - Padding( - padding: - EdgeInsets.fromLTRB(20.0.sp, 20.0.sp, 20.0.sp, 0.0.sp), - child: Text( - "温馨提示:换绑成功后,将退出软件使用新手机号重新登录,旧手机号无法登录此账号,但可以重新注册。", - style: TextStyle( - color: Colors.grey.shade400, - fontSize: 12.0.sp, + ], + ), + Padding( + padding: + EdgeInsets.fromLTRB(20.0.sp, 20.0.sp, 20.0.sp, 0.0.sp), + child: Text( + "温馨提示:换绑成功后,将退出软件使用新手机号重新登录,旧手机号无法登录此账号,但可以重新注册。", + style: TextStyle( + color: Colors.grey.shade400, + fontSize: 12.0.sp, + ), ), ), - ), - GestureDetector( - onTap: () { - // Perform action on button press - }, - child: Container( - margin: - EdgeInsets.fromLTRB(72.0.sp, 40.0.sp, 72.0.sp, 0.0.sp), - height: 42.0.sp, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(21.0.sp), - color: Colors.blue, - ), - child: Center( - child: Text( - "确定", - style: TextStyle( - color: Colors.white, - fontSize: 16.0.sp, + GestureDetector( + onTap: () { + String photo = _photoController.text; + String password = _passwordController.text; + String newphoto = _newPhotoController.text; + String code = _codeController.text; + if(photo==""||photo.length<11){ + showToast("已绑定的手机号输入有误"); + return ; + } + if(password==""){ + showToast("请输入密码"); + return ; + } + if(newphoto==""||newphoto.length<11){ + showToast("新手机号输入有误"); + return ; + } + if(code==""){ + showToast("请输入验证码"); + return ; + } + + // Perform action on button press + }, + child: Container( + margin: + EdgeInsets.fromLTRB(72.0.sp, 40.0.sp, 72.0.sp, 0.0.sp), + height: 42.0.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21.0.sp), + color: Colors.blue, + ), + child: Center( + child: Text( + "确定", + style: TextStyle( + color: Colors.white, + fontSize: 16.0.sp, + ), ), ), ), ), - ), - ], + ], + ), ), ), ), - ), - ); + ); + }); } + } + diff --git a/circle_app/lib/app/report/binding.dart b/circle_app/lib/app/report/binding.dart new file mode 100644 index 0000000..9d00222 --- /dev/null +++ b/circle_app/lib/app/report/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class ReportBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => ReportLogic()); + } +} diff --git a/circle_app/lib/app/report/logic.dart b/circle_app/lib/app/report/logic.dart new file mode 100644 index 0000000..822cdfd --- /dev/null +++ b/circle_app/lib/app/report/logic.dart @@ -0,0 +1,44 @@ +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; + +import 'state.dart'; + +class ReportLogic extends GetxController { + final ReportState state = ReportState(); + List arrList = [ + MyObject("涉嫌欺诈", false), + MyObject("色情低俗", false), + MyObject("侮辱谩骂", false), + MyObject("骚扰广告", false), + MyObject("扰乱平台", false), + MyObject("散布谣言", false), + MyObject("盗图侵权", false), + MyObject("其他违规", false) + ]; + + List getItemList() { + return arrList; + } + final ImagePicker _picker = ImagePicker(); + Future getImageFile() async { + try { + final XFile? pickedFile = await _picker.pickImage( + source: ImageSource.gallery, + ); + // setState(() { + // _setImageFileListFromFile(pickedFile); + // }); + } catch (e) { + // setState(() { + // _pickImageError = e; + // }); + } + } +} + +class MyObject { + String name; + bool isSelect; + + MyObject(this.name, this.isSelect); +} diff --git a/circle_app/lib/app/report/state.dart b/circle_app/lib/app/report/state.dart new file mode 100644 index 0000000..c5ce25d --- /dev/null +++ b/circle_app/lib/app/report/state.dart @@ -0,0 +1,13 @@ +import 'logic.dart'; + +class ReportState { + + ReportState() { + + ///Initialize variables + /// + } + + + +} \ No newline at end of file diff --git a/circle_app/lib/app/report/view.dart b/circle_app/lib/app/report/view.dart new file mode 100644 index 0000000..451fa42 --- /dev/null +++ b/circle_app/lib/app/report/view.dart @@ -0,0 +1,234 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../components/my_app_bar.dart'; +import '../../util/util.dart'; +import 'logic.dart'; + +class ReportPage extends StatelessWidget { + ReportPage({Key? key}) : super(key: key); + + final logic = Get.find(); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (ReportLogic controller) { + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: MyAppBar( + centerTitle: '举报', + actionWdiget: Text( + "提交", + style: TextStyle(color: Colors.white), + ), + onPressed: () { + showToast("提交"); + }, + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(left: 16, top: 16), + child: Text( + '举报类目', + style: TextStyle( + color: Colors.white, + fontSize: 16, + ), + ), + ), + Container( + height: 120.sp, + child: _reportAdapter(controller), + ), + Expanded( + child: Padding( + padding: EdgeInsets.fromLTRB(16, 20, 16, 0), + child: ListView( + children: [ + Text( + '详细截图(请至少上传一张图片,帮助审核处理)', + style: TextStyle( + color: Colors.white70, + fontSize: 16, + ), + ), + SizedBox(height: 20), + // 添加 RecyclerView(ListView) 的内容 + // 例如: MyRecyclerViewWidget(), + Container( + height: 130.sp, + child: _imageAdapter(controller)), + Text( + '补充说明', + style: TextStyle( + color: Colors.white, + fontSize: 14, + ), + ), + SizedBox(height: 30), + Container( + margin: EdgeInsets.only(left: 16, right: 16), + height: 200, + decoration: BoxDecoration( + color: Color(0xFF4C3E5F), + borderRadius: BorderRadius.circular(10), + ), + padding: EdgeInsets.all(16.sp), + child: Stack( + children: [ + TextField( + decoration: InputDecoration.collapsed( + hintText: '违规补充说明,帮助审核处理,选填', + hintStyle: TextStyle( + color: Color(0xFFB7BECC), + fontSize: 12, + ), + ), + maxLines: null, + maxLength: 200, + style: TextStyle( + color: Color(0xFF000000), + fontSize: 12, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + }); + } + + Widget _reportAdapter(ReportLogic controller) { + return GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + // crossAxisSpacing: 6.sp, + childAspectRatio: 3, + ), + itemCount: controller.getItemList().length, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return GestureDetector( + onTap: () { + controller.arrList[index].isSelect = + !controller.arrList[index].isSelect; + controller.update(); + }, + child: _getItemSelect(controller.arrList[index]), + ); + }, + ); + } + + Widget _imageAdapter(ReportLogic controller) { + return GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, // 每行显示的项目数量 + ), + itemCount: 20, // 项目的总数量,包括固定图片和接口获取的项目 + itemBuilder: (BuildContext context, int index) { + if (index == 0) { + // 第一个项目,显示固定的图片 + return GestureDetector( + onTap: () { + controller.getImageFile(); + }, + child: Container( + margin: EdgeInsets.all(5.sp), + child: Image( + image: AssetImage(getMineImage("icon_img_add")), + ), + ), + ); + } else { + // 后续项目,根据接口获取数据 + // 假设通过接口获取到的数据存储在一个名为 data 的列表中 + // var itemData = data[index - 1]; // 减去第一个固定图片的索引 + return Container( + margin: EdgeInsets.all(5.sp), + child: Center( + // child: _buildImageItem( + // 'https://book.flutterchina.club/assets/img/logo.png'), + ), + ); + } + }, + ); + } + + Widget _getItemSelect(MyObject bean) { + if (bean.isSelect) { + return Container( + margin: + EdgeInsets.only(left: 8.sp, right: 8.sp, top: 6.sp, bottom: 6.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20.sp), + gradient: LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: + EdgeInsets.only(top: 2.sp, bottom: 2.sp, left: 15.sp, right: 15.sp), + child: Center( + child: Text( + bean.name, + style: TextStyle( + color: Colors.white, + fontSize: 11.sp, + ), + ), + ), + ); + } else { + return Container( + margin: + EdgeInsets.only(left: 8.sp, right: 8.sp, top: 6.sp, bottom: 6.sp), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20.0), // 设置圆角半径 + border: Border.all( + color: Color(0xFF392D53), + ), + color: Color(0xFF392D53), + ), + child: Padding( + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 15.sp, right: 15.sp), + child: Center( + child: Text( + bean.name, + style: TextStyle( + fontSize: 11.0, + color: Colors.white, + ), + ), + ), + ), + ), + ); + } + } +} diff --git a/circle_app/lib/app/swiper/binding.dart b/circle_app/lib/app/swiper/binding.dart new file mode 100644 index 0000000..f6d8380 --- /dev/null +++ b/circle_app/lib/app/swiper/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class SwiperBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => SwiperLogic()); + } +} diff --git a/circle_app/lib/app/swiper/logic.dart b/circle_app/lib/app/swiper/logic.dart new file mode 100644 index 0000000..ff2fe7c --- /dev/null +++ b/circle_app/lib/app/swiper/logic.dart @@ -0,0 +1,8 @@ +import 'package:get/get.dart'; + +import 'state.dart'; + +class SwiperLogic extends GetxController { + final SwiperState state = SwiperState(); + List imgList = Get.arguments ; +} diff --git a/circle_app/lib/app/swiper/state.dart b/circle_app/lib/app/swiper/state.dart new file mode 100644 index 0000000..92ac8a3 --- /dev/null +++ b/circle_app/lib/app/swiper/state.dart @@ -0,0 +1,5 @@ +class SwiperState { + SwiperState() { + ///Initialize variables + } +} diff --git a/circle_app/lib/app/swiper/view.dart b/circle_app/lib/app/swiper/view.dart new file mode 100644 index 0000000..d786c80 --- /dev/null +++ b/circle_app/lib/app/swiper/view.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:get/get_state_manager/src/simple/get_state.dart'; + +import 'logic.dart'; + +class SwiperPage extends StatefulWidget { + const SwiperPage({Key? key}) : super(key: key); + + @override + State createState() => _SwiperPageState(); +} + +class _SwiperPageState extends State { + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (logic) { + return Scaffold( + appBar: null, + backgroundColor: Colors.black87, + body: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: (() { + //点击任意地方都能关闭页面,并且不影响你的滑动查看 + Navigator.pop(context); + }), + child: Swiper( + itemBuilder: (BuildContext context, int index) { + return Container( + width: double.infinity, + child: Image.network( + logic.imgList[index]['url'], fit: BoxFit.contain,) + ); + }, + itemCount: logic.imgList.length, + pagination: SwiperPagination(), //下面的分页小点 +// control: new SwiperControl(), //左右的那个箭头,在某模拟器中会出现蓝线 + ), + ), + ); + }); + } +} \ No newline at end of file diff --git a/circle_app/lib/app/text/binding.dart b/circle_app/lib/app/text/binding.dart new file mode 100644 index 0000000..85c4802 --- /dev/null +++ b/circle_app/lib/app/text/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class TextBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => TextLogic()); + } +} diff --git a/circle_app/lib/app/text/logic.dart b/circle_app/lib/app/text/logic.dart new file mode 100644 index 0000000..dfcb921 --- /dev/null +++ b/circle_app/lib/app/text/logic.dart @@ -0,0 +1,7 @@ +import 'package:get/get.dart'; + +import 'state.dart'; + +class TextLogic extends GetxController { + final TextState state = TextState(); +} diff --git a/circle_app/lib/app/text/state.dart b/circle_app/lib/app/text/state.dart new file mode 100644 index 0000000..4f50ea6 --- /dev/null +++ b/circle_app/lib/app/text/state.dart @@ -0,0 +1,5 @@ +class TextState { + TextState() { + ///Initialize variables + } +} diff --git a/circle_app/lib/app/text/view.dart b/circle_app/lib/app/text/view.dart new file mode 100644 index 0000000..9c331e3 --- /dev/null +++ b/circle_app/lib/app/text/view.dart @@ -0,0 +1,998 @@ +import 'package:circle_app/app/text/logic.dart'; +import 'package:circle_app/util/util.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:get/get_state_manager/src/simple/get_state.dart'; + +import '../../components/my_app_bar.dart'; + +class TextPage extends StatefulWidget { + @override + State createState() => _MyTabbedScreenState(); +} +class _MyTabbedScreenState extends State + with SingleTickerProviderStateMixin { + late TabController _tabController; + + ScrollController scrollController = ScrollController(); + bool isShowBlackTitle = false; + + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 2, vsync: this); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + void _onScroll(offset) { + if (offset > 100) { + setState(() { + isShowBlackTitle = true; + }); + } else { + setState(() { + isShowBlackTitle = false; + }); + } + } + + + + + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (TextLogic controller) { + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("home_back")), + fit: BoxFit.cover, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: MyAppBar( + centerTitle: '个人主页', + ), + body:Container( + margin: EdgeInsets.all(10.sp), + child: Stack(children: [ + + NotificationListener( + onNotification: (scrollNotification) { + if (scrollNotification is ScrollUpdateNotification && + scrollNotification.depth == 0) { + //滚动并且是列表滚动的时候 + _onScroll(scrollNotification.metrics.pixels); + } + return true; + }, + child: Stack( + children: [ + NestedScrollView( + headerSliverBuilder: + (BuildContext context, bool innerBoxIsScrolled) { + return [ + SliverOverlapAbsorber( + handle: NestedScrollView + .sliverOverlapAbsorberHandleFor(context), + sliver: SliverAppBar( + leading: new Container( + child: Container(), + ), + title: isShowBlackTitle ? Text('') : Text(''), + centerTitle: false, + pinned: false, + floating: false, + snap: false, + primary: false, + expandedHeight: 165.0.sp, + backgroundColor: Colors.transparent, + elevation: 0, + //是否显示阴影,直接取值innerBoxIsScrolled,展开不显示阴影,合并后会显示 + forceElevated: innerBoxIsScrolled, + actions: [ + new Container( + margin: EdgeInsets.only( + right: 10, top: 20, bottom: 10), + child: Container(), + ), + new Container( + margin: EdgeInsets.only( + right: 10, top: 20, bottom: 10), + child: Container(), + ), + ], + + flexibleSpace: FlexibleSpaceBar( + collapseMode: CollapseMode.pin, + background: new Column( + children: [ + new Container( + height: 165.sp, + child: new Column( + children: [ + Row( + children: [ + _imagelistView(controller), + Flexible( + child: buildUserContainer(), + ), + ], + ), + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Row( + children: [ + Text( + "name", + style: TextStyle( + color: Color.fromRGBO( + 247, 250, 250, 1.0), + fontSize: 16, + ), + ), + SizedBox(width: 10.sp), + _buildInfoRow(), + ], + ), + Row( + children: [ + Container( + margin: EdgeInsets.only( + right: 5.sp), + width: 10.sp, + height: 10.sp, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: + Color(0xFF00FFF4), + ), + ), + Text( + "在线·深圳", + style: TextStyle( + color: Color( + 0xFF00FFF4)), + ) + ], + ), + ], + ), + Container( + // margin: EdgeInsets.only(top: 18.sp, bottom: 18.sp), + height: 59.sp, + child: ListView.builder( + itemCount: 8, + // 替换为实际的 item 数量 + scrollDirection: + Axis.horizontal, + // 设置为水平方向 + padding: EdgeInsets.symmetric( + vertical: 18.sp), + // 替换为实际的边距值 + itemBuilder: (context, index) { + return Container( + margin: EdgeInsets.only( + right: 11.sp), + // 替换为实际的 item 间距 + child: Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius + .circular(17.0), + // 设置圆角半径 + gradient: + LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + ), + color: + Color(0xFF392D53), + ), + child: Container( + margin: EdgeInsets.all( + 0.2.sp), + decoration: + BoxDecoration( + borderRadius: + BorderRadius + .circular( + 17.0), + // shape: BoxShape.circle, + color: + Color(0xFF392D53), + ), + child: Padding( + padding: + EdgeInsets.only( + top: 2.sp, + bottom: 2.sp, + left: 15.sp, + right: 15.sp), + child: Center( + child: Text( + "圆角背景边框", + style: TextStyle( + fontSize: 11.0, + color: Colors + .white, + ), + ), + ), + ), + ), + ), // 替换为实际的列表项小部件 + ); + }, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + SliverPersistentHeader( + delegate: _SliverAppBarDelegate2(titleTab()), + pinned: true, + ), + ]; + }, + body: Container( + margin: EdgeInsets.all(0), + child: TabBarView( + controller: _tabController, + children: [ + _imageAdapter(controller), + _imageAdapter(controller), + ], + ), + ), + ), + ], + )), + Positioned( + bottom: 27.sp, + width:100, + child: _MeInfoButton(controller), + ) + ]),), + )); + }); + } + Widget _MeInfoButton(TextLogic controller) { + if ("" == "") { + return GestureDetector( + onTap: () { + // showToast("完善资料"); + // Get.toNamed(AppRoutes.TextActivity); + // Get.toNamed(AppRoutes.Complete_materialPage, arguments: "user"); + }, + 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, + ), + ), + ), + ), + ); + } else { + return Container( + margin: EdgeInsets.only(left: 18.sp, right: 18.sp), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + showToast("鼓掌"); + _showBottomSheet(context); + }, + child: Image( + image: AssetImage(getMineImage("icon_like")), + width: 40.sp, + height: 40.sp, + ), + ), + GestureDetector( + onTap: () { + showToast("喜欢"); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.sp), + gradient: 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: Text( + "喜欢", + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + ), + ), + ), + ), + GestureDetector( + onTap: () { + showToast("私聊"); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.sp), + gradient: 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: Text( + "私聊", + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + ), + ), + ), + ) + ], + ), + ); + } + } + + Widget buildContent(TextLogic controller) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 19.sp, vertical: 14.sp), + child: Column( + children: [ + Row( + children: [ + _imagelistView(controller), + Flexible( + child: buildUserContainer(), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Text( + "name", + style: TextStyle( + color: Color.fromRGBO(247, 250, 250, 1.0), + fontSize: 16, + ), + ), + SizedBox(width: 10.sp), + _buildInfoRow(), + ], + ), + Row( + children: [ + Container( + margin: EdgeInsets.only(right: 5.sp), + width: 10.sp, + height: 10.sp, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Color(0xFF00FFF4), + ), + ), + Text( + "在线·深圳", + style: TextStyle(color: Color(0xFF00FFF4)), + ) + ], + ), + ], + ), + Container( + // margin: EdgeInsets.only(top: 18.sp, bottom: 18.sp), + height: 59.sp, + child: ListView.builder( + itemCount: 8, + // 替换为实际的 item 数量 + scrollDirection: Axis.horizontal, + // 设置为水平方向 + padding: EdgeInsets.symmetric(vertical: 18.sp), + // 替换为实际的边距值 + itemBuilder: (context, index) { + return Container( + margin: EdgeInsets.only(right: 11.sp), // 替换为实际的 item 间距 + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.0), // 设置圆角半径 + gradient: LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + ), + color: Color(0xFF392D53), + ), + child: Container( + margin: EdgeInsets.all(0.2.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.0), + // shape: BoxShape.circle, + color: Color(0xFF392D53), + ), + child: Padding( + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 15.sp, right: 15.sp), + child: Center( + child: Text( + "圆角背景边框", + style: TextStyle( + fontSize: 11.0, + color: Colors.white, + ), + ), + ), + ), + ), + ), // 替换为实际的列表项小部件 + ); + }, + ), + ), + titleTab(), + Container( + margin: EdgeInsets.only(top: 18.sp, bottom: 14.sp), + child: Text( + "1314位圈友感兴趣,其中10位已催您更新", + style: TextStyle(color: Colors.white30), + )), + Expanded( + child: Container( + // color: Colors.blue, + child: TabBarView( + controller: _tabController, + children: [ + _imageAdapter(controller), + Text("喊话"), + ], + ), + )) + ], + ), + ); + } + + + // Widget titleTab1() { + // return SliverAppBar( + // backgroundColor: Colors.transparent, + // pinned: true, + // floating: true, + // expandedHeight: 100.sp, + // flexibleSpace: FlexibleSpaceBar( + // background: Container( + // padding: EdgeInsets.symmetric(horizontal: 16.sp), + // alignment: Alignment.bottomLeft, + // child: Text( + // '标题', + // style: TextStyle( + // color: Colors.white, + // fontSize: 24.sp, + // fontWeight: FontWeight.bold, + // ), + // ), + // ), + // ), + // ); + // } + + Column titleTab(){ + return Column( + children: [ + Container( + alignment: Alignment.centerLeft, + height: 27.sp, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TabBar( + isScrollable: true, + controller: _tabController, + indicatorColor: Color(0xFF00FFF4), + indicatorWeight: 2.sp, + labelColor: Color(0xFF00FFF4), + unselectedLabelColor: Color(0xB3FFFFFF), + indicatorSize: TabBarIndicatorSize.label, + tabs: [ + Tab( + text: "形象照", + ), + Tab(text: "喊话") + ], + ), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 12.sp, right: 12.sp), + child: Text( + "完成", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ], + )), + ], + ); + } + + Widget _imageAdapter(TextLogic controller) { + return GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, // 每行显示的项目数量 + ), + itemCount: 20, // 项目的总数量,包括固定图片和接口获取的项目 + itemBuilder: (BuildContext context, int index) { + if (index == 0) { + // 第一个项目,显示固定的图片 + return GestureDetector( + onTap: () { + // controller.getImageFile(); + }, + child: Container( + margin: EdgeInsets.all(5.sp), + child: Image( + image: AssetImage(getMineImage("icon_img_add")), + ), + ), + ); + } else { + // 后续项目,根据接口获取数据 + // 假设通过接口获取到的数据存储在一个名为 data 的列表中 + // var itemData = data[index - 1]; // 减去第一个固定图片的索引 + return Container( + margin: EdgeInsets.all(5.sp), + child: Center( + child: _buildImageItem( + 'https://book.flutterchina.club/assets/img/logo.png', + controller)), + ); + } + }, + ); + } + + Widget _buildInfoRow() { + 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( + "男,33,CD", + style: TextStyle( + color: Colors.black, + fontSize: 10, + ), + ), + ), + SizedBox(width: 6.sp), + Image( + image: AssetImage(getBaseImage("vip")), + width: 44.sp, + height: 18.sp, + ), + ], + ); + } + + Widget buildUserContainer() { + return Container( + margin: EdgeInsets.symmetric(horizontal: 1.sp, vertical: 14.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( + '动物是灵性的动物是灵性的动物是灵性的动物是灵性的动物是灵性的动物是灵性的动物是灵性的,不同于植物。 你若孤独, 它陪伴你。在阳光的午后,蜷缩在你的...', + maxLines: 2, + style: TextStyle(color: Colors.white), + overflow: TextOverflow.ellipsis, + ), + ), + ), + ); + } + + Widget _imagelistView(TextLogic controller) { + return Stack( + alignment: Alignment.center, + children: [ + Container( + width: 68.sp, + height: 68.sp, + decoration: 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(TextLogic controller) { + return ClipOval( + child: GestureDetector( + onTap: () {}, + child: Image.network( + 'https://book.flutterchina.club/assets/img/logo.png', + width: 66.sp, + height: 66.sp, + ), + ), + ); + } + + Widget _buildImageItem(String url, TextLogic controller) { + return Stack( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(0.0), + child: GestureDetector( + onTap: () { + showToast("点击了图片"); + }, + child: Image.network( + url, + ), + ), + ), + if ("" == "") + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () { + showToast("删除"); + }, + child: Image( + image: AssetImage(getMineImage("icon_img_del")), + width: 20.sp, + height: 20.sp, + ), + )) + ], + ); + } + + void _showBottomSheet(BuildContext context) { + showModalBottomSheet( + context: context, + backgroundColor: Colors.transparent, + builder: (BuildContext context) { + return Container( + decoration: 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: Container( + alignment: Alignment.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + // Get.toNamed(AppRoutes.ReportActivity); + }, + 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: Text( + "举报", + style: TextStyle(color: Colors.white), + ), + ) + ], + ), + ), + SizedBox(width: 75.sp), + GestureDetector( + onTap: () { + Navigator.pop(context); + _showReportDialog(context); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage(getMineImage("icon_block")), + width: 40.sp, + height: 40.sp, + ), + Container( + margin: EdgeInsets.only(top: 2.sp), + child: Text( + "拉黑", + style: TextStyle(color: Colors.white), + ), + ) + ], + ), + ), + ], + ), + )); + }, + ); + } + + void _showReportDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 277.sp, + padding: EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: 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: 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: 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: 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: Text( + "否", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ), + SizedBox(width: 24.sp), + GestureDetector( + onTap: () {}, + child: Container( + margin: EdgeInsets.only(top: 24.sp), + 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: 52.sp, + right: 52.sp), + child: Text( + "是", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ) + ], + ) + ], + ), + ) + ], + ), + ), + ); + }, + ); + } +} +class _SliverAppBarDelegate2 extends SliverPersistentHeaderDelegate { + _SliverAppBarDelegate2(this._tabBar); + + final Column _tabBar; + + @override + Widget build( + BuildContext context, double shrinkOffset, bool overlapsContent) { + return _tabBar; + } + + @override + double get maxExtent => 52; + + @override + double get minExtent => 52; + + @override + bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) { + return true; + } +} + diff --git a/circle_app/lib/app/userinfo/logic.dart b/circle_app/lib/app/userinfo/logic.dart index 18bf7e3..6a92fb7 100644 --- a/circle_app/lib/app/userinfo/logic.dart +++ b/circle_app/lib/app/userinfo/logic.dart @@ -4,6 +4,7 @@ import 'package:image_picker/image_picker.dart'; import 'state.dart'; class UserinfoLogic extends GetxController { + var userId = Get.arguments ?? ""; final UserinfoState state = UserinfoState(); final ImagePicker _picker = ImagePicker(); Future getImageFile() async { diff --git a/circle_app/lib/app/userinfo/view.dart b/circle_app/lib/app/userinfo/view.dart index 0a8ed3b..f8dbe5d 100644 --- a/circle_app/lib/app/userinfo/view.dart +++ b/circle_app/lib/app/userinfo/view.dart @@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../components/my_app_bar.dart'; +import '../../router/app_routers.dart'; import '../../util/util.dart'; import 'logic.dart'; @@ -15,11 +16,12 @@ class _MyTabbedScreenState extends State with SingleTickerProviderStateMixin { late TabController _tabController; - get data => null; + ScrollController scrollController = ScrollController(); + bool isShowBlackTitle = false; + @override void initState() { - // TODO: implement initState super.initState(); _tabController = TabController(length: 2, vsync: this); } @@ -29,13 +31,27 @@ class _MyTabbedScreenState extends State _tabController.dispose(); super.dispose(); } + void _onScroll(offset) { + if (offset > 100) { + setState(() { + isShowBlackTitle = true; + }); + } else { + setState(() { + isShowBlackTitle = false; + }); + } + } + + + + final logic = Get.find(); final state = Get.find().state; @override Widget build(BuildContext context) { - var userId = Get.arguments ?? ""; return GetBuilder(builder: (UserinfoLogic controller) { return Container( decoration: BoxDecoration( @@ -57,7 +73,7 @@ class _MyTabbedScreenState extends State Positioned( bottom: 27.sp, width: Get.width, - child: _MeInfoButton(userId), + child: _MeInfoButton(controller), ) ], ), @@ -65,11 +81,12 @@ class _MyTabbedScreenState extends State }); } - Widget _MeInfoButton(String userId) { - if (userId == "1") { + Widget _MeInfoButton(UserinfoLogic controller) { + if (controller.userId == "") { return GestureDetector( onTap: () { - showToast("完善资料"); + // showToast("完善资料"); + Get.toNamed(AppRoutes.Complete_materialPage, arguments: "user"); }, child: Center( child: Container( @@ -118,7 +135,6 @@ class _MyTabbedScreenState extends State showToast("喜欢"); }, child: Container( - // height: 40, decoration: BoxDecoration( borderRadius: BorderRadius.circular(17.sp), gradient: LinearGradient( @@ -181,7 +197,7 @@ class _MyTabbedScreenState extends State children: [ Row( children: [ - _headView(), + _imagelistView(controller), Flexible( child: buildUserContainer(), ), @@ -223,87 +239,56 @@ class _MyTabbedScreenState extends State ], ), Container( - // margin: EdgeInsets.only(top: 18.sp, bottom: 18.sp), - height: 59.sp, + // margin: EdgeInsets.only(top: 18.sp, bottom: 18.sp), + height: 59.sp, child: ListView.builder( itemCount: 8, // 替换为实际的 item 数量 scrollDirection: Axis.horizontal, // 设置为水平方向 - padding: EdgeInsets.symmetric( vertical: 18.sp), + padding: EdgeInsets.symmetric(vertical: 18.sp), // 替换为实际的边距值 itemBuilder: (context, index) { return Container( margin: EdgeInsets.only(right: 11.sp), // 替换为实际的 item 间距 child: Container( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), // 设置圆角半径 - border: Border.all( - color: Color(0xFF392D53), // 边框颜色 - width: 1.0, // 边框宽度 - ), - color: Color(0xFF392D53), - ), - child: Padding( - padding: EdgeInsets.only(top: 2.sp,bottom: 2.sp,left: 15.sp,right: 15.sp), - child: Center( - child: Text( - "圆角背景边框", - style: TextStyle( - fontSize: 11.0, - color: Colors.white, - ), - ),),), - ),// 替换为实际的列表项小部件 - ); - }, - ), - ), - Container( - alignment: Alignment.centerLeft, - height: 27.sp, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - TabBar( - isScrollable: true, - controller: _tabController, - indicatorColor: Color(0xFF00FFF4), - indicatorWeight: 2.sp, - labelColor: Color(0xFF00FFF4), - unselectedLabelColor: Color(0xB3FFFFFF), - indicatorSize: TabBarIndicatorSize.label, - tabs: [ - Tab( - text: "形象照", - ), - Tab(text: "喊话") - ], - ), - Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(17), + borderRadius: BorderRadius.circular(17.0), // 设置圆角半径 gradient: LinearGradient( colors: [ Color(0xFF06F9FA), Color(0xFFDC5BFD), ], - begin: Alignment.centerLeft, - end: Alignment.centerRight, + ), + color: Color(0xFF392D53), + ), + child: Container( + margin: EdgeInsets.all(0.2.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.0), + // shape: BoxShape.circle, + color: Color(0xFF392D53), + ), + child: Padding( + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 15.sp, right: 15.sp), + child: Center( + child: Text( + "圆角背景边框", + style: TextStyle( + fontSize: 11.0, + color: Colors.white, + ), + ), + ), ), ), - padding: EdgeInsets.only( - top: 2.sp, bottom: 2.sp, left: 12.sp, right: 12.sp), - child: Text( - "完成", - style: TextStyle( - color: Colors.white, - fontSize: 12, - ), - ), - ), - ], - )), + ), // 替换为实际的列表项小部件 + ); + }, + ), + ), + titleTab(), Container( margin: EdgeInsets.only(top: 18.sp, bottom: 14.sp), child: Text( @@ -325,6 +310,53 @@ class _MyTabbedScreenState extends State ), ); } + Widget titleTab(){ + return Container( + alignment: Alignment.centerLeft, + height: 27.sp, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TabBar( + isScrollable: true, + controller: _tabController, + indicatorColor: Color(0xFF00FFF4), + indicatorWeight: 2.sp, + labelColor: Color(0xFF00FFF4), + unselectedLabelColor: Color(0xB3FFFFFF), + indicatorSize: TabBarIndicatorSize.label, + tabs: [ + Tab( + text: "形象照", + ), + Tab(text: "喊话") + ], + ), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 12.sp, right: 12.sp), + child: Text( + "完成", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ], + )); + } Widget _imageAdapter(UserinfoLogic controller) { return GridView.builder( @@ -353,9 +385,9 @@ class _MyTabbedScreenState extends State return Container( margin: EdgeInsets.all(5.sp), child: Center( - child: _buildImageItem( - 'https://book.flutterchina.club/assets/img/logo.png'), - ), + child: _buildImageItem( + 'https://book.flutterchina.club/assets/img/logo.png', + controller)), ); } }, @@ -377,7 +409,8 @@ class _MyTabbedScreenState extends State end: Alignment.centerRight, ), ), - padding: EdgeInsets.only(top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp), + padding: EdgeInsets.only( + top: 2.sp, bottom: 2.sp, left: 10.sp, right: 10.sp), child: Text( "男,33,CD", style: TextStyle( @@ -420,7 +453,7 @@ class _MyTabbedScreenState extends State ); } - Widget _headView() { + Widget _imagelistView(UserinfoLogic controller) { return Stack( alignment: Alignment.center, children: [ @@ -439,13 +472,13 @@ class _MyTabbedScreenState extends State SizedBox( width: 66.sp, height: 66.sp, - child: _buildAvatar1(), + child: _buildAvatar1(controller), ) ], ); } - Widget _buildAvatar1() { + Widget _buildAvatar1(UserinfoLogic controller) { return ClipOval( child: GestureDetector( onTap: () {}, @@ -458,7 +491,7 @@ class _MyTabbedScreenState extends State ); } - Widget _buildImageItem(String url) { + Widget _buildImageItem(String url, UserinfoLogic controller) { return Stack( children: [ ClipRRect( @@ -472,61 +505,246 @@ class _MyTabbedScreenState extends State ), ), ), - Positioned( - top: 0, - right: 0, - child: GestureDetector( - onTap: () { - showToast("删除"); - }, - child: Image( - image: AssetImage(getMineImage("icon_img_del")), - width: 20.sp, - height: 20.sp, - ), - )) + if (controller.userId == "") + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () { + showToast("删除"); + }, + child: Image( + image: AssetImage(getMineImage("icon_img_del")), + width: 20.sp, + height: 20.sp, + ), + )) ], ); } - - - void _showBottomSheet(BuildContext context) { showModalBottomSheet( context: context, backgroundColor: Colors.transparent, builder: (BuildContext context) { return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(16.0), - topRight: Radius.circular(16.0), + decoration: 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, + ), ), - gradient: LinearGradient( - colors: [ - Color(0xFF4A3E5D), - Color(0xFF344143), - ], - begin: Alignment.centerLeft, - end: Alignment.centerRight, - ), - ), - - height: 118.0, - width: double.infinity, - child: Text( - '顶部圆角容器', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 20.0, - color: Colors.white, - ), - ), - ); - + height: 118.0, + width: double.infinity, + child: Container( + alignment: Alignment.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + Get.toNamed(AppRoutes.ReportActivity); + }, + 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: Text( + "举报", + style: TextStyle(color: Colors.white), + ), + ) + ], + ), + ), + SizedBox(width: 75.sp), + GestureDetector( + onTap: () { + Navigator.pop(context); + _showReportDialog(context); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + image: AssetImage(getMineImage("icon_block")), + width: 40.sp, + height: 40.sp, + ), + Container( + margin: EdgeInsets.only(top: 2.sp), + child: Text( + "拉黑", + style: TextStyle(color: Colors.white), + ), + ) + ], + ), + ), + ], + ), + )); }, ); } + void _showReportDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: Container( + height: 277.sp, + padding: EdgeInsets.all(1.0), + child: Stack( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(10.0), + gradient: 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: 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: 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: 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: Text( + "否", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ), + SizedBox(width: 24.sp), + GestureDetector( + onTap: () {}, + child: Container( + margin: EdgeInsets.only(top: 24.sp), + 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: 52.sp, + right: 52.sp), + child: Text( + "是", + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ), + ) + ], + ) + ], + ), + ) + ], + ), + ), + ); + }, + ); + } } diff --git a/circle_app/lib/router/app_pages.dart b/circle_app/lib/router/app_pages.dart index 737f765..f101925 100644 --- a/circle_app/lib/router/app_pages.dart +++ b/circle_app/lib/router/app_pages.dart @@ -2,9 +2,13 @@ import 'package:circle_app/app/aboutapp/binding.dart'; import 'package:circle_app/app/aboutapp/view.dart'; import 'package:circle_app/app/account/binding.dart'; import 'package:circle_app/app/account/view.dart'; +import 'package:circle_app/app/bindmail/binding.dart'; +import 'package:circle_app/app/bindmail/view.dart'; import 'package:circle_app/app/blacklist/binding.dart'; import 'package:circle_app/app/call_out/binding.dart'; import 'package:circle_app/app/call_out/view.dart'; +import 'package:circle_app/app/feedback/binding.dart'; +import 'package:circle_app/app/feedback/view.dart'; import 'package:circle_app/app/friendslist/binding.dart'; import 'package:circle_app/app/friendslist/view.dart'; import 'package:circle_app/app/help/binding.dart'; @@ -14,12 +18,20 @@ import 'package:circle_app/app/home/view.dart'; import 'package:circle_app/app/login/login/view.dart'; import 'package:circle_app/app/minefragment/binding.dart'; import 'package:circle_app/app/minefragment/view.dart'; +import 'package:circle_app/app/offaccount/binding.dart'; +import 'package:circle_app/app/offaccount/view.dart'; import 'package:circle_app/app/photoinfo/binding.dart'; import 'package:circle_app/app/photoinfo/view.dart'; +import 'package:circle_app/app/report/binding.dart'; +import 'package:circle_app/app/report/view.dart'; import 'package:circle_app/app/setup/binding.dart'; import 'package:circle_app/app/setup/view.dart'; import 'package:circle_app/app/login/complete_material/binding.dart'; import 'package:circle_app/app/login/complete_material/view.dart'; +import 'package:circle_app/app/swiper/binding.dart'; +import 'package:circle_app/app/swiper/view.dart'; +import 'package:circle_app/app/text/binding.dart'; +import 'package:circle_app/app/text/view.dart'; import 'package:circle_app/app/userinfo/binding.dart'; import 'package:circle_app/app/userinfo/view.dart'; import 'package:get/get_navigation/src/routes/get_route.dart'; @@ -91,6 +103,36 @@ class AppPages { page: () => Call_outPage(), binding: Call_outBinding(), ), - GetPage(name: AppRoutes.Login, page: () => LoginPage()) + GetPage(name: AppRoutes.Login, page: () => LoginPage()), + GetPage( + name: AppRoutes.ReportActivity, + page: () => ReportPage(), + binding: ReportBinding(), + ), + GetPage( + name: AppRoutes.FeedbackActivity, + page: () => FeedbackPage(), + binding: FeedbackBinding(), + ), + GetPage( + name: AppRoutes.BindMailActivity, + page: () => BindmailPage(), + binding: BindmailBinding(), + ), + GetPage( + name: AppRoutes.TextActivity, + page: () => TextPage(), + binding: TextBinding(), + ), + GetPage( + name: AppRoutes.Swiper, + page: () => SwiperPage(), + binding: SwiperBinding(), + ), + GetPage( + name: AppRoutes.OffAccountActivity, + page: () => OffaccountPage(), + binding: OffaccountBinding(), + ), ]; } diff --git a/circle_app/lib/router/app_routers.dart b/circle_app/lib/router/app_routers.dart index 7a639ba..4380617 100644 --- a/circle_app/lib/router/app_routers.dart +++ b/circle_app/lib/router/app_routers.dart @@ -12,4 +12,10 @@ abstract class AppRoutes { static const HelpActivity = '/user/HelpActivity'; static const FriendsActivity = '/user/FriendsActivity'; static const UserInfoActivity = '/user/UserInfoActivity'; + static const ReportActivity = '/user/ReportActivity'; + static const FeedbackActivity = '/user/FeedbackActivity'; + static const BindMailActivity = '/user/BindMailActivity'; + static const TextActivity = '/user/TextActivity'; + static const Swiper = '/user/Swiper'; + static const OffAccountActivity = '/user/OffAccountActivity'; } \ No newline at end of file diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index c71df89..b20e4e2 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -52,6 +52,8 @@ dependencies: flutter_swiper: ^1.1.6 # 选择器弹窗 flutter_pickers: ^2.1.9 + #七牛 + qiniu_flutter_sdk: ^0.5.0 dev_dependencies: flutter_test: