diff --git a/lib/app.dart b/lib/app.dart index d6e887f..7302a7f 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:starwork_flutter/flavors.dart'; @@ -17,6 +18,22 @@ class App extends StatelessWidget { splitScreenMode: true, builder: (_, child) { return GetMaterialApp( + theme: ThemeData( + textSelectionTheme: TextSelectionThemeData( + cursorColor: Colors.blue.shade200, + selectionColor: Colors.blue.shade100, + selectionHandleColor: Colors.blue.shade300, + ) + ), + // 必须配置以下三个本地化代理 + localizationsDelegates: const [ + GlobalMaterialLocalizations.delegate, // 提供Material组件本地化字符串 + GlobalWidgetsLocalizations.delegate, // 定义默认文本方向 + GlobalCupertinoLocalizations.delegate, // 提供Cupertino组件本地化 + ], + supportedLocales: const [ + Locale('zh', 'CN'), // ✅ 正确:简体中文 + ], enableLog: true, title: F.title, translations: AppI18n(), @@ -26,7 +43,6 @@ class App extends StatelessWidget { // 必须设置 fallback 没有该语言时使用 getPages: AppPages.pages, initialRoute: AppRoutes.login, - // 默认首页 debugShowCheckedModeBanner: false, ); }, diff --git a/lib/base/base_controller.dart b/lib/base/base_controller.dart index 01c7b5d..2b6bb90 100644 --- a/lib/base/base_controller.dart +++ b/lib/base/base_controller.dart @@ -1,5 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:get/get.dart'; -class BaseController extends GetxController{ - -} \ No newline at end of file +class BaseController extends GetxController { + void showToast(String message) { + Fluttertoast.showToast( + msg: message, + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + backgroundColor: Colors.black54, + textColor: Colors.white, + fontSize: 14.0.sp, + ); + } +} diff --git a/lib/views/login/login_controller.dart b/lib/views/login/login_controller.dart index e4029ec..bd64029 100644 --- a/lib/views/login/login_controller.dart +++ b/lib/views/login/login_controller.dart @@ -1,5 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:get/get.dart'; import 'package:starwork_flutter/base/base_controller.dart'; class LoginController extends BaseController { + int phoneNumberSize = 11; + TextEditingController phoneController = TextEditingController(); + final isFormValid = false.obs; + + @override + void onInit() { + super.onInit(); + // 监听输入变化 + phoneController.addListener(_validateForm); + } + + @override + void onClose() { + phoneController.removeListener(_validateForm); + phoneController.dispose(); + super.onClose(); + } + + void _validateForm() { + isFormValid.value = phoneController.text.length == phoneNumberSize; + debugPrint('isFormValid: ${isFormValid.value}'); + } + + // 获取手机验证码 + void requestPhoneCode() { + debugPrint("获取手机验证码"); + showToast("获取手机验证码"); + } } diff --git a/lib/views/login/login_view.dart b/lib/views/login/login_view.dart index f5177a5..7df27a5 100644 --- a/lib/views/login/login_view.dart +++ b/lib/views/login/login_view.dart @@ -16,7 +16,9 @@ class LoginView extends GetView { }, child: Scaffold( body: SafeArea( - child: _buildBody(), + child: SingleChildScrollView( + child: _buildBody(), + ), ), ), ); @@ -24,6 +26,7 @@ class LoginView extends GetView { Widget _buildBody() { return Container( + height: 1.sh, margin: EdgeInsets.symmetric(vertical: 48.h), padding: EdgeInsets.symmetric(horizontal: 32.w), child: Column( @@ -33,6 +36,10 @@ class LoginView extends GetView { height: 32.h, ), _buildPhoneInputAndLoginButton(), + SizedBox( + height: 32.h, + ), + _buildPrivacyPolicy(), ], ), ); @@ -68,30 +75,87 @@ class LoginView extends GetView { } _buildPhoneInputAndLoginButton() { - return Column( - children: [ - TextField( - keyboardType: TextInputType.phone, - maxLength: 11, - decoration: InputDecoration( - counterText: '', - hintText: '请输入手机号码'.tr, - border: const UnderlineInputBorder(), - // 获取焦点时的边框 - focusedBorder: const UnderlineInputBorder( - borderSide: BorderSide(color: Colors.blue), // 🔥 你想要的颜色 + return Obx( + () => Column( + children: [ + TextField( + controller: controller.phoneController, + keyboardType: TextInputType.phone, + textInputAction: TextInputAction.done, + maxLength: controller.phoneNumberSize, + decoration: InputDecoration( + counterText: '', + hintText: '请输入手机号码'.tr, + border: const UnderlineInputBorder(), + // 获取焦点时的边框 + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: controller.isFormValid.value + ? Colors.blue + : Colors.blue.withOpacity(0.5), + ), // + // 🔥 你想要的颜色 + ), ), ), - ), - ElevatedButton( - onPressed: () {}, - style: ButtonStyle( + SizedBox( + height: 24.h, + ), + ElevatedButton( + onPressed: controller.isFormValid.value + ? controller.requestPhoneCode + : null, + style: ButtonStyle( + minimumSize: + MaterialStateProperty.all(Size(double.infinity, 44.h)), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.r), + ), + ), + backgroundColor: MaterialStateProperty.all( + controller.isFormValid.value + ? Colors.blue + : Colors.blue.withOpacity(0.5), + ), + ), + child: Text( + '获取验证码'.tr, + style: TextStyle( + fontSize: 16.sp, + fontWeight: FontWeight.w500, + color: Colors.white, + ), + ), + ), + SizedBox( + height: 22.h, + ), + TextButton( + onPressed: () {}, + child: Text( + '密码登录'.tr, + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w500, + color: Colors.grey, + ), + ), + ) + ], + ), + ); + } - ), - child: Text( - '获取验证码'.tr, - ), - ) + _buildPrivacyPolicy() { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Radio( + value: '1', + groupValue: 1, + onChanged: (value) {}, + ), ], ); } diff --git a/pubspec.lock b/pubspec.lock index 70ecc5c..87c23d5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -126,6 +126,11 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.0.2" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" flutter_screenutil: dependency: "direct main" description: @@ -144,6 +149,14 @@ packages: description: flutter source: sdk version: "0.0.0" + fluttertoast: + dependency: "direct main" + description: + name: fluttertoast + sha256: "95f349437aeebe524ef7d6c9bde3e6b4772717cf46a0eb6a3ceaddc740b297cc" + url: "https://pub.flutter-io.cn" + source: hosted + version: "8.2.8" get: dependency: "direct main" description: @@ -160,6 +173,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.5.4" + intl: + dependency: transitive + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.18.1" io: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 3676334..a55ec06 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,6 +12,9 @@ environment: dependencies: flutter: sdk: flutter + # 本地化支持 + flutter_localizations: + sdk: flutter # 脚手架 get: ^4.7.2 # 权限申请 @@ -22,6 +25,8 @@ dependencies: shared_preferences: ^2.2.3 # 屏幕适配 flutter_screenutil: ^5.9.3 + # 提示 + fluttertoast: ^8.2.8 dev_dependencies: