帮助反馈ui 和登录流程 新增dio网络请求和sp存储

This commit is contained in:
YangYuhao 2023-06-16 18:14:31 +08:00
parent 2312ab7084
commit 238c729eee
36 changed files with 1143 additions and 480 deletions

View File

@ -47,7 +47,7 @@ android {
applicationId "com.example.circle_app" applicationId "com.example.circle_app"
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion flutter.minSdkVersion minSdkVersion 19
targetSdkVersion flutter.targetSdkVersion targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName

View File

@ -1,6 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.circle_app"> package="com.example.circle_app">
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application <application
android:label="circle_app" android:label="circle_app"
android:name="${applicationName}" android:name="${applicationName}"
@ -12,6 +13,8 @@
android:theme="@style/LaunchTheme" android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as <!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user the Android process has started. This theme is visible to the user

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>

View File

@ -3,6 +3,10 @@ buildscript {
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
maven{url 'https://maven.aliyun.com/repository/google' }
maven{url 'https://maven.aliyun.com/repository/google-plugin' }
maven{url 'https://maven.aliyun.com/repository/public' }
maven{url 'https://maven.aliyun.com/repository/jcenter' }
} }
dependencies { dependencies {

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

View File

@ -13,152 +13,177 @@ class AboutappPage extends StatelessWidget {
AboutappPage({Key? key}) : super(key: key); AboutappPage({Key? key}) : super(key: key);
final logic = Get.find<AboutappLogic>(); final logic = Get.find<AboutappLogic>();
final state = Get.find<AboutappLogic>().state; final state = Get
.find<AboutappLogic>()
.state;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return GetBuilder<AboutappLogic>(builder: (logic) {
decoration: BoxDecoration( return Container(
image: DecorationImage( decoration: BoxDecoration(
image: AssetImage(getBaseImage("home_back")), image: DecorationImage(
fit: BoxFit.cover, image: AssetImage(getBaseImage("home_back")),
fit: BoxFit.cover,
),
), ),
), child: Scaffold(
child: Scaffold( backgroundColor: Colors.transparent,
backgroundColor: Colors.transparent, appBar: MyAppBar(centerTitle: '关于圈子',),
appBar: MyAppBar(centerTitle: '关于',), body: Scaffold(
body: Scaffold( backgroundColor: Colors.transparent,
backgroundColor: Colors.transparent, // Replace with your desired color // Replace with your desired color
body: Container( body: Container(
margin: EdgeInsets.only(left: 11.sp,right: 11.sp), margin: EdgeInsets.only(left: 11.sp, right: 11.sp),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [
// Image.asset(
// getHomeImage("mine_circle"), // Replace with your image path
// width: double.infinity,
// height: double.infinity,
// fit: BoxFit.contain,
// ),
SizedBox(height: 20),
Text(
'圈子',
style: TextStyle(
color: Color(0xFFF7FAFA),
fontSize: 16,
),
),
SizedBox(height: 40),
Container(
width: double.infinity,
height: 0.4,
color: Color(0xFF2E2E3B),
),
SizedBox(height: 20),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
_openBrowser();
},
child: Row(
children: [ children: [
// Image.asset(
// getHomeImage("mine_circle"), // Replace with your image path
// width: double.infinity,
// height: double.infinity,
// fit: BoxFit.contain,
// ),
SizedBox(height: 20.sp),
Text( Text(
'评价跨友', '圈子',
style: TextStyle( style: TextStyle(
color: Color(0xFFF7FAFA), color: Color(0xFFF7FAFA),
fontSize: 16, fontSize: 16.sp,
), ),
), ),
Spacer(), SizedBox(height: 40.sp),
Container(
SizedBox(width: 8), width: double.infinity,
Image( height: 0.4.sp,
image: AssetImage(getHomeImage("icon_in")),width: 24.sp,height: 24.sp, color: Color(0xFF2E2E3B),
fit: BoxFit.fill,
), ),
// SizedBox(height: 20),
// GestureDetector(
// behavior: HitTestBehavior.opaque,
// onTap: () {
// _openBrowser();
// },
// child: Row(
// children: [
// Text(
// '评价圈子',
// style: TextStyle(
// color: Color(0xFFF7FAFA),
// fontSize: 16,
// ),
// ),
// Spacer(),
//
// SizedBox(width: 8),
// Image(
// image: AssetImage(getHomeImage("icon_in")),
// width: 24.sp,
// height: 24.sp,
// fit: BoxFit.fill,
// ),
//
// ],
// ),
// ),
SizedBox(height: 20.sp),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){
Get.toNamed(AppRoutes.WebViewActivity,arguments: {'title':"用户协议","url":"https://www.baidu.com"});
},
child: Row(
children: [
Text(
'用户协议',
style: TextStyle(
color: Color(0xFFF7FAFA),
fontSize: 16.sp,
),
),
Spacer(),
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
height: 24.sp,
fit: BoxFit.fill,
),
],
),),
SizedBox(height: 20.sp),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: (){
Get.toNamed(AppRoutes.WebViewActivity,arguments: {'title':"隐私协议","url":"https://www.baidu.com"});
},
child: Row(
children: [
Text(
'隐私政策',
style: TextStyle(
color: Color(0xFFF7FAFA),
fontSize: 16,
),
),
Spacer(),
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
height: 24.sp,
fit: BoxFit.fill,
),
],
),)
,
SizedBox(height: 20.sp),
Row(
children: [
Text(
'版本更新',
style: TextStyle(
color: Color(0xFFF7FAFA),
fontSize: 16.sp,
),
),
Spacer(),
Container(
width: 6.sp,
height: 5.sp,
margin: EdgeInsets.only(top: 1.sp, right: 8.sp),
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(3.sp),
),
),
Text(
'1.0.0',
style: TextStyle(
color: Color(0xFFB7BECC),
fontSize: 12.sp,
),
),
SizedBox(width: 8),
Image(
image: AssetImage(getHomeImage("icon_in")),
width: 24.sp,
height: 24.sp,
fit: BoxFit.fill,
),
],
),
], ],
), ),)
), ),),
);
SizedBox(height: 20), });
Row(
children: [
Text(
'用户协议',
style: TextStyle(
color: Color(0xFFF7FAFA),
fontSize: 16,
),
),
Spacer(),
Image(
image: AssetImage(getHomeImage("icon_in")),width: 24.sp,height: 24.sp,
fit: BoxFit.fill,
),
],
),
SizedBox(height: 20),
Row(
children: [
Text(
'隐私政策',
style: TextStyle(
color: Color(0xFFF7FAFA),
fontSize: 16,
),
),
Spacer(),
Image(
image: AssetImage(getHomeImage("icon_in")),width: 24.sp,height: 24.sp,
fit: BoxFit.fill,
),
],
),
SizedBox(height: 20),
Row(
children: [
Text(
'版本更新',
style: TextStyle(
color: Color(0xFFF7FAFA),
fontSize: 16,
),
),
Spacer(),
Container(
width: 6,
height: 5,
margin: EdgeInsets.only(top: 1, right: 8),
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(3),
),
),
Text(
'1.0.0',
style: TextStyle(
color: Color(0xFFB7BECC),
fontSize: 12,
),
),
SizedBox(width: 8),
Image(
image: AssetImage(getHomeImage("icon_in")),width: 24.sp,height: 24.sp,
fit: BoxFit.fill,
),
],
),
],
),)
),),
);
} }
String url = 'https://www.baidu.com'; // Replace with your desired URL String url = 'https://www.baidu.com'; // Replace with your desired URL
void _openBrowser() async { void _openBrowser() async {

View File

@ -31,7 +31,7 @@ class AccountPage extends StatelessWidget {
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
body: SafeArea( body: SafeArea(
child: ListView( child: ListView(
padding: EdgeInsets.all(16.0), padding: EdgeInsets.all(16.0.sp),
children: [ children: [
// Container( // Container(
// margin: EdgeInsets.only(top: 16.0), // margin: EdgeInsets.only(top: 16.0),
@ -58,14 +58,14 @@ class AccountPage extends StatelessWidget {
Get.toNamed(AppRoutes.PhotoActivity); Get.toNamed(AppRoutes.PhotoActivity);
}, },
child: Container( child: Container(
margin: EdgeInsets.only(top: 16.0), margin: EdgeInsets.only(top: 16.0.sp),
child: Row( child: Row(
children: [ children: [
Text( Text(
"换绑手机号", "换绑手机号",
style: TextStyle( style: TextStyle(
color: Color(0xFFF7FAFA), color: Color(0xFFF7FAFA),
fontSize: 16.0, fontSize: 16.0.sp,
), ),
), ),
Spacer(), Spacer(),
@ -73,14 +73,14 @@ class AccountPage extends StatelessWidget {
"16677778888", "16677778888",
style: TextStyle( style: TextStyle(
color: Color(0xFFB7BECC), color: Color(0xFFB7BECC),
fontSize: 16.0, fontSize: 16.0.sp,
), ),
), ),
SizedBox(width: 8.0), SizedBox(width: 8.0.sp),
Image.asset( Image.asset(
getHomeImage("icon_in"), getHomeImage("icon_in"),
width: 24.0, width: 24.0.sp,
height: 24.0, height: 24.0.sp,
), ),
], ],
), ),
@ -112,21 +112,21 @@ class AccountPage extends StatelessWidget {
Get.toNamed(AppRoutes.OffAccountActivity); Get.toNamed(AppRoutes.OffAccountActivity);
}, },
child: Container( child: Container(
margin: EdgeInsets.only(top: 16.0), margin: EdgeInsets.only(top: 16.0.sp),
child: Row( child: Row(
children: [ children: [
Text( Text(
"注销账号", "注销账号",
style: TextStyle( style: TextStyle(
color: Color(0xFFF7FAFA), color: Color(0xFFF7FAFA),
fontSize: 16.0, fontSize: 16.0.sp,
), ),
), ),
Spacer(), Spacer(),
Image.asset( Image.asset(
getHomeImage("icon_in"), getHomeImage("icon_in"),
width: 24.0, width: 24.0.sp,
height: 24.0, height: 24.0.sp,
), ),
], ],
), ),
@ -263,7 +263,7 @@ class AccountPage extends StatelessWidget {
Container( Container(
margin: EdgeInsets.only( margin: EdgeInsets.only(
top: 40.0.sp, left: 72.0.sp, right: 72.0.sp), top: 40.0.sp, left: 72.0.sp, right: 72.0.sp),
height: 42, height: 42.sp,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(21.0.sp), borderRadius: BorderRadius.circular(21.0.sp),
color: Color(0xFF21BEAB), color: Color(0xFF21BEAB),

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../components/my_app_bar.dart'; import '../../components/my_app_bar.dart';
@ -29,7 +30,7 @@ class BlacklistPage extends StatelessWidget {
child: SmartRefresher( child: SmartRefresher(
controller: _refreshController, controller: _refreshController,
child: ListView.builder( child: ListView.builder(
padding: EdgeInsets.all(16), padding: EdgeInsets.all(16.sp),
itemCount: itemCount, itemCount: itemCount,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return ListTile( return ListTile(

View File

@ -219,8 +219,8 @@ class CirclePage extends StatelessWidget {
children: [ children: [
Container( Container(
height: 30.sp, height: 30.sp,
width: 30.0 + width: 30.0.sp +
15 * (widgets.length - 1), 15.sp * (widgets.length - 1.sp),
child: Stack( child: Stack(
children: widgets, children: widgets,
), ),

View File

@ -2,4 +2,5 @@ class FeedbackState {
FeedbackState() { FeedbackState() {
///Initialize variables ///Initialize variables
} }
String maxMsg = "0/200";
} }

View File

@ -11,13 +11,11 @@ class FeedbackPage extends StatelessWidget {
FeedbackPage({Key? key}) : super(key: key); FeedbackPage({Key? key}) : super(key: key);
final logic = Get.find<FeedbackLogic>(); final logic = Get.find<FeedbackLogic>();
final state = Get final state = Get.find<FeedbackLogic>().state;
.find<FeedbackLogic>()
.state;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GetBuilder(builder: (FeedbackLogic controller){ return GetBuilder(builder: (FeedbackLogic controller) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
image: DecorationImage( image: DecorationImage(
@ -26,106 +24,126 @@ class FeedbackPage extends StatelessWidget {
), ),
), ),
child: Scaffold( child: Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
appBar: MyAppBar( appBar: MyAppBar(
centerTitle: '意见反馈', 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),
),
),
),
],
), ),
),) body: SingleChildScrollView(
), child: SafeArea(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Stack(
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(
maxLength: 200,
onChanged: (msg){
print(msg);
controller.state.maxMsg = '${msg.length}/200';
controller.update();
},
decoration: InputDecoration(
hintText: '请补充详细问题和意见,我们会认真看完的哦~',
counterText: '',
hintStyle: TextStyle(
color: Color(0xFFB7BECC), fontSize: 14.sp),
border: InputBorder.none,
),
maxLines: null,
inputFormatters: [
LengthLimitingTextInputFormatter(200),
],
style: TextStyle(color: Colors.white),
),
),
Positioned(
right: 30.sp,
bottom: 30.sp,
child: Text(
controller.state.maxMsg,
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),
),
),
),
],
),
),
)),
); );
}); });
} }
}
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart';
@ -30,7 +31,7 @@ class FriendslistPage extends StatelessWidget {
child: SmartRefresher( child: SmartRefresher(
controller: _refreshController, controller: _refreshController,
child: ListView.builder( child: ListView.builder(
padding: EdgeInsets.all(16), padding: EdgeInsets.all(16.sp),
itemCount: itemCount, itemCount: itemCount,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return ListTile( return ListTile(

View File

@ -4,4 +4,40 @@ import 'state.dart';
class HelpLogic extends GetxController { class HelpLogic extends GetxController {
final HelpState state = HelpState(); final HelpState state = HelpState();
List<FaqItem> msgList = [
FaqItem(
question: '·为什么我被禁言了?',
answer: '我们审核人员24小时巡查的存在发布违规内容、骂人、发QQ微信、欺诈骗取财物、打广告等违规行为都会被禁言或永久封禁',
),
FaqItem(
question: '·可以免费领取会员吗?',
answer: '答:可以的,邀请一些圈友加入我们,就可以免费获得会员哦~',
),
FaqItem(
question: '·如何让更多的人看到我?',
answer: '答:开通会员提升权重、多加入一些圈子、多在这些圈子里喊话、多找一些圈友聊天。',
),
FaqItem(
question: '·怎样做才能获更多人的喜欢?',
answer: '答:完善个人资料丰富形象、多上传一些形象照、及时回复圈友发来的消息、真诚文明地聊天。',
),
FaqItem(
question: '·发现图片或视频被人盗取了怎么办?',
answer: '答:立即举报,并向在线客户反应情况。\n 划重点:核实后会对其做出处理并要求删除相关内容~',
),
//
];
} }
class FaqItem {
String question;
String answer;
bool selected;
FaqItem({
required this.question,
required this.answer,
this.selected = false,
});
}

View File

@ -1,3 +1,4 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -12,153 +13,217 @@ class HelpPage extends StatelessWidget {
final logic = Get.find<HelpLogic>(); final logic = Get.find<HelpLogic>();
final state = Get.find<HelpLogic>().state; final state = Get.find<HelpLogic>().state;
bool showAnswer = false;
@override @override
Widget build(BuildContext context) { 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: SafeArea(
child: Column(
children: [ return GetBuilder<HelpLogic>(builder: (logic) {
Padding( return Container(
padding: EdgeInsets.only(top: 30.sp), decoration: BoxDecoration(
child: Center( image: DecorationImage(
child: Text( image: AssetImage(getBaseImage("home_back")),
'04-10 19:51', fit: BoxFit.cover,
style: TextStyle( ),
color: Color(0xFFB7BECC), ),
fontSize: 12.sp, child: Scaffold(
backgroundColor: Colors.transparent,
appBar: MyAppBar(
centerTitle: '帮助与反馈',
),
body: SafeArea(
child: Column(
children: [
Padding(
padding: EdgeInsets.only(top: 30.sp),
child: Center(
child: Text(
'04-10 19:51',
style: TextStyle(
color: Color(0xFFB7BECC),
fontSize: 12.sp,
),
), ),
), ),
), ),
), SizedBox(height: 16.sp),
SizedBox(height: 16.sp), Padding(
Padding( padding: EdgeInsets.only(left: 16.sp, right: 16.sp),
padding: EdgeInsets.only(left: 16.sp, right: 16.sp), child: Row(
child: Row( children: [
children: [ Container(
Container( height: 300.sp,
height: 200.sp, child: Align(
child: Align( alignment: Alignment.topCenter,
alignment: Alignment.topCenter, child: Image.asset(
child: Image.asset( getMineImage("im_feedback"),
getMineImage("im_feedback"), width: 32.sp,
width: 32.sp, height: 32.sp,
height: 32.sp, ),
), ),
), ),
), SizedBox(width: 8.sp),
SizedBox(width: 8.sp), Expanded(
Expanded( child: Container(
child: Container( height: 300,
height: 200, padding: EdgeInsets.all(16),
padding: EdgeInsets.all(16), decoration: BoxDecoration(
decoration: BoxDecoration( borderRadius: BorderRadius.circular(4.sp),
borderRadius: BorderRadius.circular(4.sp), color: Color(0xFF2E2E3B),
color: Color(0xFF2E2E3B), ),
), child: Center(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
'猜你想问', '猜你想问',
style: TextStyle( style: TextStyle(
color: Color(0xFFB7BECC), color: Color(0xFFB7BECC),
fontSize: 14.sp, fontSize: 14.sp,
), ),
),
SizedBox(height: 10.sp),
Expanded(
child: ListView.builder(
itemCount: logic.msgList.length,
itemBuilder: (context, index) {
return Column(
children: [
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
showAnswer =
!showAnswer; //
for (int i = 0;
i < logic.msgList.length;
i++) {
if (index == i) {
logic.msgList[i].selected =
true;
} else {
logic.msgList[i].selected =
false;
}
}
// logic.msgList[index].selected = true;
logic.update();
},
child: Container(
margin: EdgeInsets.only(
top: 10.sp, bottom: 10.sp),
child: Row(
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Text(
logic.msgList[index].question,
style: TextStyle(
color: Colors.white),
),
Image(
image: AssetImage(logic.msgList[index].selected ?
getMineImage("im_down") :
getMineImage("im_right")),
width: 10.sp,
height: 14.sp,
),
],
),
),
),
if (logic.msgList[index]
.selected) // showAnswer为true且当前索引与选中索引匹配时才显示答案
Container(
margin: EdgeInsets.all(6.sp),
child: Text(
textAlign: TextAlign.left,
logic.msgList[index].answer,
style: TextStyle(
color: Colors.white70,
fontSize: 12.sp),
),
),
],
);
},
),
),
],
), ),
SizedBox(height: 10.sp), ),
Expanded(
child: ListView.builder(
itemCount: /* Replace with your item count */ 0,
itemBuilder: (context, index) {
return /* Replace with your list item widget */;
},
),
),
],
), ),
), ),
), ],
], ),
), ),
), Spacer(),
Spacer(), Padding(
Padding( padding: EdgeInsets.only(bottom: 30.sp),
padding: EdgeInsets.only(bottom: 30.sp), child: Row(
child: Row( mainAxisAlignment: MainAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, children: [
children: [ TextButton.icon(
TextButton.icon( onPressed: () {
onPressed: () { Get.toNamed(AppRoutes.FeedbackActivity);
Get.toNamed(AppRoutes.FeedbackActivity); // Handle feedback button press
// Handle feedback button press },
}, icon: Image.asset(
icon: Image.asset( getMineImage("im_feedback_write"),
getMineImage("im_feedback_write"), width: 14.sp,
width: 14.sp, height: 14.sp,
height: 14.sp, ),
), label: Text(
label: Text( '意见反馈',
'意见反馈', style: TextStyle(
style: TextStyle( color: Colors.white,
color: Colors.white, fontSize: 14,
fontSize: 14, ),
),
style: TextButton.styleFrom(
backgroundColor: Color(0xFF21BEAB),
padding: EdgeInsets.symmetric(
horizontal: 16.sp, vertical: 4.sp),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.sp),
),
), ),
), ),
style: TextButton.styleFrom( SizedBox(width: 20.sp),
backgroundColor: Color(0xFF21BEAB), TextButton.icon(
padding: EdgeInsets.symmetric( onPressed: () {
horizontal: 16.sp, vertical: 4.sp), // Handle contact service button press
shape: RoundedRectangleBorder( },
borderRadius: BorderRadius.circular(20.sp), icon: Image.asset(
getMineImage("im_service"),
width: 14.sp,
height: 14.sp,
),
label: Text(
'联系客服',
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
),
),
style: TextButton.styleFrom(
backgroundColor: Color(0xFF21BEAB),
padding: EdgeInsets.symmetric(
horizontal: 16.sp, vertical: 4.sp),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.sp),
),
), ),
), ),
), ],
SizedBox(width: 20), ),
TextButton.icon(
onPressed: () {
// Handle contact service button press
},
icon: Image.asset(
getMineImage("im_service"),
width: 14.sp,
height: 14.sp,
),
label: Text(
'联系客服',
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
),
),
style: TextButton.styleFrom(
backgroundColor: Color(0xFF21BEAB),
padding: EdgeInsets.symmetric(
horizontal: 16.sp, vertical: 4.sp),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.sp),
),
),
),
],
), ),
), ],
], ),
), ),
), ),
), );
); });
} }
} }

