feat(bloc): add provider, consumer and helpers
This commit is contained in:
		
							parent
							
								
									2ac2b4d2be
								
							
						
					
					
						commit
						9ef37633cb
					
				
							
								
								
									
										161
									
								
								packages/wyatt_bloc_helper/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								packages/wyatt_bloc_helper/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,161 @@ | |||||||
|  | <!-- | ||||||
|  |  * Copyright (C) 2022 WYATT GROUP | ||||||
|  |  * Please see the AUTHORS file for details. | ||||||
|  |  *  | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * any later version. | ||||||
|  |  *  | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  *  | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | --> | ||||||
|  | 
 | ||||||
|  | # Flutter - BloC Helper | ||||||
|  | 
 | ||||||
|  | <p align="left"> | ||||||
|  |   <a href="https://git.wyatt-studio.fr/Wyatt-FOSS/wyatt-packages/src/branch/master/packages/wyatt_analysis"> | ||||||
|  |     <img src="https://img.shields.io/badge/Style-Wyatt%20Analysis-blue.svg?style=flat-square" alt="Style: Wyatt Analysis" /> | ||||||
|  |   </a> | ||||||
|  |   <img src="https://img.shields.io/badge/SDK-Flutter-blue?style=flat-square" alt="SDK: Flutter" /> | ||||||
|  | </p> | ||||||
|  | 
 | ||||||
|  | BloC Pattern utilities for Flutter. | ||||||
|  | 
 | ||||||
|  | ## Using | ||||||
|  | 
 | ||||||
|  | ### Mixin Helper | ||||||
|  | 
 | ||||||
|  | In any custom screen you can get quick access to bloc or repository by using the mixin helper. | ||||||
|  | 
 | ||||||
|  | ```dart | ||||||
|  | add(context, CounterIncrement()); | ||||||
|  | 
 | ||||||
|  | // or, if you want to use Cubit | ||||||
|  | 
 | ||||||
|  | bloc(context).increment(); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | > Note: in this context `bloc` returns a Cubit instance. | ||||||
|  | 
 | ||||||
|  | ```dart | ||||||
|  | final repository = repo<CounterRepository>(context); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Only BlocProvider | ||||||
|  | 
 | ||||||
|  | If you want to use only `BlocProvider` you have to extends `BlocProviderScreen` or `CubitProviderScreen` depending on your use case. | ||||||
|  | 
 | ||||||
|  | ```dart | ||||||
|  | class CounterPage extends BlocProviderScreen<CounterBloc, CounterEvent, CounterState> { | ||||||
|  |     const CounterPage({super.key}); | ||||||
|  |     //... | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // or, if you want to use Cubit | ||||||
|  | 
 | ||||||
|  | class CounterPage extends CubitProviderScreen<CounterCubit, CounterState> { | ||||||
|  |     const CounterPage({super.key}); | ||||||
|  |     //... | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Then, create a Bloc or Cubit instance by implementing the `create` method. | ||||||
|  | 
 | ||||||
|  | ```dart | ||||||
|  | @override | ||||||
|  | CounterBloc create(BuildContext context) => CounterBloc(); | ||||||
|  | 
 | ||||||
|  | // or, if you want to use Cubit | ||||||
|  | 
 | ||||||
|  | @override | ||||||
|  | CounterCubit create(BuildContext context) => CounterCubit(); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Finaly, you have to implement the `buildChild` method to build your screen. | ||||||
|  | 
 | ||||||
