[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-9331":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":34,"readmeContent":35,"aiSummary":36,"trendingCount":16,"starSnapshotCount":16,"syncStatus":18,"lastSyncTime":37,"discoverSource":38},9331,"flutter_login","NearHuscarl\u002Fflutter_login","NearHuscarl","Provides login screen with login\u002Fsignup functionalities to help speed up development","",null,"Dart",1592,814,28,102,0,1,2,3,21.73,"MIT License",false,"master",true,[26,27,28,29,30,31,32,33],"android","animation","dart","flutter","flutter-package","flutter-widget","login","material","2026-06-12 02:02:06","# Flutter Login\n[![pub package](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fv\u002Fflutter_login?include_prereleases)](https:\u002F\u002Fpub.dartlang.org\u002Fpackages\u002Fflutter_login)\n[![Join the chat](https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F817442412313051220)](https:\u002F\u002Fdiscord.gg\u002FkP7jXHeNtS)\n[![Workflow](https:\u002F\u002Fgithub.com\u002FNearHuscarl\u002Fflutter_login\u002Factions\u002Fworkflows\u002Ftest.yml\u002Fbadge.svg?branch=master)](https:\u002F\u002Fgithub.com\u002FNearHuscarl\u002Fflutter_login\u002Factions)\n\n`FlutterLogin` is a ready-made login\u002Fsignup widget with many animation effects to\ndemonstrate the capabilities of Flutter\n\n\u003Cp align=\"center\">\n  \u003Ca href='https:\u002F\u002Fi.imgur.com\u002Fz3FJSe7.mp4'>\n    \u003Cimg src='https:\u002F\u002Fgithub.com\u002FNearHuscarl\u002Fflutter_login\u002Fraw\u002Fmaster\u002Fdemo\u002Fdemo.gif' width=320>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n## Installation\n\nFollow the install instructions [here](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fflutter_login#-installing-tab-)\n\n## Reference\n\n| Property                              | Type                                    | Description                                                                                                                                                                                                                                            |\n|---------------------------------------|-----------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| onSignup                              | `AuthCallback`                          | \u003Csub>Called when the user hit the submit button when in sign up mode. It receives a `SignupData` object, with name, password and, if `additionalSignUpFields` is not null, the additional fields filled in by the user in a `Map\u003CString,String>`\u003C\u002Fsub> |\n| onConfirmSignup                       | `ConfirmSignupCallback`                 | \u003Csub>Called when the user hits the submit button when confirming signup. If not specified, signup will not be confirmed by user.\u003C\u002Fsub>                                                                                                                 |\n| confirmSignupRequired                 | `ConfirmSignupRequiredCallback`         | \u003Csub>Additional option to decide in runtime if confirmation is required. If not specified, signup will be confirmed by user if onConfirmSignup is specified.\u003C\u002Fsub>                                                                                     |\n| confirmSignupKeyboardType             | `TextInputType`                         | \u003Csub>The keyboard type of the confirm signup field\u003C\u002Fsub>                                                                                                                                                                                               |\n| onResendCode                          | `AuthCallback`                          | \u003Csub>Called when the user hits the resend code button when confirming signup. Only required when onConfirmSignup is provided.\u003C\u002Fsub>                                                                                                                    |\n| onLogin                               | `AuthCallback`                          | \u003Csub>Called when the user hit the submit button when in login mode\u003C\u002Fsub>                                                                                                                                                                               |\n| onRecoverPassword                     | `RecoverCallback`                       | \u003Csub>Called when the user hit the submit button when in recover password mode\u003C\u002Fsub>                                                                                                                                                                    |\n| onConfirmRecover                      | `ConfirmRecoverCallback`                | \u003Csub>Called when the user submits confirmation code and sets password in recover password mode. If not specified, a confirmation code will not be used to recover password.\u003C\u002Fsub>                                                                      |\n| title                                 | `String`                                | \u003Csub>The large text above the login [Card], usually the app or company name. Leave the string empty or null if you want no title.\u003C\u002Fsub>                                                                                                                |\n| logo                                  | `ImageProvider or String`               | \u003Csub>The image provider or asset path string for the logo image to be displayed\u003C\u002Fsub>                                                                                                                                                                  |\n| messages                              | [`LoginMessages`](#LoginMessages)       | \u003Csub>Describes all of the labels, text hints, button texts and other auth descriptions\u003C\u002Fsub>                                                                                                                                                           |\n| theme                                 | [`LoginTheme`](#LoginTheme)             | \u003Csub>FlutterLogin's theme. If not specified, it will use the default theme as shown in the demo gifs and use the colorsheme in the closest `Theme` widget\u003C\u002Fsub>                                                                                        |\n| userType                              | [`LoginUserType`](#LoginUserType)       | \u003Csub>FlutterLogin's user type. If not specified, it will use the default user type as email\u003C\u002Fsub>                                                                                                                                                      |\n| userValidator                         | \u003Csub>`FormFieldValidator\u003CString>`\u003C\u002Fsub> | \u003Csub>User field validating logic, add your custom validation here. The default is email validation logic. Expects to return an error message [String] to be display if validation fails or [null] if validation succeeds\u003C\u002Fsub>                         |\n| validateUserImmediately               | \u003Csub>`bool`\u003C\u002Fsub>                       | \u003Csub>Should email be validated after losing focus [true] or after form submissions [false]. Default: [false]\u003C\u002Fsub>                                                                                                                                     |\n| passwordValidator                     | \u003Csub>`FormFieldValidator\u003CString>`\u003C\u002Fsub> | \u003Csub>Same as `userValidator` but for password\u003C\u002Fsub>                                                                                                                                                                                                    |\n| \u003Csub>onSubmitAnimationCompleted\u003C\u002Fsub> | `Function`                              | \u003Csub>Called after the submit animation's completed. Put your route transition logic here\u003C\u002Fsub>                                                                                                                                                         |\n| logoTag                               | `String`                                | \u003Csub>`Hero` tag for logo image. If not specified, it will simply fade out when changing route\u003C\u002Fsub>                                                                                                                                                    |\n| titleTag                              | `String`                                | \u003Csub>`Hero` tag for title text. Need to specify `LoginTheme.beforeHeroFontSize` and `LoginTheme.afterHeroFontSize` if you want different font size before and after hero animation\u003C\u002Fsub>                                                               |\n| showDebugButtons                      | `bool`                                  | \u003Csub>Display the debug buttons to quickly forward\u002Freverse login animations. In release mode, this will be overridden to `false` regardless of the value passed in\u003C\u002Fsub>                                                                                |\n| hideForgotPasswordButton              | `bool`                                  | \u003Csub>Hides the Forgot Password button if set to true\u003C\u002Fsub>                                                                                                                                                                                             |\n| hideProvidersTitle                    | `bool`                                  | \u003Csub>Hides the title above login providers if set to true. In case the providers List is empty this is uneffective, as the title is hidden anyways. The default is `false`\u003C\u002Fsub>                                                                       |\n| disableCustomPageTransformer          | `bool`                                  | \u003Csub>Disables the custom transition which causes RenderBox was not laid out error. See [#97](https:\u002F\u002Fgithub.com\u002FNearHuscarl\u002Fflutter_login\u002Fissues\u002F97) for more info.\u003C\u002Fsub>                                                                              |\n| additionalSignUpFields                | `Map\u003CString, UserFormField>`            | \u003Csub> Used to specify the additional form fields; the form is shown right after signin up. You can provide at most 6 additional fields. \u003C\u002Fsub>                                                                                                         |\n| onSwitchToAdditionalFields            | `AdditionalFieldsCallback`              | \u003Csub>Called when the user switches to additional fields.\u003C\u002Fsub>                                                                                                                                                                                         |\n| navigateBackAfterRecovery             | `bool`                                  | \u003Csub>Navigate back to the login page after successful recovery.\u003C\u002Fsub>                                                                                                                                                                                  |\n| savedEmail                            | `String`                                | \u003Csub>Prefilled value for user field (ie. saved from previous session via other means, ie. via SharedPreferences)\u003C\u002Fsub>                                                                                                                                 |\n| savedPassword                         | `String`                                | \u003Csub>Prefilled value for password field (ie. saved from previous session via other means, ie. via SharedPreferences). Will set also confirmation password in Auth class\u003C\u002Fsub>                                                                          |\n| termsOfService                        | [`TermOfService`](#TermOfService)       | \u003Csub>List of terms of service to be listed during registration. On onSignup callback LoginData contains a list of [`TermOfServiceResult`](#TermOfServiceResult) \u003C\u002Fsub>                                                                                 |\n| children                              | [`Widget`]                              | \u003Csub>List of widgets that can be added to the stack of the login screen. Can be used to show custom banners or logos. \u003C\u002Fsub>                                                                                                                           |\n| scrollable                            | `bool`                                  | \u003Csub>When set to true, the login card becomes scrollable instead of resizing when needed.                                                                                                                                                              |\n| headerWidget                          | `Widget`                                | \u003Csub>A widget that can be placed on top of the loginCard.\u003C\u002Fsub>                                                                                                                                                                                        |\n| autofocus                             | `bool`                                  | \u003Csub>Whether or not to automatically focus on the first field.\u003C\u002Fsub>                                                                                                                                                                                   |\n\n*NOTE:* It is recommended that the child widget of the `Hero` widget should be the\nsame in both places. For title's hero animation use the\n`LoginThemeHelper.loginTextStyle` in the next screen to get the style of the\nexact text widget in the login screen. `LoginThemeHelper` can be accessed by adding\nthis line\n\n```dart\nimport 'package:flutter_login\u002Ftheme.dart';\n```\n\n### LoginMessages\n\n| Property                        | Type     | Description                                                                                                                                    |\n|---------------------------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------|\n| userHint                        | `String` | Hint text of the user field [TextField] (Note: user field can be name, email or phone. For more info check: [`LoginUserType`](#LoginUserType)) |\n| passwordHint                    | `String` | Hint text of the password [TextField]                                                                                                          |\n| confirmPasswordHint             | `String` | Hint text of the confirm password [TextField]                                                                                                  |\n| forgotPasswordButton            | `String` | Forgot password button's label                                                                                                                 |\n| loginButton                     | `String` | Login button's label                                                                                                                           |\n| signupButton                    | `String` | Signup button's label                                                                                                                          |\n| recoverPasswordButton           | `String` | Recover password button's label                                                                                                                |\n| recoverPasswordIntro            | `String` | Intro in password recovery form                                                                                                                |\n| recoverPasswordDescription      | `String` | Description in password recovery form, shown when the onConfirmRecover callback is not provided                                                |\n| recoverCodePasswordDescription  | `String` | Description in password recovery form, shown when the onConfirmRecover callback is provided                                                    |\n| goBackButton                    | `String` | Go back button's label. Go back button is used to go back to to login\u002Fsignup form from the recover password form                               |\n| confirmPasswordError            | `String` | The error message to show when the confirm password not match with the original password                                                       |\n| recoverPasswordSuccess          | `String` | The success message to show after submitting recover password                                                                                  |\n| confirmSignupIntro              | `String` | The intro text for the confirm signup card                                                                                                     |\n| confirmationCodeHint            | `String` | Hint text of the confirmation code [TextField]                                                                                                 |\n| confirmationCodeValidationError | `String` | The error message to show if confirmation code is empty                                                                                        |\n| resendCodeButton                | `String` | Resend code button's label                                                                                                                     |\n| resendCodeSuccess               | `String` | The success message to show after resending a confirmation code                                                                                |\n| confirmSignupButton             | `String` | Confirm signup button's label                                                                                                                  |\n| confirmSignupSuccess            | `String` | The success message to show after confirming signup                                                                                            |\n| confirmRecoverIntro             | `String` | The intro text for the confirm recover password card                                                                                           |\n| recoveryCodeHint                | `String` | Hint text of the recovery code [TextField]                                                                                                     |\n| recoveryCodeValidationError     | `String` | The error message to show if recovery code is empty                                                                                            |\n| setPasswordButton               | `String` | Set password button's label for password recovery                                                                                              |\n| confirmRecoverSuccess           | `String` | The success message to show after confirming recovered password                                                                                |\n| flushbarTitleError              | `String` | The Flushbar title on errors                                                                                                                   |\n| flushbarTitleSuccess            | `String` | The Flushbar title on successes                                                                                                                |\n| providersTitle                  | `String` | A string shown above the login Providers, defaults to `or login with`                                                                          |\n\n### LoginTheme\n\n| Property                 | Type                   | Description                                                                                                       |\n|--------------------------|------------------------|-------------------------------------------------------------------------------------------------------------------|\n| primaryColor             | `Color`                | The background color of major parts of the widget like the login screen and buttons                               |\n| accentColor              | `Color`                | The secondary color, used for title text color, loading icon, etc. Should be contrast with the [primaryColor]     |\n| errorColor               | `Color`                | The color to use for [TextField] input validation errors                                                          |\n| cardTheme                | `CardTheme`            | The colors and styles used to render auth [Card]                                                                  |\n| inputTheme               | `InputDecorationTheme` | Defines the appearance of all [TextField]s                                                                        |\n| buttonTheme              | `LoginButtonTheme`     | A theme for customizing the shape, elevation, and color of the submit button                                      |\n| titleStyle               | `TextStyle`            | Text style for the big title                                                                                      |\n| bodyStyle                | `TextStyle`            | Text style for small text like the recover password description                                                   |\n| textFieldStyle           | `TextStyle`            | Text style for [TextField] input text                                                                             |\n| buttonStyle              | `TextStyle`            | Text style for button text                                                                                        |\n| beforeHeroFontSize       | `double`               | Defines the font size of the title in the login screen (before the hero transition)                               |\n| afterHeroFontSize        | `double`               | Defines the font size of the title in the screen after the login screen (after the hero transition)               |\n| pageColorLight           | `Color`                | The optional light background color of login screen; if provided, used for light gradient instead of primaryColor |\n| pageColorDark            | `Color`                | The optional dark background color of login screen; if provided, used for dark gradient instead of primaryColor   |\n| footerBottomPadding      | `double`               | The footer bottom Padding; defaults to 0 if not provided.                                                         |\n| switchAuthTextColor      | `Color`                | The optional color for the switch authentication text, if nothing is specified [primaryColor] is used.            |\n| logoWidth                | `double`               | Width of the logo where 1 is the full width of the login card. ; defaults to 0.75 if not provided.                |\n| primaryColorAsInputLabel | `bool`                 | Set to true if you want to use the primary color for input labels. Defaults to false.                             |\n\n### LoginUserType\n| Enum      | Description                                                        |\n|-----------|--------------------------------------------------------------------|\n| EMAIL     | The User Field will be set to be email                             |\n| NAME      | The User Field will be set to be username                          |\n| FIRSTNAME | The User Field will be set to be first name                        |\n| LASTNAME  | The User Field will be set to be last name                         |\n| PHONE     | The User Field will be set to be phone                             |\n| INTLPHONE | The User Field will be set to be phone with country code selection |\n| TEXT      | The User Field will be set to be text                              |\n\n[LoginUserType] will change how the user field [TextField] behaves. Autofills and Keyboard Type will be adjusted automatically for the type of user that you pass.\n\n### UserFormField\n| Property       | Type                         | Description                                                                                                                           |\n|----------------|------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|\n| keyName        | `String`                     | The identifier of the fields, it will be the key in the returned map. Please ensure this is unique, otherwise an Error will be thrown |\n| displayName    | `String`                     | The name of the field displayed on the form. Defaults to `keyName` if not given                                                       |\n| defaultValue   | `String`                     | The default value of the field, if given the field will be pre-filled in with this                                                    |\n| fieldValidator | `FormFieldValidator\u003CString>` | A function to validate the field. It should return null on success, or a string with the explanation of the error                     |\n| icon           | `Icon?`                      | The icon shown on the left of the field. Defaults to the user icon when not provided                                                  |\n| userType       | `LoginUserType`              | The LoginUserType of the form. The right keyboard and suggestions will be shown accordingly. Defaults to `LoginUserType.user`         |\n| tooltip        | `InlineSpan`                 | Additional description for that field                                                                                                 |\n\n### LoginProvider\n| Property                    | Type                           | Description                                                                                                                                                                                                                                                                                                                                          |\n|-----------------------------|--------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| button                      | `Widget`                       | Used for Buttons for [LoginProvider] - see example uses [SignInButton] package                                                                                                                                                                                                                                                                       |\n| icon                        | `IconData`                     | Icon that is used for a button for [LoginProvider]                                                                                                                                                                                                                                                                                                   |\n| label                       | `String`                       | The label shown under the provider                                                                                                                                                                                                                                                                                                                   |\n| callback                    | `ProviderAuthCallback`         | A Function called when the provider button is pressed. It must return null on success, or a `String` describing the error on failure.                                                                                                                                                                                                                |\n| providerNeedsSignUpCallback | `ProviderNeedsSignUpCallback?` | Optional. Requires that the `additionalSignUpFields` argument is passed to `FlutterLogin`. When given, this callback must return a `Future\u003Cbool>`. If it evaluates to `true` the card containing the additional signup fields is shown, right after the evaluation of `callback`. If not given the default behaviour is not to show the signup card. |\n\n*NOTE:* Both [button] and [icon] can be added to [LoginProvider], but [button] will take preference over [icon]\n\n### TermOfService\n\n\n| Property               | Type     | Description                                                                                                   |\n|------------------------|----------|---------------------------------------------------------------------------------------------------------------|\n| id                     | `String` | Used only on Signup callback to identify a single Term Of service if it's optional.                           |\n| mandatory              | `bool`   | If set true and term is not check when form is validate on submit, the validation error message will be shown |\n| text                   | `String` | Name of Term to show.                                                                                         |\n| linkUrl                | `String` | Web url link to additional term of services info.                                                             |\n| validationErrorMessage | `String` | Validation error message to show.                                                                             |\n| initialValue           | `bool`   | Specify if checkbox is initialized checked                                                                    |\n\n#### TermOfServiceResult\n\n| Property | Type                              | Description                                                                   |\n|----------|-----------------------------------|-------------------------------------------------------------------------------|\n| term     | [`TermOfService`](#TermOfService) | Contains a termOfServiceObject.                                               |\n| accepted | `bool`                            | Indicates whether or not the term of service was selected during registration |\n\n## Examples\n\nYou can view the complete example in the [example project] which resulted in the\ngif above\n\n### Basic example\n\n```dart\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'package:flutter_login\u002Fflutter_login.dart';\nimport 'dashboard_screen.dart';\n\nconst users =  {\n  'dribbble@gmail.com': '12345',\n  'hunter@gmail.com': 'hunter',\n};\n\nclass LoginScreen extends StatelessWidget {\n  const LoginScreen({super.key});\n\n  Duration get loginTime => const Duration(milliseconds: 2250);\n\n  Future\u003CString?> _authUser(LoginData data) {\n    debugPrint('Name: ${data.name}, Password: ${data.password}');\n    return Future.delayed(loginTime).then((_) {\n      if (!users.containsKey(data.name)) {\n        return 'User not exists';\n      }\n      if (users[data.name] != data.password) {\n        return 'Password does not match';\n      }\n      return null;\n    });\n  }\n\n  Future\u003CString?> _signupUser(SignupData data) {\n    debugPrint('Signup Name: ${data.name}, Password: ${data.password}');\n    return Future.delayed(loginTime).then((_) {\n      return null;\n    });\n  }\n\n  Future\u003CString> _recoverPassword(String name) {\n    debugPrint('Name: $name');\n    return Future.delayed(loginTime).then((_) {\n      if (!users.containsKey(name)) {\n        return 'User not exists';\n      }\n      return null;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return FlutterLogin(\n      title: 'ECORP',\n      logo: const AssetImage('assets\u002Fimages\u002Fecorp-lightblue.png'),\n      onLogin: _authUser,\n      onSignup: _signupUser,\n      onSubmitAnimationCompleted: () {\n        Navigator.of(context).pushReplacement(MaterialPageRoute(\n          builder: (context) => const DashboardScreen(),\n        ));\n      },\n      onRecoverPassword: _recoverPassword,\n    );\n  }\n}\n```\n\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FNearHuscarl\u002Fflutter_login\u002Fraw\u002Fmaster\u002Fdemo\u002Fbasic.png\" width=\"300\">\n\n\n\n### Basic example with sign in providers\n\n```dart\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'package:flutter_login\u002Fflutter_login.dart';\nimport 'dashboard_screen.dart';\n\nconst users = {\n  'dribbble@gmail.com': '12345',\n  'hunter@gmail.com': 'hunter',\n};\n\nclass LoginScreen extends StatelessWidget {\n  const LoginScreen({super.key});\n\n  Duration get loginTime => const Duration(milliseconds: 2250);\n\n  Future\u003CString?> _authUser(LoginData data) {\n    debugPrint('Name: ${data.name}, Password: ${data.password}');\n    return Future.delayed(loginTime).then((_) {\n      if (!users.containsKey(data.name)) {\n        return 'User not exists';\n      }\n      if (users[data.name] != data.password) {\n        return 'Password does not match';\n      }\n      return null;\n    });\n  }\n\n  Future\u003CString?> _signupUser(SignupData data) {\n    debugPrint('Signup Name: ${data.name}, Password: ${data.password}');\n    return Future.delayed(loginTime).then((_) {\n      return null;\n    });\n  }\n\n  Future\u003CString> _recoverPassword(String name) {\n    debugPrint('Name: $name');\n    return Future.delayed(loginTime).then((_) {\n      if (!users.containsKey(name)) {\n        return 'User not exists';\n      }\n      return null;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return FlutterLogin(\n      title: 'ECORP',\n      logo: const AssetImage('assets\u002Fimages\u002Fecorp-lightblue.png'),\n      onLogin: _authUser,\n      onSignup: _signupUser,\n      \n        loginProviders: \u003CLoginProvider>[\n          LoginProvider(\n            icon: FontAwesomeIcons.google,\n            label: 'Google',\n            callback: () async {\n              debugPrint('start google sign in');\n              await Future.delayed(loginTime);\n              debugPrint('stop google sign in');              \n              return null;\n            },\n          ),\n          LoginProvider(\n            icon: FontAwesomeIcons.facebookF,\n            label: 'Facebook',\n            callback: () async {            \n              debugPrint('start facebook sign in');\n              await Future.delayed(loginTime);\n              debugPrint('stop facebook sign in');              \n              return null;\n            },\n          ),\n          LoginProvider(\n            icon: FontAwesomeIcons.linkedinIn,\n            callback: () async {         \n              debugPrint('start linkdin sign in');\n              await Future.delayed(loginTime);         \n              debugPrint('stop linkdin sign in');              \n              return null;\n            },\n          ),\n          LoginProvider(\n            icon: FontAwesomeIcons.githubAlt,\n            callback: () async {\n              debugPrint('start github sign in');\n              await Future.delayed(loginTime);\n              debugPrint('stop github sign in');              \n              return null;\n            },\n          ),\n        ],\n      onSubmitAnimationCompleted: () {\n        Navigator.of(context).pushReplacement(MaterialPageRoute(\n          builder: (context) => const DashboardScreen(),\n        ));\n      },\n      onRecoverPassword: _recoverPassword,\n    );\n  }\n}\n```\n\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FNearHuscarl\u002Fflutter_login\u002Fraw\u002Fmaster\u002Fdemo\u002Flogin-with-provider.png\" width=\"300\">\n\n\n\n### Theming via `ThemeData`\n\nLogin theme can be customized indectly by using `ThemeData` like this\n\n```dart\n\u002F\u002F main.dart\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'login_screen.dart';\n\nvoid main() => runApp(MyApp());\n\nclass MyApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Login Demo',\n      theme: ThemeData(\n        primarySwatch: Colors.deepPurple,\n        accentColor: Colors.orange,\n        cursorColor: Colors.orange,\n        textTheme: const TextTheme(\n          headline3: TextStyle(\n            fontFamily: 'OpenSans',\n            fontSize: 45.0,\n            color: Colors.orange,\n          ),\n          button: TextStyle(\n            fontFamily: 'OpenSans',\n          ),\n          subtitle1: TextStyle(fontFamily: 'NotoSans'),\n          bodyText2: TextStyle(fontFamily: 'NotoSans'),\n        ),\n      ),\n      home: LoginScreen(),\n    );\n  }\n}\n\n\u002F\u002F login_screen.dart\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'package:flutter_login\u002Fflutter_login.dart';\nimport 'dashboard_screen.dart';\n\nclass LoginScreen extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return FlutterLogin(\n      title: 'ECORP',\n      logo: const AssetImage('assets\u002Fimages\u002Fecorp.png'),\n      onLogin: (_) => Future(null),\n      onSignup: (_) => Future(null),\n      onSubmitAnimationCompleted: () {\n        Navigator.of(context).pushReplacement(MaterialPageRoute(\n          builder: (context) => const DashboardScreen(),\n        ));\n      },\n      onRecoverPassword: (_) => Future(null),\n    );\n  }\n}\n```\n\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FNearHuscarl\u002Fflutter_login\u002Fraw\u002Fmaster\u002Fdemo\u002Ftheme-data.png\" width=\"300\">\n\n### Custom labels\n\n```dart\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'package:flutter_login\u002Fflutter_login.dart';\nimport 'dashboard_screen.dart';\n\nclass LoginScreen extends StatelessWidget {\n  const LoginScreen({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return FlutterLogin(\n      title: 'ECORP',\n      logo: const AssetImage('assets\u002Fimages\u002Fecorp.png'),\n      onLogin: (_) => Future(null),\n      onSignup: (_) => Future(null),\n      onSubmitAnimationCompleted: () {\n        Navigator.of(context).pushReplacement(MaterialPageRoute(\n          builder: (context) => const DashboardScreen(),\n        ));\n      },\n      onRecoverPassword: (_) => Future(null),\n      messages: LoginMessages(\n        userHint: 'User',\n        passwordHint: 'Pass',\n        confirmPasswordHint: 'Confirm',\n        loginButton: 'LOG IN',\n        signupButton: 'REGISTER',\n        forgotPasswordButton: 'Forgot huh?',\n        recoverPasswordButton: 'HELP ME',\n        goBackButton: 'GO BACK',\n        confirmPasswordError: 'Not match!',\n        recoverPasswordDescription:\n            'Lorem Ipsum is simply dummy text of the printing and typesetting industry',\n        recoverPasswordSuccess: 'Password rescued successfully',\n      ),\n    );\n  }\n}\n\n```\n\n|                 Login\u002FSignup                 |                  Password Recovery                  |\n|:--------------------------------------------:|:---------------------------------------------------:|\n| ![Login\u002FSignup](demo\u002Fcustom-label-login.png) | ![Password Recovery](demo\u002Fcustom-label-recover.png) |\n\n### Theme customization\n\n```dart\n\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'package:flutter_login\u002Fflutter_login.dart';\nimport 'dashboard_screen.dart';\n\nclass LoginScreen extends StatelessWidget {\n  const LoginScreen({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    const inputBorder = BorderRadius.vertical(\n      bottom: Radius.circular(10.0),\n      top: Radius.circular(20.0),\n    );\n\n    return FlutterLogin(\n      title: 'ECORP',\n      logo: const AssetImage('assets\u002Fimages\u002Fecorp-lightgreen.png'),\n      onLogin: (_) => Future(null),\n      onSignup: (_) => Future(null),\n      onSubmitAnimationCompleted: () {\n        Navigator.of(context).pushReplacement(MaterialPageRoute(\n          builder: (context) => const DashboardScreen(),\n        ));\n      },\n      onRecoverPassword: (_) => Future(null),\n      theme: LoginTheme(\n        primaryColor: Colors.teal,\n        accentColor: Colors.yellow,\n        errorColor: Colors.deepOrange,\n        titleStyle: const TextStyle(\n          color: Colors.greenAccent,\n          fontFamily: 'Quicksand',\n          letterSpacing: 4,\n        ),\n        bodyStyle: const TextStyle(\n          fontStyle: FontStyle.italic,\n          decoration: TextDecoration.underline,\n        ),\n        textFieldStyle: const TextStyle(\n          color: Colors.orange,\n          shadows: [Shadow(color: Colors.yellow, blurRadius: 2)],\n        ),\n        buttonStyle: const TextStyle(\n          fontWeight: FontWeight.w800,\n          color: Colors.yellow,\n        ),\n        cardTheme: CardTheme(\n          color: Colors.yellow.shade100,\n          elevation: 5,\n          margin: const EdgeInsets.only(top: 15),\n          shape: ContinuousRectangleBorder(\n              borderRadius: BorderRadius.circular(100.0)),\n        ),\n        inputTheme: InputDecorationTheme(\n          filled: true,\n          fillColor: Colors.purple.withOpacity(.1),\n          contentPadding: EdgeInsets.zero,\n          errorStyle: const TextStyle(\n            backgroundColor: Colors.orange,\n            color: Colors.white,\n          ),\n          labelStyle: const TextStyle(fontSize: 12),\n          enabledBorder: UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.blue.shade700, width: 4),\n            borderRadius: inputBorder,\n          ),\n          focusedBorder: UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.blue.shade400, width: 5),\n            borderRadius: inputBorder,\n          ),\n          errorBorder: UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.red.shade700, width: 7),\n            borderRadius: inputBorder,\n          ),\n          focusedErrorBorder: UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.red.shade400, width: 8),\n            borderRadius: inputBorder,\n          ),\n          disabledBorder: const UnderlineInputBorder(\n            borderSide: BorderSide(color: Colors.grey, width: 5),\n            borderRadius: inputBorder,\n          ),\n        ),\n        buttonTheme: LoginButtonTheme(\n          splashColor: Colors.purple,\n          backgroundColor: Colors.pinkAccent,\n          highlightColor: Colors.lightGreen,\n          elevation: 9.0,\n          highlightElevation: 6.0,\n          shape: BeveledRectangleBorder(\n            borderRadius: BorderRadius.circular(10),\n          ),\n          \u002F\u002F shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5)),\n          \u002F\u002F shape: CircleBorder(side: BorderSide(color: Colors.green)),\n          \u002F\u002F shape: ContinuousRectangleBorder(borderRadius: BorderRadius.circular(55.0)),\n        ),\n      ),\n    );\n  }\n}\n```\n\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FNearHuscarl\u002Fflutter_login\u002Fraw\u002Fmaster\u002Fdemo\u002Ftheme.png\" width=\"300\">\n\n## Inspiration\n* [VNPAY App Interactions](https:\u002F\u002Fdribbble.com\u002Fshots\u002F3829985-VNPAY-App-Interactions)\n* [Flat UI Login animated](https:\u002F\u002Fdribbble.com\u002Fshots\u002F1058688-Flat-UI-Login-animated)\n\n## License\n\n* MIT License\n\n[example project]: example\u002F\n","`FlutterLogin` 是一个提供登录和注册功能的预构建小部件，旨在加速 Flutter 应用程序的开发过程。该项目使用 Dart 语言编写，支持多种动画效果，能够为用户提供流畅且美观的交互体验。其核心功能包括自定义登录\u002F注册界面、表单验证以及额外字段配置等，并通过回调函数实现了与后端服务的灵活对接。适用于需要快速搭建用户认证系统的所有类型移动应用项目中，无论是个人开发者还是团队协作，都能从中受益。","2026-06-11 03:22:13","top_language"]