View File

@ -1,10 +1,14 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/router/app_routers.dart';
import 'package:circle_app/util/util.dart'; import 'package:circle_app/util/util.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../network/network.dart';
import 'state.dart'; import 'state.dart';
class LoginLogic extends GetxController { class LoginLogic extends GetxController {
@ -19,6 +23,7 @@ class LoginLogic extends GetxController {
// //
starDownTimer() { starDownTimer() {
if (sendCodeBtn == false && seconds == 60) { if (sendCodeBtn == false && seconds == 60) {
getCode();
sendCodeBtn = true; sendCodeBtn = true;
t = Timer.periodic(Duration(milliseconds: 1000), (timer) { t = Timer.periodic(Duration(milliseconds: 1000), (timer) {
seconds--; seconds--;
@ -31,16 +36,67 @@ class LoginLogic extends GetxController {
}); });
} }
} }
Future<void> getCode() async {
try{
// var formData = Dio().options.contentType = 'application/x-www-form-urlencoded';
// formData = {"phone": phoneEditingController.text} as String;
var response = await dio.post('msg-service/sms/code/send', queryParameters: {"phone": phoneEditingController.text});
}catch(e){
if (e is DioException) {
print('DioException: ${e.message}');
print('DioException Error: ${e.error}');
print('DioException Response: ${e.response}');
} else {
print('Exception: $e');
}
}
}
@override @override
void dispose() { void dispose() {
// TODO: implement dispose
super.dispose(); super.dispose();
t?.cancel(); t?.cancel();
} }
void login() { void login() async {
Get.toNamed(AppRoutes.Complete_materialPage); if (!GetUtils.isPhoneNumber(phoneEditingController.text)) {
showToast('请输入正确的手机号');
}
if (codeEditingController.text == '') {
showToast('请输入验证码');
}
try{
var response = await dio.post('user-service/login/smscode', data: {"phone": phoneEditingController.text,"code":codeEditingController.text});
Map<String, dynamic> jsonData = jsonDecode(response.data.toString());
int code = jsonData['code'];
String msg = jsonData['msg'];
String authorization = jsonData['data']['Authorization'];
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('Authorization', authorization);
if(code == 200){
Get.toNamed(AppRoutes.Home);
return;
}else if(code == 30002){
Get.toNamed(AppRoutes.Complete_materialPage);
return;
}
showToast(msg);
}catch(e){
if (e is DioException) {
print('DioException: ${e.message}');
print('DioException Error: ${e.error}');
print('DioException Response: ${e.response}');
} else {
print('Exception: $e');
}
}
// Get.toNamed(AppRoutes.Complete_materialPage);
// if (!GetUtils.isPhoneNumber(phoneEditingController.text)) { // if (!GetUtils.isPhoneNumber(phoneEditingController.text)) {
// showToast('请输入正确的手机号'); // showToast('请输入正确的手机号');
// } // }

View File

@ -12,6 +12,7 @@ class LoginPage extends StatelessWidget {
final state = Get final state = Get
.find<LoginLogic>() .find<LoginLogic>()
.state; .state;
bool isPhoto = false;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -53,6 +54,14 @@ class LoginPage extends StatelessWidget {
Container( Container(
width: 200.sp, width: 200.sp,
child: TextField( child: TextField(
onChanged: (msg){
if (GetUtils.isPhoneNumber(msg)&& msg.length==11) {
isPhoto = true;
}else{
isPhoto = false;
}
logic.update();
},
controller: logic.phoneEditingController, controller: logic.phoneEditingController,
maxLength: 11, maxLength: 11,
style: TextStyle( style: TextStyle(
@ -114,14 +123,16 @@ class LoginPage extends StatelessWidget {
right: 0, right: 0,
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
logic.starDownTimer(); if(isPhoto){
logic.starDownTimer();
}
}, },
child: Container( child: Container(
alignment: Alignment.center, alignment: Alignment.center,
width: 76.sp, width: 76.sp,
height: 29.sp, height: 29.sp,
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white30, color:isPhoto ? Color(0xFF21BEAB) : Colors.white30,
borderRadius: BorderRadius.circular( borderRadius: BorderRadius.circular(
29.sp / 2) 29.sp / 2)
), ),

View File

@ -1,11 +1,18 @@
import 'package:dio/dio.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../network/network.dart';
import '../../router/app_routers.dart'; import '../../router/app_routers.dart';
import 'state.dart'; import 'state.dart';
class MinefragmentLogic extends GetxController { class MinefragmentLogic extends GetxController {
final MinefragmentState state = MinefragmentState(); final MinefragmentState state = MinefragmentState();
jumpSetUp(){
jumpSetUp() {
Get.toNamed(AppRoutes.SetUpActivity); Get.toNamed(AppRoutes.SetUpActivity);
} }
} }

View File

@ -1,7 +1,27 @@
import 'package:dio/dio.dart';
import '../../network/network.dart';
class MinefragmentState { class MinefragmentState {
var hearUrl = "http://pics5.baidu.com/feed/622762d0f703918f751ba5e950ce8d915beec4c1.jpeg?token=ed435fd18c71cf7ca7a011acb70460f7"; var hearUrl = "http://pics5.baidu.com/feed/622762d0f703918f751ba5e950ce8d915beec4c1.jpeg?token=ed435fd18c71cf7ca7a011acb70460f7";
MinefragmentState() { MinefragmentState() {
request();
///Initialize variables ///Initialize variables
} }
Future<void> request() async {
print("111111");
try{
var response = await dio.put('user-service/register/user/info', data: {});
print(response.data.toString());
}catch(e){
if (e is DioException) {
print('DioException: ${e.message}');
print('DioException Error: ${e.error}');
print('DioException Response: ${e.response}');
} else {
print('Exception: $e');
}
}
}
} }

View File

@ -9,13 +9,14 @@ import 'logic.dart';
class MinefragmentPage extends StatelessWidget { class MinefragmentPage extends StatelessWidget {
MinefragmentPage({Key? key}) : super(key: key); MinefragmentPage({Key? key}) : super(key: key);
// final logic = Get.lazyPut(() => MinefragmentLogic()); final logic = Get.lazyPut(() => MinefragmentLogic());
// final state = Get.find<MinefragmentLogic>().state; final state = Get.find<MinefragmentLogic>().state;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
double statusBarHeight = MediaQuery.of(context).padding.top; double statusBarHeight = MediaQuery.of(context).padding.top;
return Scaffold( return Scaffold(
body: Container( body: Container(
width: Get.width, width: Get.width,
@ -377,7 +378,9 @@ class MinefragmentPage extends StatelessWidget {
return ClipOval( return ClipOval(
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
// Get.toNamed(AppRoutes.Swiper,arguments:imgList); var imgList = <String>[];
imgList.add("https://book.flutterchina.club/assets/img/logo.png");
Get.toNamed(AppRoutes.Swiper,arguments:imgList);
}, },
child: Image.network( child: Image.network(
'https://book.flutterchina.club/assets/img/logo.png', 'https://book.flutterchina.club/assets/img/logo.png',

View File

@ -73,7 +73,7 @@ class _OffaccountState extends State<OffaccountPage> {
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
body: SingleChildScrollView( body: SingleChildScrollView(
child: Container( child: Container(
padding: EdgeInsets.all(16), padding: EdgeInsets.all(16.sp),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -82,49 +82,49 @@ class _OffaccountState extends State<OffaccountPage> {
"注销后,你的账号将", "注销后,你的账号将",
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 16, fontSize: 16.sp,
), ),
), ),
SizedBox(height: 8), SizedBox(height: 8.sp),
Text( Text(
"1、无法登录跨友app", "1、无法登录跨友app",
style: TextStyle( style: TextStyle(
color: Color(0xFFB7BECC), color: Color(0xFFB7BECC),
fontSize: 12, fontSize: 12.sp,
), ),
), ),
Text( Text(
"2、所有信息将被永远删除身份信息、账户信息、会员、喊话、相册等内容", "2、所有信息将被永远删除身份信息、账户信息、会员、喊话、相册等内容",
style: TextStyle( style: TextStyle(
color: Color(0xFFB7BECC), color: Color(0xFFB7BECC),
fontSize: 12, fontSize: 12.sp,
), ),
), ),
Text( Text(
"3、您的好友无法与你取得联系(包括关注、粉丝等);", "3、您的好友无法与你取得联系(包括关注、粉丝等);",
style: TextStyle( style: TextStyle(
color: Color(0xFFB7BECC), color: Color(0xFFB7BECC),
fontSize: 12, fontSize: 12.sp,
), ),
), ),
Text( Text(
"4、注销后一个月内该手机号将无法注册新的账号。", "4、注销后一个月内该手机号将无法注册新的账号。",
style: TextStyle( style: TextStyle(
color: Color(0xFFB7BECC), color: Color(0xFFB7BECC),
fontSize: 12, fontSize: 12.sp,
), ),
), ),
SizedBox(height: 10), SizedBox(height: 10.sp),
// //
Text( Text(
"请输入绑定的手机号", "请输入绑定的手机号",
style: TextStyle( style: TextStyle(
color: Color(0xFF898F99), color: Color(0xFF898F99),
fontSize: 10, fontSize: 10.sp,
), ),
), ),
SizedBox(height: 10), SizedBox(height: 10.sp),
TextFormField( TextFormField(
controller: logic.state.photoController, controller: logic.state.photoController,
keyboardType: TextInputType.phone, keyboardType: TextInputType.phone,
@ -136,7 +136,7 @@ class _OffaccountState extends State<OffaccountPage> {
hintText: "请输入手机号", hintText: "请输入手机号",
hintStyle: TextStyle( hintStyle: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 14, fontSize: 14.sp,
), ),
filled: true, filled: true,
fillColor: Color(0xFF000000), fillColor: Color(0xFF000000),
@ -144,34 +144,34 @@ class _OffaccountState extends State<OffaccountPage> {
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4),
borderSide: BorderSide.none, borderSide: BorderSide.none,
), ),
contentPadding: EdgeInsets.symmetric(horizontal: 16), contentPadding: EdgeInsets.symmetric(horizontal: 16.sp),
), ),
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 14, fontSize: 14.sp,
), ),
// enabled: countdown == 0, // // enabled: countdown == 0, //
), ),
SizedBox(height: 16), SizedBox(height: 16.sp),
// //
Text( Text(
"请选择你的注销原因", "请选择你的注销原因",
style: TextStyle( style: TextStyle(
color: Color(0xFF898F99), color: Color(0xFF898F99),
fontSize: 10, fontSize: 10.sp,
), ),
), ),
SizedBox(height: 10), SizedBox(height: 10.sp),
GestureDetector(onTap: () { GestureDetector(onTap: () {
showBottomSheetDialog(context,logic); showBottomSheetDialog(context,logic);
}, },
child: Container( child: Container(
width: double.infinity, width: double.infinity,
height: 40, height: 40.sp,
margin: EdgeInsets.only(top: 10), margin: EdgeInsets.only(top: 10.sp),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4.sp),
color: Color(0xFF000000), color: Color(0xFF000000),
), ),
child: Row( child: Row(
@ -183,27 +183,27 @@ class _OffaccountState extends State<OffaccountPage> {
hintText: logic.state.offReasonMsg, hintText: logic.state.offReasonMsg,
hintStyle: TextStyle( hintStyle: TextStyle(
color: Color(0xFFF7FAFA), color: Color(0xFFF7FAFA),
fontSize: 14, fontSize: 14.sp,
), ),
border: InputBorder.none, border: InputBorder.none,
contentPadding: EdgeInsets.only(left: 16), contentPadding: EdgeInsets.only(left: 16.sp),
), ),
style: TextStyle( style: TextStyle(
color: Color(0xFFF7FAFA), color: Color(0xFFF7FAFA),
fontSize: 14, fontSize: 14.sp,
), ),
), ),
), ),
Image.asset( Image.asset(
getHomeImage("icon_in"), getHomeImage("icon_in"),
width: 14, width: 14.sp,
height: 14, height: 14.sp,
), ),
], ],
), ),
),) ),)
, ,
SizedBox(height: 42), SizedBox(height: 42.sp),
// //
GestureDetector( GestureDetector(
@ -213,7 +213,7 @@ class _OffaccountState extends State<OffaccountPage> {
}, child: Align( }, child: Align(
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
child: Container( child: Container(
width: 160, width: 160.sp,
child: ElevatedButton( child: ElevatedButton(
onPressed: (){ onPressed: (){
handleLogout(logic); handleLogout(logic);
@ -227,7 +227,7 @@ class _OffaccountState extends State<OffaccountPage> {
), ),
shape: MaterialStateProperty.all<OutlinedBorder>( shape: MaterialStateProperty.all<OutlinedBorder>(
RoundedRectangleBorder( RoundedRectangleBorder(
borderRadius: BorderRadius.circular(17), borderRadius: BorderRadius.circular(17.sp),
), ),
), ),
), ),

View File

@ -113,60 +113,14 @@ class _PhotoinfoPage extends State<PhotoinfoPage> {
hintText: "请输入已绑定手机号", hintText: "请输入已绑定手机号",
hintStyle: TextStyle( hintStyle: TextStyle(
color: Colors.grey.shade300, color: Colors.grey.shade300,
fontSize: 14.0, fontSize: 14.0.sp,
), ),
border: InputBorder.none, border: InputBorder.none,
), ),
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 14.0, fontSize: 14.0.sp,
height: 1.0, height: 1.0.sp,
),
),
),
)
],
),
),
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(
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,
), ),
), ),
), ),
@ -174,6 +128,52 @@ class _PhotoinfoPage extends State<PhotoinfoPage> {
], ],
), ),
), ),
// 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(
// 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,
// ),
// ),
// ),
// )
// ],
// ),
// ),
Container( Container(
margin: margin:
EdgeInsets.fromLTRB(16.0.sp, 20.0.sp, 16.0.sp, 0.0.sp), EdgeInsets.fromLTRB(16.0.sp, 20.0.sp, 16.0.sp, 0.0.sp),
@ -212,14 +212,14 @@ class _PhotoinfoPage extends State<PhotoinfoPage> {
hintText: "请输入新手机号", hintText: "请输入新手机号",
hintStyle: TextStyle( hintStyle: TextStyle(
color: Colors.grey.shade300, color: Colors.grey.shade300,
fontSize: 14.0, fontSize: 14.0.sp,
), ),
border: InputBorder.none, border: InputBorder.none,
), ),
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 14.0, fontSize: 14.0.sp,
height: 1.0, height: 1.0.sp,
), ),
), ),
), ),
@ -262,14 +262,14 @@ class _PhotoinfoPage extends State<PhotoinfoPage> {
hintText: "请输入验证码", hintText: "请输入验证码",
hintStyle: TextStyle( hintStyle: TextStyle(
color: Colors.grey.shade300, color: Colors.grey.shade300,
fontSize: 14.0, fontSize: 14.0.sp,
), ),
border: InputBorder.none, border: InputBorder.none,
), ),
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 14.0, fontSize: 14.0.sp,
height: 1.0, height: 1.0.sp,
), ),
), ),
), ),

