{"id":17238338,"url":"https://github.com/hoc081098/flutter_validation_login_form_bloc_pattern_rxdart","last_synced_at":"2025-05-07T09:44:49.048Z","repository":{"id":37029926,"uuid":"139738397","full_name":"hoc081098/flutter_validation_login_form_BLoC_pattern_RxDart","owner":"hoc081098","description":"[Functional reactive programming (FRP)]💧 💧 💧 [Pure RxDart] Validation login form by using the BLoC pattern with RxDart - A new Flutter project featuring a faked authentication interface to demonstrate validation. Implemented with BloC pattern. ","archived":false,"fork":false,"pushed_at":"2025-04-26T15:46:14.000Z","size":5439,"stargazers_count":50,"open_issues_count":9,"forks_count":12,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-26T16:36:56.314Z","etag":null,"topics":["bloc-pattern","flutter","flutter-apps","flutter-bloc","flutter-bloc-pattern","flutter-form","flutter-material","flutter-reactive","flutter-reactive-form","reactive-functional-programming","reactive-programming","reactive-streams","reactivex","rx","rxdart"],"latest_commit_sha":null,"homepage":"https://pub.dartlang.org/packages/distinct_value_connectable_observable","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hoc081098.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-07-04T15:19:46.000Z","updated_at":"2024-11-06T22:33:35.000Z","dependencies_parsed_at":"2023-11-08T07:55:41.858Z","dependency_job_id":"ca5623ee-afd8-4c51-8e3b-ab5becb79e43","html_url":"https://github.com/hoc081098/flutter_validation_login_form_BLoC_pattern_RxDart","commit_stats":{"total_commits":22,"total_committers":3,"mean_commits":7.333333333333333,"dds":"0.13636363636363635","last_synced_commit":"c0dcfb4dab01c360f3639ae1873e9414806a6ad0"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoc081098%2Fflutter_validation_login_form_BLoC_pattern_RxDart","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoc081098%2Fflutter_validation_login_form_BLoC_pattern_RxDart/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoc081098%2Fflutter_validation_login_form_BLoC_pattern_RxDart/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hoc081098%2Fflutter_validation_login_form_BLoC_pattern_RxDart/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hoc081098","download_url":"https://codeload.github.com/hoc081098/flutter_validation_login_form_BLoC_pattern_RxDart/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252853503,"owners_count":21814538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bloc-pattern","flutter","flutter-apps","flutter-bloc","flutter-bloc-pattern","flutter-form","flutter-material","flutter-reactive","flutter-reactive-form","reactive-functional-programming","reactive-programming","reactive-streams","reactivex","rx","rxdart"],"created_at":"2024-10-15T05:45:17.098Z","updated_at":"2025-05-07T09:44:49.029Z","avatar_url":"https://github.com/hoc081098.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# flutter_validation_login_form_BLoC_pattern_RxDart\n\nSample Mobile Validation using `rxdart` and `BLoC pattern`\n\n# Screenshot\n\n[Video demo](https://www.youtube.com/watch?v=i5gS2BToNZs\u0026feature=youtu.be)\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"screenshots/demo.gif\" height=\"480\" alt=\"Cannot load image\"/\u003e\n\u003c/p\u003e\n\n# BLoC\n### 1. Create stream controllers to receive input: email, password, submit\n```dart\n// Stream controllers\nfinal emailS = BehaviorSubject.seeded('');\nfinal passwordS = BehaviorSubject.seeded('');\nfinal isLoadingS = BehaviorSubject.seeded(false);\nfinal submitLoginS = StreamController\u003cvoid\u003e();\nfinal subjects = [emailS, passwordS, isLoadingS, submitLoginS];\n```\n### 2. Map email text and password text to set of errors\n```dart\n// Email error and password error stream\nfinal emailError$ = emailS.map(validator.validateEmail).distinct().share();\n \nfinal passwordError$ =\n    passwordS.map(validator.validatePassword).distinct().share();\n```\n### 3. Combine email errors stream and password errors stream to valid stream\n```dart\n// Submit stream\nfinal submit$ = submitLoginS.stream\n    .throttleTime(const Duration(milliseconds: 500))\n    .withLatestFrom\u003cbool, bool\u003e(\n      Rx.combineLatest\u003cSet\u003cValidationError\u003e, bool\u003e(\n        [emailError$, passwordError$],\n        (listOfSets) =\u003e listOfSets.every((errorsSet) =\u003e errorsSet.isEmpty),\n      ),\n      (_, isValid) =\u003e isValid,\n    )\n    .share();\n```\n### 4. Perform login effect based on submit stream\n```dart\n// Message stream\nfinal message$ = Rx.merge(\n  [\n    submit$\n        .where((isValid) =\u003e isValid)\n        .withLatestFrom2(\n          emailS,\n          passwordS,\n          (_, email, password) =\u003e Credential(\n            email: email,\n            password: password,\n          ),\n        )\n        .exhaustMap(\n          (credential) =\u003e interactor.performLogin(\n            credential,\n            isLoadingS,\n          ),\n        ),\n    submit$\n        .where((isValid) =\u003e !isValid)\n        .map((_) =\u003e const InvalidInformationMessage()),\n  ],\n).publish();\n```\nThat's all :)\n\n## Getting Started\n\nFor help getting started with Flutter, view our online\n[documentation](https://flutter.io/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoc081098%2Fflutter_validation_login_form_bloc_pattern_rxdart","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhoc081098%2Fflutter_validation_login_form_bloc_pattern_rxdart","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoc081098%2Fflutter_validation_login_form_bloc_pattern_rxdart/lists"}