|  | ```dart | ||||||
|  | @override | ||||||
|  | Widget buildChild(BuildContext context) { | ||||||
|  |     // return ... | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | > Note: here, you can use BlocBuilder, BlocListener,... and access Bloc and Repository instance with the mixin helper. | ||||||
|  | 
 | ||||||
|  | ### Only BlocConsumer | ||||||
|  | 
 | ||||||
|  | If you want to use only `BlocConsumer` you have to extends `BlocConsumerScreen` or `CubitConsumerScreen` depending on your use case. | ||||||
|  | 
 | ||||||
|  | > Note: using directly `BlocConsumer` assumes you have already provided a Bloc or Cubit instance. | ||||||
|  | 
 | ||||||
|  | ```dart | ||||||
|  | class CounterPage extends BlocConsumerScreen<CounterBloc, CounterEvent, CounterState> { | ||||||
|  |     const CounterPage({super.key}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // or, if you want to use Cubit | ||||||
|  | 
 | ||||||
|  | class CounterPage extends CubitConsumerScreen<CounterCubit, CounterState> { | ||||||
|  |     const CounterPage({super.key}); | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Then, just implement the `onBuild` method to build your screen. | ||||||
|  | 
 | ||||||
|  | ```dart | ||||||
|  | @override | ||||||
|  | Widget onBuild(BuildContext context, CounterState state) { | ||||||
|  |     return Text(state.count.toString()); | ||||||
|  |     // or... more complex widgets | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | > Note: you can override `onBuild`, but also `onListen`, `shouldBuildWhen` and `shouldListenWhen` methods. | ||||||
|  | 
 | ||||||
|  | ### Both BlocProvider and BlocConsumer | ||||||
|  | 
 | ||||||
|  | You can use both `BlocProvider` and `BlocConsumer` in the same screen, with the `BlocScreen` or `CubitScreen` depending on your use case. | ||||||
|  | 
 | ||||||
|  | ```dart | ||||||
|  | class CounterPage extends BlocScreen<CounterBloc, CounterEvent, CounterState> { | ||||||
|  |     const CounterPage({super.key}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // or, if you want to use Cubit | ||||||
|  | 
 | ||||||
|  | class CounterPage extends CubitScreen<CounterCubit, CounterState> { | ||||||
|  |     const CounterPage({super.key}); | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Then, you can create a Bloc or Cubit instance by implementing the `create` method. | ||||||
|  | 
 | ||||||
|  | ```dart | ||||||
|  | @override | ||||||
|  | CounterBloc create(BuildContext context) => CounterBloc(); | ||||||
|  | 
 | ||||||
|  | // or, if you want to use Cubit | ||||||
|  | 
 | ||||||
|  | @override | ||||||
|  | CounterCubit create(BuildContext context) => CounterCubit(); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | And, finally, just implement the `onBuild` method to build your screen. | ||||||
|  | 
 | ||||||
|  | ```dart | ||||||
|  | @override | ||||||
|  | Widget onBuild(BuildContext context, CounterState state) { | ||||||
|  |     return Text(state.count.toString()); | ||||||
|  |     // or... more complex widgets | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | > Note: check **BlocProvider** and **BlocConsumer** documentation for more information. | ||||||
|  | 
 | ||||||
|  | You'll find a more examples in the `example/lib/counter/` directory. | ||||||
							
								
								
									
										47
									
								
								packages/wyatt_bloc_helper/example/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								packages/wyatt_bloc_helper/example/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | |||||||
|  | # Miscellaneous | ||||||
|  | *.class | ||||||
|  | *.log | ||||||
|  | *.pyc | ||||||
|  | *.swp | ||||||
|  | .DS_Store | ||||||
|  | .atom/ | ||||||
|  | .buildlog/ | ||||||
|  | .history | ||||||
|  | .svn/ | ||||||
|  | migrate_working_dir/ | ||||||
|  | 
 | ||||||
|  | # IntelliJ related | ||||||
|  | *.iml | ||||||
|  | *.ipr | ||||||
|  | *.iws | ||||||
|  | .idea/ | ||||||
|  | 
 | ||||||
|  | # The .vscode folder contains launch configuration and tasks you configure in | ||||||
|  | # VS Code which you may wish to be included in version control, so this line | ||||||
|  | # is commented out by default. | ||||||
|  | #.vscode/ | ||||||
|  | 
 | ||||||
|  | # Flutter/Dart/Pub related | ||||||
|  | **/doc/api/ | ||||||
|  | **/ios/Flutter/.last_build_id | ||||||
|  | .dart_tool/ | ||||||
|  | .flutter-plugins | ||||||
|  | .flutter-plugins-dependencies | ||||||
|  | .packages | ||||||
|  | .pub-cache/ | ||||||
|  | .pub/ | ||||||
|  | /build/ | ||||||
|  | 
 | ||||||
|  | # Web related | ||||||
|  | lib/generated_plugin_registrant.dart | ||||||
|  | 
 | ||||||
|  | # Symbolication related | ||||||
|  | app.*.symbols | ||||||
|  | 
 | ||||||
|  | # Obfuscation related | ||||||
|  | app.*.map.json | ||||||
|  | 
 | ||||||
|  | # Android Studio will place build artifacts here | ||||||
|  | /android/app/debug | ||||||
|  | /android/app/profile | ||||||
|  | /android/app/release | ||||||
							
								
								
									
										30
									
								
								packages/wyatt_bloc_helper/example/.metadata
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								packages/wyatt_bloc_helper/example/.metadata
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | # This file tracks properties of this Flutter project. | ||||||
|  | # Used by Flutter tool to assess capabilities and perform upgrades etc. | ||||||
|  | # | ||||||
|  | # This file should be version controlled. | ||||||
|  | 
 | ||||||
|  | version: | ||||||
|  |   revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 | ||||||
|  |   channel: stable | ||||||
|  | 
 | ||||||
|  | project_type: app | ||||||
|  | 
 | ||||||
|  | # Tracks metadata for the flutter migrate command | ||||||
|  | migration: | ||||||
|  |   platforms: | ||||||
|  |     - platform: root | ||||||
|  |       create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 | ||||||
|  |       base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 | ||||||
|  |     - platform: android | ||||||
|  |       create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 | ||||||
|  |       base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 | ||||||
|  | 
 | ||||||
|  |   # User provided section | ||||||
|  | 
 | ||||||
|  |   # List of Local paths (relative to this file) that should be | ||||||
|  |   # ignored by the migrate tool. | ||||||
|  |   # | ||||||
|  |   # Files that are not part of the templates will be ignored by default. | ||||||
|  |   unmanaged_files: | ||||||
|  |     - 'lib/main.dart' | ||||||
|  |     - 'ios/Runner.xcodeproj/project.pbxproj' | ||||||
							
								
								
									
										16
									
								
								packages/wyatt_bloc_helper/example/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								packages/wyatt_bloc_helper/example/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | # bloc_helper_example | ||||||
|  | 
 | ||||||
|  | A new Flutter project. | ||||||
|  | 
 | ||||||
|  | ## Getting Started | ||||||
|  | 
 | ||||||
|  | This project is a starting point for a Flutter application. | ||||||
|  | 
 | ||||||
|  | A few resources to get you started if this is your first Flutter project: | ||||||
|  | 
 | ||||||
|  | - [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) | ||||||
|  | - [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) | ||||||
|  | 
 | ||||||
|  | For help getting started with Flutter development, view the | ||||||
|  | [online documentation](https://docs.flutter.dev/), which offers tutorials, | ||||||
|  | samples, guidance on mobile development, and a full API reference. | ||||||
							
								
								
									
										29
									
								
								packages/wyatt_bloc_helper/example/analysis_options.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								packages/wyatt_bloc_helper/example/analysis_options.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | # This file configures the analyzer, which statically analyzes Dart code to | ||||||
|  | # check for errors, warnings, and lints. | ||||||
|  | # | ||||||
|  | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled | ||||||
|  | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be | ||||||
|  | # invoked from the command line by running `flutter analyze`. | ||||||
|  | 
 | ||||||
|  | # The following line activates a set of recommended lints for Flutter apps, | ||||||
|  | # packages, and plugins designed to encourage good coding practices. | ||||||
|  | include: package:flutter_lints/flutter.yaml | ||||||
|  | 
 | ||||||
|  | linter: | ||||||
|  |   # The lint rules applied to this project can be customized in the | ||||||
|  |   # section below to disable rules from the `package:flutter_lints/flutter.yaml` | ||||||
|  |   # included above or to enable additional rules. A list of all available lints | ||||||
|  |   # and their documentation is published at | ||||||
|  |   # https://dart-lang.github.io/linter/lints/index.html. | ||||||
|  |   # | ||||||
|  |   # Instead of disabling a lint rule for the entire project in the | ||||||
|  |   # section below, it can also be suppressed for a single line of code | ||||||
|  |   # or a specific dart file by using the `// ignore: name_of_lint` and | ||||||
|  |   # `// ignore_for_file: name_of_lint` syntax on the line or in the file | ||||||
|  |   # producing the lint. | ||||||
|  |   rules: | ||||||
|  |     # avoid_print: false  # Uncomment to disable the `avoid_print` rule | ||||||
|  |     # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule | ||||||
|  | 
 | ||||||
|  | # Additional information about this file can be found at | ||||||
|  | # https://dart.dev/guides/language/analysis-options | ||||||
							
								
								
									
										13
									
								
								packages/wyatt_bloc_helper/example/android/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								packages/wyatt_bloc_helper/example/android/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | gradle-wrapper.jar | ||||||
|  | /.gradle | ||||||
|  | /captures/ | ||||||
|  | /gradlew | ||||||
|  | /gradlew.bat | ||||||
|  | /local.properties | ||||||
|  | GeneratedPluginRegistrant.java | ||||||
|  | 
 | ||||||
|  | # Remember to never publicly share your keystore. | ||||||
|  | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app | ||||||
|  | key.properties | ||||||
|  | **/*.keystore | ||||||
|  | **/*.jks | ||||||
							
								
								
									
										71
									
								
								packages/wyatt_bloc_helper/example/android/app/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								packages/wyatt_bloc_helper/example/android/app/build.gradle
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | |||||||
|  | def localProperties = new Properties() | ||||||
|  | def localPropertiesFile = rootProject.file('local.properties') | ||||||
|  | if (localPropertiesFile.exists()) { | ||||||
|  |     localPropertiesFile.withReader('UTF-8') { reader -> | ||||||
|  |         localProperties.load(reader) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | def flutterRoot = localProperties.getProperty('flutter.sdk') | ||||||
|  | if (flutterRoot == null) { | ||||||
|  |     throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') | ||||||
|  | if (flutterVersionCode == null) { | ||||||
|  |     flutterVersionCode = '1' | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | def flutterVersionName = localProperties.getProperty('flutter.versionName') | ||||||
|  | if (flutterVersionName == null) { | ||||||
|  |     flutterVersionName = '1.0' | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | apply plugin: 'com.android.application' | ||||||
|  | apply plugin: 'kotlin-android' | ||||||
|  | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" | ||||||
|  | 
 | ||||||
|  | android { | ||||||
|  |     compileSdkVersion flutter.compileSdkVersion | ||||||
|  |     ndkVersion flutter.ndkVersion | ||||||
|  | 
 | ||||||
|  |     compileOptions { | ||||||
|  |         sourceCompatibility JavaVersion.VERSION_1_8 | ||||||
|  |         targetCompatibility JavaVersion.VERSION_1_8 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     kotlinOptions { | ||||||
|  |         jvmTarget = '1.8' | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     sourceSets { | ||||||
|  |         main.java.srcDirs += 'src/main/kotlin' | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     defaultConfig { | ||||||
|  |         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). | ||||||
|  |         applicationId "com.example.bloc_helper_example" | ||||||
|  |         // You can update the following values to match your application needs. | ||||||
|  |         // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. | ||||||
|  |         minSdkVersion flutter.minSdkVersion | ||||||
|  |         targetSdkVersion flutter.targetSdkVersion | ||||||
|  |         versionCode flutterVersionCode.toInteger() | ||||||
|  |         versionName flutterVersionName | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     buildTypes { | ||||||
|  |         release { | ||||||
|  |             // TODO: Add your own signing config for the release build. | ||||||
|  |             // Signing with the debug keys for now, so `flutter run --release` works. | ||||||
|  |             signingConfig signingConfigs.debug | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | flutter { | ||||||
|  |     source '../..' | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | dependencies { | ||||||
|  |     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" | ||||||
|  | } | ||||||
| @ -0,0 +1,8 @@ | |||||||
|  | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     package="com.example.bloc_helper_example"> | ||||||
|  |     <!-- The INTERNET permission is required for development. Specifically, | ||||||
|  |          the Flutter tool needs it to communicate with the running application | ||||||
|  |          to allow setting breakpoints, to provide hot reload, etc. | ||||||
|  |     --> | ||||||
|  |     <uses-permission android:name="android.permission.INTERNET"/> | ||||||
|  | </manifest> | ||||||
| @ -0,0 +1,34 @@ | |||||||
|  | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     package="com.example.bloc_helper_example"> | ||||||
|  |    <application | ||||||
|  |         android:label="bloc_helper_example" | ||||||
|  |         android:name="${applicationName}" | ||||||
|  |         android:icon="@mipmap/ic_launcher"> | ||||||
|  |         <activity | ||||||
|  |             android:name=".MainActivity" | ||||||
|  |             android:exported="true" | ||||||
|  |             android:launchMode="singleTop" | ||||||
|  |             android:theme="@style/LaunchTheme" | ||||||
|  |             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" | ||||||
|  |             android:hardwareAccelerated="true" | ||||||
|  |             android:windowSoftInputMode="adjustResize"> | ||||||
|  |             <!-- Specifies an Android theme to apply to this Activity as soon as | ||||||
|  |                  the Android process has started. This theme is visible to the user | ||||||
|  |                  while the Flutter UI initializes. After that, this theme continues | ||||||
|  |                  to determine the Window background behind the Flutter UI. --> | ||||||
|  |             <meta-data | ||||||
|  |               android:name="io.flutter.embedding.android.NormalTheme" | ||||||
|  |               android:resource="@style/NormalTheme" | ||||||
|  |               /> | ||||||
|  |             <intent-filter> | ||||||
|  |                 <action android:name="android.intent.action.MAIN"/> | ||||||
|  |                 <category android:name="android.intent.category.LAUNCHER"/> | ||||||
|  |             </intent-filter> | ||||||
|  |         </activity> | ||||||
|  |         <!-- Don't delete the meta-data below. | ||||||
|  |              This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> | ||||||
|  |         <meta-data | ||||||
|  |             android:name="flutterEmbedding" | ||||||
|  |             android:value="2" /> | ||||||
|  |     </application> | ||||||
|  | </manifest> | ||||||
| @ -0,0 +1,6 @@ | |||||||
|  | package com.example.bloc_helper_example | ||||||
|  | 
 | ||||||
|  | import io.flutter.embedding.android.FlutterActivity | ||||||
|  | 
 | ||||||
|  | class MainActivity: FlutterActivity() { | ||||||
|  | } | ||||||
| @ -0,0 +1,12 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <!-- Modify this file to customize your launch splash screen --> | ||||||
|  | <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | ||||||
|  |     <item android:drawable="?android:colorBackground" /> | ||||||
|  | 
 | ||||||
|  |     <!-- You can insert your own image assets here --> | ||||||
|  |     <!-- <item> | ||||||
|  |         <bitmap | ||||||
|  |             android:gravity="center" | ||||||
|  |             android:src="@mipmap/launch_image" /> | ||||||
|  |     </item> --> | ||||||
|  | </layer-list> | ||||||
| @ -0,0 +1,12 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <!-- Modify this file to customize your launch splash screen --> | ||||||
|  | <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | ||||||
|  |     <item android:drawable="@android:color/white" /> | ||||||
|  | 
 | ||||||
|  |     <!-- You can insert your own image assets here --> | ||||||
|  |     <!-- <item> | ||||||
|  |         <bitmap | ||||||
|  |             android:gravity="center" | ||||||
|  |             android:src="@mipmap/launch_image" /> | ||||||
|  |     </item> --> | ||||||
|  | </layer-list> | ||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 544 B | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 442 B | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 721 B | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.0 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.4 KiB | 
| @ -0,0 +1,18 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  |     <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> | ||||||
|  |     <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> | ||||||
|  |         <!-- Show a splash screen on the activity. Automatically removed when | ||||||
|  |              the Flutter engine draws its first frame --> | ||||||
|  |         <item name="android:windowBackground">@drawable/launch_background</item> | ||||||
|  |     </style> | ||||||
|  |     <!-- Theme applied to the Android Window as soon as the process has started. | ||||||
|  |          This theme determines the color of the Android Window while your | ||||||
|  |          Flutter UI initializes, as well as behind your Flutter UI while its | ||||||
|  |          running. | ||||||
|  | 
 | ||||||
|  |          This Theme is only used starting with V2 of Flutter's Android embedding. --> | ||||||
|  |     <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar"> | ||||||
|  |         <item name="android:windowBackground">?android:colorBackground</item> | ||||||
|  |     </style> | ||||||
|  | </resources> | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <resources> | ||||||
|  |     <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off --> | ||||||
|  |     <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> | ||||||
|  |         <!-- Show a splash screen on the activity. Automatically removed when | ||||||
|  |              the Flutter engine draws its first frame --> | ||||||
|  |         <item name="android:windowBackground">@drawable/launch_background</item> | ||||||
|  |     </style> | ||||||
|  |     <!-- Theme applied to the Android Window as soon as the process has started. | ||||||
|  |          This theme determines the color of the Android Window while your | ||||||
|  |          Flutter UI initializes, as well as behind your Flutter UI while its | ||||||
|  |          running. | ||||||
|  | 
 | ||||||
|  |          This Theme is only used starting with V2 of Flutter's Android embedding. --> | ||||||
|  |     <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> | ||||||
|  |         <item name="android:windowBackground">?android:colorBackground</item> | ||||||
|  |     </style> | ||||||
|  | </resources> | ||||||
| @ -0,0 +1,8 @@ | |||||||
|  | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     package="com.example.bloc_helper_example"> | ||||||
|  |     <!-- The INTERNET permission is required for development. Specifically, | ||||||
|  |          the Flutter tool needs it to communicate with the running application | ||||||
|  |          to allow setting breakpoints, to provide hot reload, etc. | ||||||
|  |     --> | ||||||
|  |     <uses-permission android:name="android.permission.INTERNET"/> | ||||||
|  | </manifest> | ||||||
							
								
								
									
										31
									
								
								packages/wyatt_bloc_helper/example/android/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								packages/wyatt_bloc_helper/example/android/build.gradle
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | buildscript { | ||||||
|  |     ext.kotlin_version = '1.6.10' | ||||||
|  |     repositories { | ||||||
|  |         google() | ||||||
|  |         mavenCentral() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     dependencies { | ||||||
|  |         classpath 'com.android.tools.build:gradle:7.1.2' | ||||||
|  |         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | allprojects { | ||||||
|  |     repositories { | ||||||
|  |         google() | ||||||
|  |         mavenCentral() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | rootProject.buildDir = '../build' | ||||||
|  | subprojects { | ||||||
|  |     project.buildDir = "${rootProject.buildDir}/${project.name}" | ||||||
|  | } | ||||||
|  | subprojects { | ||||||
|  |     project.evaluationDependsOn(':app') | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | task clean(type: Delete) { | ||||||
|  |     delete rootProject.buildDir | ||||||
|  | } | ||||||
| @ -0,0 +1,3 @@ | |||||||
|  | org.gradle.jvmargs=-Xmx1536M | ||||||
|  | android.useAndroidX=true | ||||||
|  | android.enableJetifier=true | ||||||
							
								
								
									
										6
									
								
								packages/wyatt_bloc_helper/example/android/gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								packages/wyatt_bloc_helper/example/android/gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | #Fri Jun 23 08:50:38 CEST 2017 | ||||||
|  | distributionBase=GRADLE_USER_HOME | ||||||
|  | distributionPath=wrapper/dists | ||||||
|  | zipStoreBase=GRADLE_USER_HOME | ||||||
|  | zipStorePath=wrapper/dists | ||||||
|  | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip | ||||||
							
								
								
									
										11
									
								
								packages/wyatt_bloc_helper/example/android/settings.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								packages/wyatt_bloc_helper/example/android/settings.gradle
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | include ':app' | ||||||
|  | 
 | ||||||
|  | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") | ||||||
|  | def properties = new Properties() | ||||||
|  | 
 | ||||||
|  | assert localPropertiesFile.exists() | ||||||
|  | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } | ||||||
|  | 
 | ||||||
|  | def flutterSdkPath = properties.getProperty("flutter.sdk") | ||||||
|  | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" | ||||||
|  | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" | ||||||
| @ -0,0 +1,34 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | //  | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | //  | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | //  | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:equatable/equatable.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | 
 | ||||||
|  | part 'counter_event.dart'; | ||||||
|  | part 'counter_state.dart'; | ||||||
|  | 
 | ||||||
|  | class CounterBloc extends Bloc<CounterEvent, CounterState> { | ||||||
|  |   CounterBloc() : super(const CounterInitial()) { | ||||||
|  |      | ||||||
|  |     on<CounterIncrement>((event, emit) { | ||||||
|  |       emit(CounterModified(state.count + 1)); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     on<CounterDecrement>((event, emit) { | ||||||
|  |       emit(CounterModified(state.count - 1)); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,28 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | //  | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | //  | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | //  | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | part of 'counter_bloc.dart'; | ||||||
|  | 
 | ||||||
|  | abstract class CounterEvent extends Equatable { | ||||||
|  |   const CounterEvent(); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   List<Object> get props => []; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class CounterIncrement extends CounterEvent {} | ||||||
|  | 
 | ||||||
|  | class CounterDecrement extends CounterEvent {} | ||||||
| @ -0,0 +1,35 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | //  | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | //  | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | //  | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | part of 'counter_bloc.dart'; | ||||||
|  | 
 | ||||||
|  | abstract class CounterState extends Equatable { | ||||||
|  |   final int count; | ||||||
|  | 
 | ||||||
|  |   const CounterState(this.count); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   List<Object> get props => [count]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class CounterInitial extends CounterState { | ||||||
|  |   const CounterInitial() : super(0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class CounterModified extends CounterState { | ||||||
|  |   const CounterModified(super.count); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -0,0 +1,55 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:bloc_helper_example/counter/bloc/counter_bloc.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart'; | ||||||
|  | 
 | ||||||
|  | class CounterBlocPage | ||||||
|  |     extends BlocScreen<CounterBloc, CounterEvent, CounterState> { | ||||||
|  |   const CounterBlocPage({super.key}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   CounterBloc create(BuildContext context) => CounterBloc(); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget onBuild(BuildContext context, CounterState state) { | ||||||
|  |     final textTheme = Theme.of(context).textTheme; | ||||||
|  |     return Scaffold( | ||||||
|  |       appBar: AppBar(title: const Text('Counter with Bloc')), | ||||||
|  |       body: Center(child: Text('${state.count}', style: textTheme.headline2)), | ||||||
|  |       floatingActionButton: Column( | ||||||
|  |         mainAxisAlignment: MainAxisAlignment.end, | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.end, | ||||||
|  |         children: <Widget>[ | ||||||
|  |           FloatingActionButton( | ||||||
|  |             heroTag: null, | ||||||
|  |             key: const Key('counterBlocView_increment_floatingActionButton'), | ||||||
|  |             child: const Icon(Icons.add), | ||||||
|  |             onPressed: () => add(context, CounterIncrement()), | ||||||
|  |           ), | ||||||
|  |           const SizedBox(height: 8), | ||||||
|  |           FloatingActionButton( | ||||||
|  |             heroTag: null, | ||||||
|  |             key: const Key('counterBlocView_decrement_floatingActionButton'), | ||||||
|  |             child: const Icon(Icons.remove), | ||||||
|  |             onPressed: () => add(context, CounterDecrement()), | ||||||
|  |           ), | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,53 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:bloc_helper_example/counter/cubit/counter_cubit.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart'; | ||||||
|  | 
 | ||||||
|  | /// Important, this page assumes that the [CounterCubit] is provided. | ||||||
|  | class CounterConsumerPage | ||||||
|  |     extends CubitConsumerScreen<CounterCubit, CounterState> { | ||||||
|  |   const CounterConsumerPage({super.key}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget onBuild(BuildContext context, CounterState state) { | ||||||
|  |     final textTheme = Theme.of(context).textTheme; | ||||||
|  |     return Scaffold( | ||||||
|  |       appBar: AppBar(title: const Text('Counter with Consumer')), | ||||||
|  |       body: Center(child: Text('${state.count}', style: textTheme.headline2)), | ||||||
|  |       floatingActionButton: Column( | ||||||
|  |         mainAxisAlignment: MainAxisAlignment.end, | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.end, | ||||||
|  |         children: <Widget>[ | ||||||
|  |           FloatingActionButton( | ||||||
|  |             heroTag: null, | ||||||
|  |             key: const Key('counterConsumerView_increment_floatingActionButton'), | ||||||
|  |             child: const Icon(Icons.add), | ||||||
|  |             onPressed: () => bloc(context).increment(), | ||||||
|  |           ), | ||||||
|  |           const SizedBox(height: 8), | ||||||
|  |           FloatingActionButton( | ||||||
|  |             heroTag: null, | ||||||
|  |             key: const Key('counterConsumerView_decrement_floatingActionButton'), | ||||||
|  |             child: const Icon(Icons.remove), | ||||||
|  |             onPressed: () => bloc(context).decrement(), | ||||||
|  |           ), | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,55 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | //  | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | //  | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | //  | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:bloc_helper_example/counter/cubit/counter_cubit.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart'; | ||||||
|  | 
 | ||||||
|  | class CounterCubitPage | ||||||
|  |     extends CubitScreen<CounterCubit, CounterState> { | ||||||
|  |   const CounterCubitPage({super.key}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   CounterCubit create(BuildContext context) => CounterCubit(); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget onBuild(BuildContext context, CounterState state) { | ||||||
|  |     final textTheme = Theme.of(context).textTheme; | ||||||
|  |     return Scaffold( | ||||||
|  |       appBar: AppBar(title: const Text('Counter with Cubit')), | ||||||
|  |       body: Center(child: Text('${state.count}', style: textTheme.headline2)), | ||||||
|  |       floatingActionButton: Column( | ||||||
|  |         mainAxisAlignment: MainAxisAlignment.end, | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.end, | ||||||
|  |         children: <Widget>[ | ||||||
|  |           FloatingActionButton( | ||||||
|  |             heroTag: null, | ||||||
|  |             key: const Key('counterCubitView_increment_floatingActionButton'), | ||||||
|  |             child: const Icon(Icons.add), | ||||||
|  |             onPressed: () => bloc(context).increment(), | ||||||
|  |           ), | ||||||
|  |           const SizedBox(height: 8), | ||||||
|  |           FloatingActionButton( | ||||||
|  |             heroTag: null, | ||||||
|  |             key: const Key('counterCubitView_decrement_floatingActionButton'), | ||||||
|  |             child: const Icon(Icons.remove), | ||||||
|  |             onPressed: () => bloc(context).decrement(), | ||||||
|  |           ), | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,60 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:bloc_helper_example/counter/bloc/counter_bloc.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart'; | ||||||
|  | 
 | ||||||
|  | class CounterProviderPage | ||||||
|  |     extends BlocProviderScreen<CounterBloc, CounterEvent, CounterState> { | ||||||
|  |   const CounterProviderPage({super.key}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget buildChild(BuildContext context) { | ||||||
|  |     final textTheme = Theme.of(context).textTheme; | ||||||
|  |     return Scaffold( | ||||||
|  |       appBar: AppBar(title: const Text('Counter with Provider')), | ||||||
|  |       body: Center(child: BlocBuilder<CounterBloc, CounterState>( | ||||||
|  |         builder: (context, state) { | ||||||
|  |           return Text('${state.count}', style: textTheme.headline2); | ||||||
|  |         }, | ||||||
|  |       )), | ||||||
|  |       floatingActionButton: Column( | ||||||
|  |         mainAxisAlignment: MainAxisAlignment.end, | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.end, | ||||||
|  |         children: <Widget>[ | ||||||
|  |           FloatingActionButton( | ||||||
|  |             heroTag: null, | ||||||
|  |             key: const Key('counterProviderView_increment_floatingActionButton'), | ||||||
|  |             child: const Icon(Icons.add), | ||||||
|  |             onPressed: () => add(context, CounterIncrement()), | ||||||
|  |           ), | ||||||
|  |           const SizedBox(height: 8), | ||||||
|  |           FloatingActionButton( | ||||||
|  |             heroTag: null, | ||||||
|  |             key: const Key('counterProviderView_decrement_floatingActionButton'), | ||||||
|  |             child: const Icon(Icons.remove), | ||||||
|  |             onPressed: () => add(context, CounterDecrement()), | ||||||
|  |           ), | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   CounterBloc create(BuildContext context) => CounterBloc(); | ||||||
|  | } | ||||||
| @ -0,0 +1,32 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | //  | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | //  | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | //  | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:equatable/equatable.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | 
 | ||||||
|  | part 'counter_state.dart'; | ||||||
|  | 
 | ||||||
|  | class CounterCubit extends Cubit<CounterState> { | ||||||
|  |   CounterCubit() : super(const CounterInitial()); | ||||||
|  | 
 | ||||||
|  |   void increment() { | ||||||
|  |     emit(CounterModified(state.count + 1)); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   void decrement() { | ||||||
|  |     emit(CounterModified(state.count - 1)); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,35 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | //  | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | //  | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | //  | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | part of 'counter_cubit.dart'; | ||||||
|  | 
 | ||||||
|  | abstract class CounterState extends Equatable { | ||||||
|  |   final int count; | ||||||
|  | 
 | ||||||
|  |   const CounterState(this.count); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   List<Object> get props => [count]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class CounterInitial extends CounterState { | ||||||
|  |   const CounterInitial() : super(0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class CounterModified extends CounterState { | ||||||
|  |   const CounterModified(super.count); | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										26
									
								
								packages/wyatt_bloc_helper/example/lib/counter_observer.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								packages/wyatt_bloc_helper/example/lib/counter_observer.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | //  | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | //  | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | //  | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:flutter/foundation.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | 
 | ||||||
|  | class CounterObserver extends BlocObserver { | ||||||
|  |   @override | ||||||
|  |   void onChange(BlocBase bloc, Change change) { | ||||||
|  |     super.onChange(bloc, change); | ||||||
|  |     debugPrint('${bloc.runtimeType} $change'); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										90
									
								
								packages/wyatt_bloc_helper/example/lib/main.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								packages/wyatt_bloc_helper/example/lib/main.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:bloc_helper_example/counter/counter_bloc_page.dart'; | ||||||
|  | import 'package:bloc_helper_example/counter/counter_consumer_page.dart'; | ||||||
|  | import 'package:bloc_helper_example/counter/counter_cubit_page.dart'; | ||||||
|  | import 'package:bloc_helper_example/counter/counter_provider_page.dart'; | ||||||
|  | import 'package:bloc_helper_example/counter/cubit/counter_cubit.dart'; | ||||||
|  | import 'package:bloc_helper_example/counter_observer.dart'; | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | 
 | ||||||
|  | void main() { | ||||||
|  |   BlocOverrides.runZoned(() => runApp(const MyApp()), | ||||||
|  |       blocObserver: CounterObserver()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class MyApp extends StatelessWidget { | ||||||
|  |   const MyApp({Key? key}) : super(key: key); | ||||||
|  | 
 | ||||||
|  |   // This widget is the root of your application. | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return MaterialApp( | ||||||
|  |       title: 'Flutter Demo', | ||||||
|  |       theme: ThemeData( | ||||||
|  |         primarySwatch: Colors.blue, | ||||||
|  |       ), | ||||||
|  |       home: const MainPage(), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class MainPage extends StatelessWidget { | ||||||
|  |   const MainPage({Key? key}) : super(key: key); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return Scaffold( | ||||||
|  |       appBar: AppBar( | ||||||
|  |         title: const Text('Main Page'), | ||||||
|  |       ), | ||||||
|  |       body: Center( | ||||||
|  |         child: Column( | ||||||
|  |           mainAxisAlignment: MainAxisAlignment.center, | ||||||
|  |           children: <Widget>[ | ||||||
|  |             ElevatedButton( | ||||||
|  |               child: const Text('Counter with BlocScreen'), | ||||||
|  |               onPressed: () => Navigator.of(context).push( | ||||||
|  |                   MaterialPageRoute(builder: (_) => const CounterBlocPage())), | ||||||
|  |             ), | ||||||
|  |             ElevatedButton( | ||||||
|  |               child: const Text('Counter with CubitScreen'), | ||||||
|  |               onPressed: () => Navigator.of(context).push( | ||||||
|  |                   MaterialPageRoute(builder: (_) => const CounterCubitPage())), | ||||||
|  |             ), | ||||||
|  |             ElevatedButton( | ||||||
|  |               child: const Text('Counter with BlocProviderScreen'), | ||||||
|  |               onPressed: () => Navigator.of(context).push(MaterialPageRoute( | ||||||
|  |                   builder: (_) => const CounterProviderPage())), | ||||||
|  |             ), | ||||||
|  |             ElevatedButton( | ||||||
|  |               child: const Text('Counter with BlocConsumerScreen'), | ||||||
|  |               onPressed: () => Navigator.of(context) | ||||||
|  |                   .push(MaterialPageRoute(builder: (context) { | ||||||
|  |                 return BlocProvider<CounterCubit>( | ||||||
|  |                   create: (context) => CounterCubit(), | ||||||
|  |                   child: const CounterConsumerPage(), | ||||||
|  |                 ); | ||||||
|  |               })), | ||||||
|  |             ), | ||||||
|  |           ], | ||||||
|  |         ), | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										94
									
								
								packages/wyatt_bloc_helper/example/pubspec.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								packages/wyatt_bloc_helper/example/pubspec.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,94 @@ | |||||||
|  | name: bloc_helper_example | ||||||
|  | description: A new Flutter project. | ||||||
|  | 
 | ||||||
|  | # The following line prevents the package from being accidentally published to | ||||||
|  | # pub.dev using `flutter pub publish`. This is preferred for private packages. | ||||||
|  | publish_to: 'none' # Remove this line if you wish to publish to pub.dev | ||||||
|  | 
 | ||||||
|  | # The following defines the version and build number for your application. | ||||||
|  | # A version number is three numbers separated by dots, like 1.2.43 | ||||||
|  | # followed by an optional build number separated by a +. | ||||||
|  | # Both the version and the builder number may be overridden in flutter | ||||||
|  | # build by specifying --build-name and --build-number, respectively. | ||||||
|  | # In Android, build-name is used as versionName while build-number used as versionCode. | ||||||
|  | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning | ||||||
|  | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. | ||||||
|  | # Read more about iOS versioning at | ||||||
|  | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | ||||||
|  | version: 1.0.0+1 | ||||||
|  | 
 | ||||||
|  | environment: | ||||||
|  |   sdk: ">=2.17.0 <3.0.0" | ||||||
|  | 
 | ||||||
|  | # Dependencies specify other packages that your package needs in order to work. | ||||||
|  | # To automatically upgrade your package dependencies to the latest versions | ||||||
|  | # consider running `flutter pub upgrade --major-versions`. Alternatively, | ||||||
|  | # dependencies can be manually updated by changing the version numbers below to | ||||||
|  | # the latest version available on pub.dev. To see which dependencies have newer | ||||||
|  | # versions available, run `flutter pub outdated`. | ||||||
|  | dependencies: | ||||||
|  |   flutter: | ||||||
|  |     sdk: flutter | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   # The following adds the Cupertino Icons font to your application. | ||||||
|  |   # Use with the CupertinoIcons class for iOS style icons. | ||||||
|  |   cupertino_icons: ^1.0.2 | ||||||
|  |   equatable: ^2.0.3 | ||||||
|  |   flutter_bloc: ^8.0.1 | ||||||
|  | 
 | ||||||
|  |   wyatt_bloc_helper: | ||||||
|  |     path: ../ | ||||||
|  | 
 | ||||||
|  | dev_dependencies: | ||||||
|  |   flutter_test: | ||||||
|  |     sdk: flutter | ||||||
|  | 
 | ||||||
|  |   # The "flutter_lints" package below contains a set of recommended lints to | ||||||
|  |   # encourage good coding practices. The lint set provided by the package is | ||||||
|  |   # activated in the `analysis_options.yaml` file located at the root of your | ||||||
|  |   # package. See that file for information about deactivating specific lint | ||||||
|  |   # rules and activating additional ones. | ||||||
|  |   flutter_lints: ^2.0.0 | ||||||
|  | 
 | ||||||
|  | # For information on the generic Dart part of this file, see the | ||||||
|  | # following page: https://dart.dev/tools/pub/pubspec | ||||||
|  | 
 | ||||||
|  | # The following section is specific to Flutter packages. | ||||||
|  | flutter: | ||||||
|  | 
 | ||||||
|  |   # The following line ensures that the Material Icons font is | ||||||
|  |   # included with your application, so that you can use the icons in | ||||||
|  |   # the material Icons class. | ||||||
|  |   uses-material-design: true | ||||||
|  | 
 | ||||||
|  |   # To add assets to your application, add an assets section, like this: | ||||||
|  |   # assets: | ||||||
|  |   #   - images/a_dot_burr.jpeg | ||||||
|  |   #   - images/a_dot_ham.jpeg | ||||||
|  | 
 | ||||||
|  |   # An image asset can refer to one or more resolution-specific "variants", see | ||||||
|  |   # https://flutter.dev/assets-and-images/#resolution-aware | ||||||
|  | 
 | ||||||
|  |   # For details regarding adding assets from package dependencies, see | ||||||
|  |   # https://flutter.dev/assets-and-images/#from-packages | ||||||
|  | 
 | ||||||
|  |   # To add custom fonts to your application, add a fonts section here, | ||||||
|  |   # in this "flutter" section. Each entry in this list should have a | ||||||
|  |   # "family" key with the font family name, and a "fonts" key with a | ||||||
|  |   # list giving the asset and other descriptors for the font. For | ||||||
|  |   # example: | ||||||
|  |   # fonts: | ||||||
|  |   #   - family: Schyler | ||||||
|  |   #     fonts: | ||||||
|  |   #       - asset: fonts/Schyler-Regular.ttf | ||||||
|  |   #       - asset: fonts/Schyler-Italic.ttf | ||||||
|  |   #         style: italic | ||||||
|  |   #   - family: Trajan Pro | ||||||
|  |   #     fonts: | ||||||
|  |   #       - asset: fonts/TrajanPro.ttf | ||||||
|  |   #       - asset: fonts/TrajanPro_Bold.ttf | ||||||
|  |   #         weight: 700 | ||||||
|  |   # | ||||||
|  |   # For details regarding fonts from package dependencies, | ||||||
|  |   # see https://flutter.dev/custom-fonts/#from-packages | ||||||
							
								
								
									
										30
									
								
								packages/wyatt_bloc_helper/example/test/widget_test.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								packages/wyatt_bloc_helper/example/test/widget_test.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | // This is a basic Flutter widget test. | ||||||
|  | // | ||||||
|  | // To perform an interaction with a widget in your test, use the WidgetTester | ||||||
|  | // utility in the flutter_test package. For example, you can send tap and scroll | ||||||
|  | // gestures. You can also use WidgetTester to find child widgets in the widget | ||||||
|  | // tree, read text, and verify that the values of widget properties are correct. | ||||||
|  | 
 | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:flutter_test/flutter_test.dart'; | ||||||
|  | 
 | ||||||
|  | import 'package:bloc_helper_example/main.dart'; | ||||||
|  | 
 | ||||||
|  | void main() { | ||||||
|  |   testWidgets('Counter increments smoke test', (WidgetTester tester) async { | ||||||
|  |     // Build our app and trigger a frame. | ||||||
|  |     await tester.pumpWidget(const MyApp()); | ||||||
|  | 
 | ||||||
|  |     // Verify that our counter starts at 0. | ||||||
|  |     expect(find.text('0'), findsOneWidget); | ||||||
|  |     expect(find.text('1'), findsNothing); | ||||||
|  | 
 | ||||||
|  |     // Tap the '+' icon and trigger a frame. | ||||||
|  |     await tester.tap(find.byIcon(Icons.add)); | ||||||
|  |     await tester.pump(); | ||||||
|  | 
 | ||||||
|  |     // Verify that our counter has incremented. | ||||||
|  |     expect(find.text('0'), findsNothing); | ||||||
|  |     expect(find.text('1'), findsOneWidget); | ||||||
|  |   }); | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								packages/wyatt_bloc_helper/lib/src/bloc.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								packages/wyatt_bloc_helper/lib/src/bloc.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/src/bloc_base/bloc_base_consumer_screen.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/src/bloc_base/bloc_base_provider_screen.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/src/bloc_base/bloc_base_screen.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/src/mixins/bloc_base_provider_mixin.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/src/mixins/bloc_provider_mixin.dart'; | ||||||
|  | 
 | ||||||
|  | abstract class BlocProviderScreen<B extends Bloc<E, S>, E, S extends Object> | ||||||
|  |     extends BlocBaseProviderScreen<B, S> | ||||||
|  |     with BlocBaseProviderMixin<B>, BlocProviderMixin<B, E> { | ||||||
|  |   const BlocProviderScreen({super.key}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | abstract class BlocConsumerScreen<B extends Bloc<E, S>, E, S extends Object> | ||||||
|  |     extends BlocBaseConsumerScreen<B, S> | ||||||
|  |     with BlocBaseProviderMixin<B>, BlocProviderMixin<B, E> { | ||||||
|  |   const BlocConsumerScreen({super.key}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | abstract class BlocScreen<B extends Bloc<E, S>, E, S extends Object> | ||||||
|  |     extends BlocBaseScreen<B, S> | ||||||
|  |     with BlocBaseProviderMixin<B>, BlocProviderMixin<B, E> { | ||||||
|  |   const BlocScreen({super.key}); | ||||||
|  | } | ||||||
| @ -0,0 +1,52 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:flutter/widgets.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | 
 | ||||||
|  | abstract class BlocBaseConsumerScreen<B extends BlocBase<S>, S extends Object> | ||||||
|  |     extends StatelessWidget { | ||||||
|  |   const BlocBaseConsumerScreen({super.key}); | ||||||
|  | 
 | ||||||
|  |   /// Takes the previous `state` and the current `state` and is responsible for | ||||||
|  |   /// returning a [bool] which determines whether or not to trigger | ||||||
|  |   /// [onBuild] with the current `state`. | ||||||
|  |   bool shouldBuildWhen(S previous, S current) => true; | ||||||
|  | 
 | ||||||
|  |   /// Takes the previous `state` and the current `state` and is responsible for | ||||||
|  |   /// returning a [bool] which determines whether or not to trigger | ||||||
|  |   /// [onListen] with the current `state`. | ||||||
|  |   bool shouldListenWhen(S previous, S current) => true; | ||||||
|  | 
 | ||||||
|  |   /// The [onBuild] function which will be invoked on each widget build. | ||||||
|  |   /// The [onBuild] takes the `BuildContext` and current `state` and | ||||||
|  |   /// must return a widget. | ||||||
|  |   Widget onBuild(BuildContext context, S state); | ||||||
|  | 
 | ||||||
|  |   /// Takes the `BuildContext` along with the `state` | ||||||
|  |   /// and is responsible for executing in response to `state` changes. | ||||||
|  |   void onListen(BuildContext context, S state) {} | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return BlocConsumer<B, S>( | ||||||
|  |       listenWhen: shouldListenWhen, | ||||||
|  |       listener: onListen, | ||||||
|  |       buildWhen: shouldBuildWhen, | ||||||
|  |       builder: onBuild, | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:flutter/widgets.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | 
 | ||||||
|  | abstract class BlocBaseProviderScreen<B extends BlocBase<S>, S extends Object> | ||||||
|  |     extends StatelessWidget { | ||||||
|  |   const BlocBaseProviderScreen({super.key}); | ||||||
|  | 
 | ||||||
|  |   /// Creates the [Cubit] or [Bloc] to be used. | ||||||
|  |   B create(BuildContext context); | ||||||
|  | 
 | ||||||
|  |   /// Creates the child [Widget] to be used. | ||||||
|  |   Widget buildChild(BuildContext context); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return BlocProvider<B>( | ||||||
|  |       create: (_) => create(context), | ||||||
|  |       child: Builder(builder: buildChild), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,35 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:flutter/widgets.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/src/bloc_base/bloc_base_consumer_screen.dart'; | ||||||
|  | 
 | ||||||
|  | abstract class BlocBaseScreen<B extends BlocBase<S>, S extends Object> | ||||||
|  |     extends BlocBaseConsumerScreen<B, S> { | ||||||
|  |   const BlocBaseScreen({super.key}); | ||||||
|  | 
 | ||||||
|  |   /// Creates the [Cubit] or [Bloc] to be used. | ||||||
|  |   B create(BuildContext context); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return BlocProvider<B>( | ||||||
|  |       create: (_) => create(context), | ||||||
|  |       child: super.build(context), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								packages/wyatt_bloc_helper/lib/src/cubit.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								packages/wyatt_bloc_helper/lib/src/cubit.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/src/bloc_base/bloc_base_consumer_screen.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/src/bloc_base/bloc_base_provider_screen.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/src/bloc_base/bloc_base_screen.dart'; | ||||||
|  | import 'package:wyatt_bloc_helper/src/mixins/bloc_base_provider_mixin.dart'; | ||||||
|  | 
 | ||||||
|  | abstract class CubitProviderScreen<B extends Cubit<S>, S extends Object> | ||||||
|  |     extends BlocBaseProviderScreen<B, S> with BlocBaseProviderMixin<B> { | ||||||
|  |   const CubitProviderScreen({super.key}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | abstract class CubitConsumerScreen<B extends Cubit<S>, S extends Object> | ||||||
|  |     extends BlocBaseConsumerScreen<B, S> with BlocBaseProviderMixin<B> { | ||||||
|  |   const CubitConsumerScreen({super.key}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | abstract class CubitScreen<B extends Cubit<S>, S extends Object> | ||||||
|  |     extends BlocBaseScreen<B, S> with BlocBaseProviderMixin<B> { | ||||||
|  |   const CubitScreen({super.key}); | ||||||
|  | } | ||||||
| @ -0,0 +1,28 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:flutter/widgets.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | 
 | ||||||
|  | /// A mixin that provides implementation of helper methods for | ||||||
|  | /// [Bloc] and [Cubit] widgets. | ||||||
|  | mixin BlocBaseProviderMixin<B extends BlocBase<Object>> { | ||||||
|  |   /// Returns the [BlocBase] used by this [BlocBaseProviderMixin]. | ||||||
|  |   B bloc(BuildContext context) => BlocProvider.of<B>(context); | ||||||
|  | 
 | ||||||
|  |   /// Returns the [BlocBase] used by this [BlocBaseProviderMixin]. | ||||||
|  |   R repo<R>(BuildContext context) => RepositoryProvider.of<R>(context); | ||||||
|  | } | ||||||
| @ -0,0 +1,26 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | //  | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | //  | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | //  | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | import 'package:flutter/widgets.dart'; | ||||||
|  | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||||
|  | 
 | ||||||
|  | /// [Bloc] specific mixin that provides implementation  | ||||||
|  | /// of helper methods for events. | ||||||
|  | mixin BlocProviderMixin<B extends Bloc<E, Object>, E> { | ||||||
|  |   void add(BuildContext context, E event) { | ||||||
|  |     BlocProvider.of<B>(context).add(event); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								packages/wyatt_bloc_helper/lib/wyatt_bloc_helper.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								packages/wyatt_bloc_helper/lib/wyatt_bloc_helper.dart
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | // Copyright (C) 2022 WYATT GROUP | ||||||
|  | // Please see the AUTHORS file for details. | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | // GNU General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU General Public License | ||||||
|  | // along with this program. If not, see <https://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | library wyatt_bloc_helper; | ||||||
|  | 
 | ||||||
|  | export 'src/bloc.dart'; | ||||||
|  | export 'src/cubit.dart'; | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user