View File

@ -1,10 +1,13 @@
import 'package:circle_app/components/my_app_bar.dart'; import 'package:circle_app/components/my_app_bar.dart';
import 'package:circle_app/util/util.dart'; import 'package:circle_app/util/util.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../router/app_routers.dart'; import '../../router/app_routers.dart';
import 'logic.dart'; import 'logic.dart';
@ -16,6 +19,7 @@ class SetupPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// _getFormat(context);
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
image: DecorationImage( image: DecorationImage(
@ -80,7 +84,7 @@ class SetupPage extends StatelessWidget {
SizedBox(height: 16.sp), SizedBox(height: 16.sp),
// _buildItemRow('系统权限管理', getHomeImage("icon_in")), // _buildItemRow('系统权限管理', getHomeImage("icon_in")),
// SizedBox(height: 16.sp), // SizedBox(height: 16.sp),
_buildCacheItemRow('清除缓存', getHomeImage("icon_in")), _buildCacheItemRow('清除缓存', getHomeImage("icon_in"),context),
SizedBox(height: 16.sp), SizedBox(height: 16.sp),
GestureDetector( GestureDetector(
@ -119,7 +123,7 @@ class SetupPage extends StatelessWidget {
); );
} }
Widget _buildCacheItemRow(String text, String imagePath) { Widget _buildCacheItemRow(String text, String imagePath,BuildContext context) {
return Container( return Container(
padding: EdgeInsets.symmetric(horizontal: 16.sp), // @dimen/dp_16 padding: EdgeInsets.symmetric(horizontal: 16.sp), // @dimen/dp_16
child: Row( child: Row(
@ -132,6 +136,7 @@ class SetupPage extends StatelessWidget {
), ),
), ),
Spacer(), Spacer(),
// _getFormat(context),
Text( Text(
'XXX', // 'XXX' 'XXX', // 'XXX'
style: TextStyle( style: TextStyle(

View File

@ -4,5 +4,5 @@ import 'state.dart';
class SwiperLogic extends GetxController { class SwiperLogic extends GetxController {
final SwiperState state = SwiperState(); final SwiperState state = SwiperState();
List<Map> imgList = Get.arguments ; List<String> imgList = Get.arguments ;
} }

View File

@ -30,7 +30,7 @@ class _SwiperPageState extends State<SwiperPage> {
return Container( return Container(
width: double.infinity, width: double.infinity,
child: Image.network( child: Image.network(
logic.imgList[index]['url'], fit: BoxFit.contain,) logic.imgList[index], fit: BoxFit.contain,)
); );
}, },
itemCount: logic.imgList.length, itemCount: logic.imgList.length,

View File

@ -1,5 +1,12 @@
class UserinfoState { class UserinfoState {
UserinfoState() { UserinfoState() {
///Initialize variables ///Initialize variables
} }
List<String> imaglist = ["https://book.flutterchina.club/assets/img/logo.png",
"https://book.flutterchina.club/assets/img/logo.png",
"https://book.flutterchina.club/assets/img/logo.png",
"https://book.flutterchina.club/assets/img/logo.png",
"https://book.flutterchina.club/assets/img/logo.png",
"https://book.flutterchina.club/assets/img/logo.png",];
} }

View File

@ -363,13 +363,14 @@ class _MyTabbedScreenState extends State<UserinfoPage>
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3, // crossAxisCount: 3, //
), ),
itemCount: 20, // itemCount: controller.state.imaglist.length+1, //
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
if (index == 0) { if (index == 0) {
// //
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
controller.getImageFile(); controller.getImageFile();
}, },
child: Container( child: Container(
margin: EdgeInsets.all(5.sp), margin: EdgeInsets.all(5.sp),
@ -386,8 +387,8 @@ class _MyTabbedScreenState extends State<UserinfoPage>
margin: EdgeInsets.all(5.sp), margin: EdgeInsets.all(5.sp),
child: Center( child: Center(
child: _buildImageItem( child: _buildImageItem(
'https://book.flutterchina.club/assets/img/logo.png', controller.state.imaglist[index-1],
controller)), controller,index-1)),
); );
} }
}, },
@ -481,7 +482,11 @@ class _MyTabbedScreenState extends State<UserinfoPage>
Widget _buildAvatar1(UserinfoLogic controller) { Widget _buildAvatar1(UserinfoLogic controller) {
return ClipOval( return ClipOval(
child: GestureDetector( child: GestureDetector(
onTap: () {}, onTap: () {
var imgList = <String>[];
imgList.add("https://book.flutterchina.club/assets/img/logo.png");
Get.toNamed(AppRoutes.Swiper,arguments:imgList);
},
child: Image.network( child: Image.network(
'https://book.flutterchina.club/assets/img/logo.png', 'https://book.flutterchina.club/assets/img/logo.png',
width: 66.sp, width: 66.sp,
@ -491,14 +496,14 @@ class _MyTabbedScreenState extends State<UserinfoPage>
); );
} }
Widget _buildImageItem(String url, UserinfoLogic controller) { Widget _buildImageItem(String url, UserinfoLogic controller,int index) {
return Stack( return Stack(
children: [ children: [
ClipRRect( ClipRRect(
borderRadius: BorderRadius.circular(0.0), borderRadius: BorderRadius.circular(0.0),
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
showToast("点击了图片"); Get.toNamed(AppRoutes.Swiper,arguments:controller.state.imaglist);
}, },
child: Image.network( child: Image.network(
url, url,
@ -511,7 +516,9 @@ class _MyTabbedScreenState extends State<UserinfoPage>
right: 0, right: 0,
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
showToast("删除"); // showToast("删除");
_showDelImgDialog(context,controller,index);
}, },
child: Image( child: Image(
image: AssetImage(getMineImage("icon_img_del")), image: AssetImage(getMineImage("icon_img_del")),
@ -605,6 +612,151 @@ class _MyTabbedScreenState extends State<UserinfoPage>
); );
} }
void _showDelImgDialog(BuildContext context,UserinfoLogic controller,int index) {
showDialog(
context: context,
builder: (BuildContext context) {
return Dialog(
backgroundColor: Colors.transparent,
child: Container(
height: 160.sp,
padding: 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: 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: 30.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: () {
Navigator.pop(context);
controller.state.imaglist.removeAt(index);
controller.update();
},
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,
),
),
),
)
],
)
],
),
)
],
),
),
);
},
);
}
void _showReportDialog(BuildContext context) { void _showReportDialog(BuildContext context) {
showDialog( showDialog(
context: context, context: context,

View File

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

View File

@ -0,0 +1,10 @@
import 'package:get/get.dart';
import 'state.dart';
class WebviewLogic extends GetxController {
final WebviewState state = WebviewState();
final title = Get.arguments['title'];
}

View File

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

View File

@ -0,0 +1,70 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../../components/my_app_bar.dart';
import '../../util/util.dart';
import 'logic.dart';
class WebviewPage extends StatefulWidget {
@override
createState() => _WebViewContainerState();
}
class _WebViewContainerState extends State<WebviewPage> {
// Get.toNamed(AppRoutes.WebViewActivity,arguments: {'title':"百度","url":"https://www.baidu.com"});
_WebViewContainerState();
@override
Widget build(BuildContext context) {
final url = Get.arguments['url'];
var controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setBackgroundColor( Colors.transparent)
..setNavigationDelegate(
NavigationDelegate(
onProgress: (int progress) {
// Update loading bar.
},
onPageStarted: (String url) {},
onPageFinished: (String url) {},
onWebResourceError: (WebResourceError error) {},
onNavigationRequest: (NavigationRequest request) {
if (request.url.startsWith('')) {
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
),
)
..loadRequest(Uri.parse(url));
return GetBuilder<WebviewLogic>(builder: (logic) {
return Builder(
builder: (context) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(getBaseImage("home_back")),
fit: BoxFit.cover,
),
),
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: MyAppBar(centerTitle: logic.title,),
body: Column(
children: [
Expanded(
child: WebViewWidget(
controller: controller,
),
),
],
),),
);
}
);
});
}
}

View File

@ -6,6 +6,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'network/network.dart';
void main() { void main() {
runApp(const MyApp()); runApp(const MyApp());
} }
@ -17,6 +19,7 @@ class MyApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
//稿,dp //稿,dp
configureDio();
return ScreenUtilInit( return ScreenUtilInit(
designSize: const Size(375, 812), designSize: const Size(375, 812),
minTextAdapt: true, minTextAdapt: true,

View File

@ -0,0 +1,76 @@
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../util/device.dart';
final dio = Dio(); //
void configureDio() {
// BaseOptions设置默认配置
dio.options.baseUrl = 'http://192.168.3.55:2000/';
dio.options.connectTimeout = Duration(seconds: 5);
dio.options.receiveTimeout = Duration(seconds: 3);
//
//,
dio.interceptors.add(Interceptor());
// dio.interceptors.add(ErrorInterceptor());
// dio.interceptors.add(ResponceInterceptor());
//
dio.interceptors.add(LogInterceptor(responseBody: true));
dio.interceptors.add(InterceptorsWrapper(
onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
//
//
options.headers['Authorization'] = getAuthorization();
options.headers['version'] = getDeviceId();
if(Platform.isIOS){
options.headers['platform'] = '1';
}else if(Platform.isAndroid){
options.headers['platform'] = '0';
}
options.headers['imei'] = getImei();
options.headers['brand'] = getBrand();
//
// //
// options.queryParameters['key'] = 'value';
//
return handler.next(options);
},
onResponse: (Response response, ResponseInterceptorHandler handler) {
//
// ...
print("onResponse");
//
return handler.next(response);
},
onError: (DioException error, ErrorInterceptorHandler handler) {
//
// ...
print("onError");
//
return handler.next(error);
},
));
//
// (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
// client.badCertificateCallback = (X509Certificate cert, String host, int port) => true;
// // config the http client
// client.findProxy = (uri) {
// //proxy all request to localhost:8888
// return "PROXY http://192.168.3.55:2000"; //
// };
// // you can also create a new HttpClient to dio
// // return new HttpClient();
// };
// BaseOptions构造函数设置
}

View File

@ -34,6 +34,8 @@ import 'package:circle_app/app/text/binding.dart';
import 'package:circle_app/app/text/view.dart'; import 'package:circle_app/app/text/view.dart';
import 'package:circle_app/app/userinfo/binding.dart'; import 'package:circle_app/app/userinfo/binding.dart';
import 'package:circle_app/app/userinfo/view.dart'; import 'package:circle_app/app/userinfo/view.dart';
import 'package:circle_app/app/webview/binding.dart';
import 'package:circle_app/app/webview/view.dart';
import 'package:get/get_navigation/src/routes/get_route.dart'; import 'package:get/get_navigation/src/routes/get_route.dart';
import '../app/blacklist/view.dart'; import '../app/blacklist/view.dart';
@ -134,5 +136,10 @@ class AppPages {
page: () => OffaccountPage(), page: () => OffaccountPage(),
binding: OffaccountBinding(), binding: OffaccountBinding(),
), ),
GetPage(
name: AppRoutes.WebViewActivity,
page: () => WebviewPage(),
binding: WebviewBinding(),
),
]; ];
} }

