fix(mining-app): unify color scheme and fix scroll issues
- Update login/register pages to use orange color scheme (#FF6B00) matching the navigation pages design - Fix SafeArea bottom: false on all navigation pages since MainShell handles bottom safe area via bottomNavigationBar - Add AlwaysScrollableScrollPhysics to asset page for consistent scroll - Increase bottom padding to 100px on all navigation pages to clear the navigation bar Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
c31d64550b
commit
94d8075970
|
|
@ -30,11 +30,13 @@ class AssetPage extends ConsumerWidget {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
|
bottom: false,
|
||||||
child: RefreshIndicator(
|
child: RefreshIndicator(
|
||||||
onRefresh: () async {
|
onRefresh: () async {
|
||||||
ref.invalidate(shareAccountProvider(accountSequence));
|
ref.invalidate(shareAccountProvider(accountSequence));
|
||||||
},
|
},
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
|
physics: const AlwaysScrollableScrollPhysics(),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
// 顶部导航栏
|
// 顶部导航栏
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import '../../../core/router/routes.dart';
|
import '../../../core/router/routes.dart';
|
||||||
import '../../../core/constants/app_colors.dart';
|
|
||||||
import '../../providers/user_providers.dart';
|
import '../../providers/user_providers.dart';
|
||||||
|
|
||||||
class LoginPage extends ConsumerStatefulWidget {
|
class LoginPage extends ConsumerStatefulWidget {
|
||||||
|
|
@ -13,6 +12,14 @@ class LoginPage extends ConsumerStatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _LoginPageState extends ConsumerState<LoginPage> {
|
class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
|
// 设计色彩 - 与导航页面统一
|
||||||
|
static const Color _orange = Color(0xFFFF6B00);
|
||||||
|
static const Color _darkText = Color(0xFF1F2937);
|
||||||
|
static const Color _grayText = Color(0xFF6B7280);
|
||||||
|
static const Color _lightGray = Color(0xFF9CA3AF);
|
||||||
|
static const Color _bgGray = Color(0xFFF3F4F6);
|
||||||
|
static const Color _borderGray = Color(0xFFE5E7EB);
|
||||||
|
|
||||||
final _formKey = GlobalKey<FormState>();
|
final _formKey = GlobalKey<FormState>();
|
||||||
final _phoneController = TextEditingController();
|
final _phoneController = TextEditingController();
|
||||||
final _passwordController = TextEditingController();
|
final _passwordController = TextEditingController();
|
||||||
|
|
@ -113,17 +120,19 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
const SizedBox(height: 60),
|
const SizedBox(height: 60),
|
||||||
|
|
||||||
// Logo
|
// Logo
|
||||||
Container(
|
Center(
|
||||||
width: 80,
|
child: Container(
|
||||||
height: 80,
|
width: 80,
|
||||||
decoration: BoxDecoration(
|
height: 80,
|
||||||
color: AppColors.primary.withOpacity(0.1),
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(20),
|
color: _orange.withOpacity(0.1),
|
||||||
),
|
borderRadius: BorderRadius.circular(20),
|
||||||
child: const Icon(
|
),
|
||||||
Icons.eco,
|
child: const Icon(
|
||||||
size: 48,
|
Icons.eco,
|
||||||
color: AppColors.primary,
|
size: 48,
|
||||||
|
color: _orange,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
@ -134,17 +143,18 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 28,
|
fontSize: 28,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
|
color: _darkText,
|
||||||
),
|
),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
|
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
|
|
||||||
Text(
|
const Text(
|
||||||
'登录您的榴莲挖矿账户',
|
'登录您的榴莲生态账户',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
color: Colors.grey[600],
|
color: _grayText,
|
||||||
),
|
),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
|
|
@ -152,59 +162,66 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
const SizedBox(height: 48),
|
const SizedBox(height: 48),
|
||||||
|
|
||||||
// 登录方式切换
|
// 登录方式切换
|
||||||
Row(
|
Container(
|
||||||
children: [
|
decoration: const BoxDecoration(
|
||||||
Expanded(
|
border: Border(
|
||||||
child: GestureDetector(
|
bottom: BorderSide(color: _borderGray, width: 1),
|
||||||
onTap: () => setState(() => _isPasswordLogin = true),
|
),
|
||||||
child: Container(
|
),
|
||||||
padding: const EdgeInsets.symmetric(vertical: 12),
|
child: Row(
|
||||||
decoration: BoxDecoration(
|
children: [
|
||||||
border: Border(
|
Expanded(
|
||||||
bottom: BorderSide(
|
child: GestureDetector(
|
||||||
color: _isPasswordLogin ? AppColors.primary : Colors.transparent,
|
onTap: () => setState(() => _isPasswordLogin = true),
|
||||||
width: 2,
|
child: Container(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border(
|
||||||
|
bottom: BorderSide(
|
||||||
|
color: _isPasswordLogin ? _orange : Colors.transparent,
|
||||||
|
width: 2,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
child: Text(
|
||||||
child: Text(
|
'密码登录',
|
||||||
'密码登录',
|
textAlign: TextAlign.center,
|
||||||
textAlign: TextAlign.center,
|
style: TextStyle(
|
||||||
style: TextStyle(
|
fontSize: 16,
|
||||||
fontSize: 16,
|
fontWeight: _isPasswordLogin ? FontWeight.bold : FontWeight.normal,
|
||||||
fontWeight: _isPasswordLogin ? FontWeight.bold : FontWeight.normal,
|
color: _isPasswordLogin ? _orange : _lightGray,
|
||||||
color: _isPasswordLogin ? AppColors.primary : Colors.grey,
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
Expanded(
|
||||||
Expanded(
|
child: GestureDetector(
|
||||||
child: GestureDetector(
|
onTap: () => setState(() => _isPasswordLogin = false),
|
||||||
onTap: () => setState(() => _isPasswordLogin = false),
|
child: Container(
|
||||||
child: Container(
|
padding: const EdgeInsets.symmetric(vertical: 12),
|
||||||
padding: const EdgeInsets.symmetric(vertical: 12),
|
decoration: BoxDecoration(
|
||||||
decoration: BoxDecoration(
|
border: Border(
|
||||||
border: Border(
|
bottom: BorderSide(
|
||||||
bottom: BorderSide(
|
color: !_isPasswordLogin ? _orange : Colors.transparent,
|
||||||
color: !_isPasswordLogin ? AppColors.primary : Colors.transparent,
|
width: 2,
|
||||||
width: 2,
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
child: Text(
|
||||||
child: Text(
|
'验证码登录',
|
||||||
'验证码登录',
|
textAlign: TextAlign.center,
|
||||||
textAlign: TextAlign.center,
|
style: TextStyle(
|
||||||
style: TextStyle(
|
fontSize: 16,
|
||||||
fontSize: 16,
|
fontWeight: !_isPasswordLogin ? FontWeight.bold : FontWeight.normal,
|
||||||
fontWeight: !_isPasswordLogin ? FontWeight.bold : FontWeight.normal,
|
color: !_isPasswordLogin ? _orange : _lightGray,
|
||||||
color: !_isPasswordLogin ? AppColors.primary : Colors.grey,
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
],
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
const SizedBox(height: 24),
|
const SizedBox(height: 24),
|
||||||
|
|
@ -213,12 +230,25 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
TextFormField(
|
TextFormField(
|
||||||
controller: _phoneController,
|
controller: _phoneController,
|
||||||
keyboardType: TextInputType.phone,
|
keyboardType: TextInputType.phone,
|
||||||
|
style: const TextStyle(color: _darkText),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: '手机号',
|
labelText: '手机号',
|
||||||
prefixIcon: const Icon(Icons.phone),
|
labelStyle: const TextStyle(color: _grayText),
|
||||||
|
prefixIcon: const Icon(Icons.phone_outlined, color: _grayText),
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
),
|
),
|
||||||
|
enabledBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
|
),
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _orange, width: 2),
|
||||||
|
),
|
||||||
|
filled: true,
|
||||||
|
fillColor: Colors.white,
|
||||||
),
|
),
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
|
|
@ -238,18 +268,32 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
TextFormField(
|
TextFormField(
|
||||||
controller: _passwordController,
|
controller: _passwordController,
|
||||||
obscureText: _obscurePassword,
|
obscureText: _obscurePassword,
|
||||||
|
style: const TextStyle(color: _darkText),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: '密码',
|
labelText: '密码',
|
||||||
prefixIcon: const Icon(Icons.lock),
|
labelStyle: const TextStyle(color: _grayText),
|
||||||
|
prefixIcon: const Icon(Icons.lock_outline, color: _grayText),
|
||||||
suffixIcon: IconButton(
|
suffixIcon: IconButton(
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
_obscurePassword ? Icons.visibility_off : Icons.visibility,
|
_obscurePassword ? Icons.visibility_off_outlined : Icons.visibility_outlined,
|
||||||
|
color: _grayText,
|
||||||
),
|
),
|
||||||
onPressed: () => setState(() => _obscurePassword = !_obscurePassword),
|
onPressed: () => setState(() => _obscurePassword = !_obscurePassword),
|
||||||
),
|
),
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
),
|
),
|
||||||
|
enabledBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
|
),
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _orange, width: 2),
|
||||||
|
),
|
||||||
|
filled: true,
|
||||||
|
fillColor: Colors.white,
|
||||||
),
|
),
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
|
|
@ -266,13 +310,26 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
controller: _smsCodeController,
|
controller: _smsCodeController,
|
||||||
keyboardType: TextInputType.number,
|
keyboardType: TextInputType.number,
|
||||||
maxLength: 6,
|
maxLength: 6,
|
||||||
|
style: const TextStyle(color: _darkText),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: '验证码',
|
labelText: '验证码',
|
||||||
prefixIcon: const Icon(Icons.sms),
|
labelStyle: const TextStyle(color: _grayText),
|
||||||
|
prefixIcon: const Icon(Icons.sms_outlined, color: _grayText),
|
||||||
counterText: '',
|
counterText: '',
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
),
|
),
|
||||||
|
enabledBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
|
),
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _orange, width: 2),
|
||||||
|
),
|
||||||
|
filled: true,
|
||||||
|
fillColor: Colors.white,
|
||||||
),
|
),
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
|
|
@ -292,13 +349,16 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
child: ElevatedButton(
|
child: ElevatedButton(
|
||||||
onPressed: _countDown > 0 ? null : _sendSmsCode,
|
onPressed: _countDown > 0 ? null : _sendSmsCode,
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
|
backgroundColor: _countDown > 0 ? _bgGray : _orange.withOpacity(0.1),
|
||||||
|
foregroundColor: _countDown > 0 ? _lightGray : _orange,
|
||||||
|
elevation: 0,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
_countDown > 0 ? '${_countDown}s' : '获取验证码',
|
_countDown > 0 ? '${_countDown}s' : '获取验证码',
|
||||||
style: const TextStyle(fontSize: 14),
|
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -313,7 +373,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
child: ElevatedButton(
|
child: ElevatedButton(
|
||||||
onPressed: userState.isLoading ? null : _login,
|
onPressed: userState.isLoading ? null : _login,
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
backgroundColor: AppColors.primary,
|
backgroundColor: _orange,
|
||||||
|
disabledBackgroundColor: _orange.withOpacity(0.5),
|
||||||
|
elevation: 0,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
),
|
),
|
||||||
|
|
@ -346,9 +408,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
alignment: Alignment.centerRight,
|
alignment: Alignment.centerRight,
|
||||||
child: TextButton(
|
child: TextButton(
|
||||||
onPressed: () => context.push(Routes.forgotPassword),
|
onPressed: () => context.push(Routes.forgotPassword),
|
||||||
child: Text(
|
child: const Text(
|
||||||
'忘记密码?',
|
'忘记密码?',
|
||||||
style: TextStyle(color: Colors.grey[600]),
|
style: TextStyle(color: _grayText),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -359,13 +421,19 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
const Text(
|
||||||
'还没有账号?',
|
'还没有账号?',
|
||||||
style: TextStyle(color: Colors.grey[600]),
|
style: TextStyle(color: _grayText),
|
||||||
),
|
),
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () => context.push(Routes.register),
|
onPressed: () => context.push(Routes.register),
|
||||||
child: const Text('立即注册'),
|
child: const Text(
|
||||||
|
'立即注册',
|
||||||
|
style: TextStyle(
|
||||||
|
color: _orange,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import '../../../core/router/routes.dart';
|
import '../../../core/router/routes.dart';
|
||||||
import '../../../core/constants/app_colors.dart';
|
|
||||||
import '../../providers/user_providers.dart';
|
import '../../providers/user_providers.dart';
|
||||||
|
|
||||||
class RegisterPage extends ConsumerStatefulWidget {
|
class RegisterPage extends ConsumerStatefulWidget {
|
||||||
|
|
@ -13,6 +12,14 @@ class RegisterPage extends ConsumerStatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _RegisterPageState extends ConsumerState<RegisterPage> {
|
class _RegisterPageState extends ConsumerState<RegisterPage> {
|
||||||
|
// 设计色彩 - 与导航页面统一
|
||||||
|
static const Color _orange = Color(0xFFFF6B00);
|
||||||
|
static const Color _darkText = Color(0xFF1F2937);
|
||||||
|
static const Color _grayText = Color(0xFF6B7280);
|
||||||
|
static const Color _lightGray = Color(0xFF9CA3AF);
|
||||||
|
static const Color _bgGray = Color(0xFFF3F4F6);
|
||||||
|
static const Color _borderGray = Color(0xFFE5E7EB);
|
||||||
|
|
||||||
final _formKey = GlobalKey<FormState>();
|
final _formKey = GlobalKey<FormState>();
|
||||||
final _phoneController = TextEditingController();
|
final _phoneController = TextEditingController();
|
||||||
final _passwordController = TextEditingController();
|
final _passwordController = TextEditingController();
|
||||||
|
|
@ -100,7 +107,7 @@ class _RegisterPageState extends ConsumerState<RegisterPage> {
|
||||||
backgroundColor: Colors.transparent,
|
backgroundColor: Colors.transparent,
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: const Icon(Icons.arrow_back, color: Colors.black),
|
icon: const Icon(Icons.arrow_back_ios, color: _darkText),
|
||||||
onPressed: () => context.pop(),
|
onPressed: () => context.pop(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -117,16 +124,17 @@ class _RegisterPageState extends ConsumerState<RegisterPage> {
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 28,
|
fontSize: 28,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
|
color: _darkText,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
|
|
||||||
Text(
|
const Text(
|
||||||
'加入榴莲挖矿,开启绿色财富之旅',
|
'加入榴莲生态,开启绿色财富之旅',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
color: Colors.grey[600],
|
color: _grayText,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
@ -136,12 +144,25 @@ class _RegisterPageState extends ConsumerState<RegisterPage> {
|
||||||
TextFormField(
|
TextFormField(
|
||||||
controller: _phoneController,
|
controller: _phoneController,
|
||||||
keyboardType: TextInputType.phone,
|
keyboardType: TextInputType.phone,
|
||||||
|
style: const TextStyle(color: _darkText),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: '手机号',
|
labelText: '手机号',
|
||||||
prefixIcon: const Icon(Icons.phone),
|
labelStyle: const TextStyle(color: _grayText),
|
||||||
|
prefixIcon: const Icon(Icons.phone_outlined, color: _grayText),
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
),
|
),
|
||||||
|
enabledBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
|
),
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _orange, width: 2),
|
||||||
|
),
|
||||||
|
filled: true,
|
||||||
|
fillColor: Colors.white,
|
||||||
),
|
),
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
|
|
@ -164,13 +185,26 @@ class _RegisterPageState extends ConsumerState<RegisterPage> {
|
||||||
controller: _smsCodeController,
|
controller: _smsCodeController,
|
||||||
keyboardType: TextInputType.number,
|
keyboardType: TextInputType.number,
|
||||||
maxLength: 6,
|
maxLength: 6,
|
||||||
|
style: const TextStyle(color: _darkText),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: '验证码',
|
labelText: '验证码',
|
||||||
prefixIcon: const Icon(Icons.sms),
|
labelStyle: const TextStyle(color: _grayText),
|
||||||
|
prefixIcon: const Icon(Icons.sms_outlined, color: _grayText),
|
||||||
counterText: '',
|
counterText: '',
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
),
|
),
|
||||||
|
enabledBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
|
),
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _orange, width: 2),
|
||||||
|
),
|
||||||
|
filled: true,
|
||||||
|
fillColor: Colors.white,
|
||||||
),
|
),
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
|
|
@ -190,13 +224,16 @@ class _RegisterPageState extends ConsumerState<RegisterPage> {
|
||||||
child: ElevatedButton(
|
child: ElevatedButton(
|
||||||
onPressed: _countDown > 0 ? null : _sendSmsCode,
|
onPressed: _countDown > 0 ? null : _sendSmsCode,
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
|
backgroundColor: _countDown > 0 ? _bgGray : _orange.withOpacity(0.1),
|
||||||
|
foregroundColor: _countDown > 0 ? _lightGray : _orange,
|
||||||
|
elevation: 0,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
_countDown > 0 ? '${_countDown}s' : '获取验证码',
|
_countDown > 0 ? '${_countDown}s' : '获取验证码',
|
||||||
style: const TextStyle(fontSize: 14),
|
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -209,18 +246,32 @@ class _RegisterPageState extends ConsumerState<RegisterPage> {
|
||||||
TextFormField(
|
TextFormField(
|
||||||
controller: _passwordController,
|
controller: _passwordController,
|
||||||
obscureText: _obscurePassword,
|
obscureText: _obscurePassword,
|
||||||
|
style: const TextStyle(color: _darkText),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: '密码',
|
labelText: '密码',
|
||||||
prefixIcon: const Icon(Icons.lock),
|
labelStyle: const TextStyle(color: _grayText),
|
||||||
|
prefixIcon: const Icon(Icons.lock_outline, color: _grayText),
|
||||||
suffixIcon: IconButton(
|
suffixIcon: IconButton(
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
_obscurePassword ? Icons.visibility_off : Icons.visibility,
|
_obscurePassword ? Icons.visibility_off_outlined : Icons.visibility_outlined,
|
||||||
|
color: _grayText,
|
||||||
),
|
),
|
||||||
onPressed: () => setState(() => _obscurePassword = !_obscurePassword),
|
onPressed: () => setState(() => _obscurePassword = !_obscurePassword),
|
||||||
),
|
),
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
),
|
),
|
||||||
|
enabledBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
|
),
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _orange, width: 2),
|
||||||
|
),
|
||||||
|
filled: true,
|
||||||
|
fillColor: Colors.white,
|
||||||
),
|
),
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
|
|
@ -239,18 +290,32 @@ class _RegisterPageState extends ConsumerState<RegisterPage> {
|
||||||
TextFormField(
|
TextFormField(
|
||||||
controller: _confirmPasswordController,
|
controller: _confirmPasswordController,
|
||||||
obscureText: _obscureConfirmPassword,
|
obscureText: _obscureConfirmPassword,
|
||||||
|
style: const TextStyle(color: _darkText),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: '确认密码',
|
labelText: '确认密码',
|
||||||
prefixIcon: const Icon(Icons.lock_outline),
|
labelStyle: const TextStyle(color: _grayText),
|
||||||
|
prefixIcon: const Icon(Icons.lock_outline, color: _grayText),
|
||||||
suffixIcon: IconButton(
|
suffixIcon: IconButton(
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
_obscureConfirmPassword ? Icons.visibility_off : Icons.visibility,
|
_obscureConfirmPassword ? Icons.visibility_off_outlined : Icons.visibility_outlined,
|
||||||
|
color: _grayText,
|
||||||
),
|
),
|
||||||
onPressed: () => setState(() => _obscureConfirmPassword = !_obscureConfirmPassword),
|
onPressed: () => setState(() => _obscureConfirmPassword = !_obscureConfirmPassword),
|
||||||
),
|
),
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
),
|
),
|
||||||
|
enabledBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _borderGray),
|
||||||
|
),
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
borderSide: const BorderSide(color: _orange, width: 2),
|
||||||
|
),
|
||||||
|
filled: true,
|
||||||
|
fillColor: Colors.white,
|
||||||
),
|
),
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
|
|
@ -271,7 +336,9 @@ class _RegisterPageState extends ConsumerState<RegisterPage> {
|
||||||
child: ElevatedButton(
|
child: ElevatedButton(
|
||||||
onPressed: userState.isLoading ? null : _register,
|
onPressed: userState.isLoading ? null : _register,
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
backgroundColor: AppColors.primary,
|
backgroundColor: _orange,
|
||||||
|
disabledBackgroundColor: _orange.withOpacity(0.5),
|
||||||
|
elevation: 0,
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
),
|
),
|
||||||
|
|
@ -302,13 +369,19 @@ class _RegisterPageState extends ConsumerState<RegisterPage> {
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
const Text(
|
||||||
'已有账号?',
|
'已有账号?',
|
||||||
style: TextStyle(color: Colors.grey[600]),
|
style: TextStyle(color: _grayText),
|
||||||
),
|
),
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () => context.pop(),
|
onPressed: () => context.pop(),
|
||||||
child: const Text('立即登录'),
|
child: const Text(
|
||||||
|
'立即登录',
|
||||||
|
style: TextStyle(
|
||||||
|
color: _orange,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ class ContributionPage extends ConsumerWidget {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
backgroundColor: const Color(0xFFF5F5F5),
|
backgroundColor: const Color(0xFFF5F5F5),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
|
bottom: false,
|
||||||
child: RefreshIndicator(
|
child: RefreshIndicator(
|
||||||
onRefresh: () async {
|
onRefresh: () async {
|
||||||
ref.invalidate(contributionProvider(accountSequence));
|
ref.invalidate(contributionProvider(accountSequence));
|
||||||
|
|
@ -67,7 +68,7 @@ class ContributionPage extends ConsumerWidget {
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
// 贡献值失效倒计时
|
// 贡献值失效倒计时
|
||||||
_buildExpirationCard(contribution, recordsAsync),
|
_buildExpirationCard(contribution, recordsAsync),
|
||||||
const SizedBox(height: 24),
|
const SizedBox(height: 100),
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ class ProfilePage extends ConsumerWidget {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
backgroundColor: _bgGray,
|
backgroundColor: _bgGray,
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
|
bottom: false,
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
|
|
@ -76,7 +77,7 @@ class ProfilePage extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
const SizedBox(height: 32),
|
const SizedBox(height: 100),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ class _TradingPageState extends ConsumerState<TradingPage> {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
backgroundColor: const Color(0xFFF5F5F5),
|
backgroundColor: const Color(0xFFF5F5F5),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
|
bottom: false,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
// 顶部导航栏
|
// 顶部导航栏
|
||||||
|
|
@ -73,7 +74,7 @@ class _TradingPageState extends ConsumerState<TradingPage> {
|
||||||
_buildTradingPanel(accountSequence),
|
_buildTradingPanel(accountSequence),
|
||||||
// 我的挂单
|
// 我的挂单
|
||||||
_buildMyOrdersCard(),
|
_buildMyOrdersCard(),
|
||||||
const SizedBox(height: 24),
|
const SizedBox(height: 100),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue