login_view.dart 4.2 KB

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