View File

@ -18,4 +18,5 @@ abstract class AppRoutes {
static const TextActivity = '/user/TextActivity'; static const TextActivity = '/user/TextActivity';
static const Swiper = '/user/Swiper'; static const Swiper = '/user/Swiper';
static const OffAccountActivity = '/user/OffAccountActivity'; static const OffAccountActivity = '/user/OffAccountActivity';
static const WebViewActivity = '/user/WebViewActivity';
} }

View File

@ -0,0 +1,53 @@
import 'dart:io';
import 'package:device_info/device_info.dart';
import 'package:shared_preferences/shared_preferences.dart';
Future<String> getDeviceId() async {
String deviceId = "";
final DeviceInfoPlugin deviceInfoPlugin = new DeviceInfoPlugin();
try {
if (Platform.isAndroid) {
var build = await deviceInfoPlugin.androidInfo;
deviceId = build.androidId; // Android
} else if (Platform.isIOS) {
var data = await deviceInfoPlugin.iosInfo;
deviceId = data.identifierForVendor; // iOS
}
} catch (e) {
print('Failed to get device id: $e');
}
return deviceId;
}
Future<String> getImei() async{
String imei = "";
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
if (Platform.isAndroid) {
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
String imei = androidInfo.androidId;
// other specific Android data
} else if (Platform.isIOS) {
IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
imei = iosInfo.identifierForVendor;
// other specific iOS data
}
return imei;
}
Future<String> getBrand() async{
String brand = '';
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
if(Platform.isIOS){
IosDeviceInfo iosDeviceInfo = await deviceInfo.iosInfo;
brand = iosDeviceInfo.model;
}else if(Platform.isAndroid){
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
brand = androidInfo.model;
}
return brand;
}
Future<String> getAuthorization() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString("Authorization") ?? "";
}

View File

@ -54,6 +54,15 @@ dependencies:
flutter_pickers: ^2.1.9 flutter_pickers: ^2.1.9
#七牛 #七牛
qiniu_flutter_sdk: ^0.5.0 qiniu_flutter_sdk: ^0.5.0
#内置游览器插件
webview_flutter: ^4.2.2
#http
dio: ^5.0.0
#获取设备信息
device_info: ^2.0.3
shared_preferences: ^2.1.2
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: