login_view.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import 'package:flutter/gestures.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:get/get.dart';
  5. import 'package:nomo/app/base/base_view.dart';
  6. import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
  7. import '../../../../config/translations/strings_enum.dart';
  8. import '../../../routes/app_pages.dart';
  9. import '../../../widgets/ix_app_bar.dart';
  10. import '../../../widgets/ix_text_field.dart';
  11. import '../../../widgets/submit_btn.dart';
  12. import '../controllers/login_controller.dart';
  13. class LoginView extends BaseView<LoginController> {
  14. const LoginView({super.key});
  15. @override
  16. PreferredSizeWidget? get appBar => IXAppBar(title: '');
  17. @override
  18. Widget buildContent(BuildContext context) {
  19. return SafeArea(
  20. child: Padding(
  21. padding: EdgeInsets.symmetric(horizontal: 14.w),
  22. child: SingleChildScrollView(
  23. child: Column(
  24. crossAxisAlignment: CrossAxisAlignment.start,
  25. children: [
  26. 10.verticalSpaceFromWidth,
  27. // 标题
  28. Text(
  29. Strings.login.tr,
  30. style: TextStyle(
  31. fontSize: 28.sp,
  32. height: 1.2,
  33. color: Get.reactiveTheme.textTheme.bodyLarge!.color,
  34. ),
  35. ),
  36. 24.verticalSpaceFromWidth,
  37. // 描述文字
  38. Text(
  39. Strings.loginDescription.tr,
  40. style: TextStyle(
  41. fontSize: 16.sp,
  42. color: Get.reactiveTheme.hintColor,
  43. height: 1.4,
  44. ),
  45. ),
  46. 20.verticalSpaceFromWidth,
  47. IXTextField(
  48. hintText: Strings.username.tr,
  49. prefixIcon: Icons.person_outline,
  50. controller: controller.usernameController,
  51. focusNode: controller.usernameFocusNode,
  52. validator: controller.validatorInputValue,
  53. tipText: Strings.usernamePasswordRule.tr,
  54. errorText: Strings.usernamePasswordRule.tr,
  55. onChanged: (value) {
  56. controller.checkLogin();
  57. },
  58. ),
  59. 16.verticalSpaceFromWidth,
  60. IXTextField(
  61. hintText: Strings.password.tr,
  62. prefixIcon: Icons.lock_outline,
  63. controller: controller.passwordController,
  64. focusNode: controller.passwordFocusNode,
  65. validator: controller.validatorInputValue,
  66. isPassword: true,
  67. tipText: Strings.usernamePasswordRule.tr,
  68. errorText: Strings.usernamePasswordRule.tr,
  69. onChanged: (value) {
  70. controller.checkLogin();
  71. },
  72. ),
  73. 156.verticalSpaceFromWidth,
  74. SubmitButton(
  75. text: Strings.loginButton.tr,
  76. enabled: controller.isLogin,
  77. onPressed: () {},
  78. ),
  79. 10.verticalSpaceFromWidth,
  80. // 底部注册链接
  81. Center(
  82. child: RichText(
  83. text: TextSpan(
  84. children: [
  85. TextSpan(
  86. text: Strings.noAccount.tr,
  87. style: TextStyle(
  88. color: Colors.grey[500],
  89. fontSize: 14.sp,
  90. ),
  91. ),
  92. TextSpan(
  93. text: Strings.registerNow.tr,
  94. recognizer: TapGestureRecognizer()
  95. ..onTap = () {
  96. Get.toNamed(Routes.SIGNUP);
  97. },
  98. style: TextStyle(
  99. color: Get.reactiveTheme.primaryColor,
  100. fontSize: 14.sp,
  101. fontWeight: FontWeight.w400,
  102. ),
  103. ),
  104. ],
  105. ),
  106. ),
  107. ),
  108. ],
  109. ),
  110. ),
  111. ),
  112. );
  113. }
  114. }