├── .gitignore ├── .metadata ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── getx_tutorial │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── appstore.png ├── images │ ├── getx_controller_detail_page.png │ ├── getx_controller_lifecycle.png │ ├── getx_dependency_management.png │ └── getx_internationalization.png └── playstore.png ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings ├── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 100.png │ │ │ ├── 1024.png │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 144.png │ │ │ ├── 152.png │ │ │ ├── 167.png │ │ │ ├── 180.png │ │ │ ├── 20.png │ │ │ ├── 29.png │ │ │ ├── 40.png │ │ │ ├── 50.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 72.png │ │ │ ├── 76.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ └── Contents.json │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h └── RunnerTests │ └── RunnerTests.swift ├── lib ├── 10_get_pattern │ └── get_pattern_example.dart ├── 1_navigation │ ├── navigation.dart │ └── next_screen.dart ├── 2_state_management │ ├── reactive │ │ ├── reactive_state_management.dart │ │ └── user.dart │ └── simple │ │ ├── simple_state_controller.dart │ │ └── simple_state_management.dart ├── 3_getx_controller │ ├── controller.dart │ ├── detail_page.dart │ └── view.dart ├── 4_dependency_management │ ├── binding.dart │ ├── class.dart │ ├── controller.dart │ ├── detail_page.dart │ └── view.dart ├── 5_translations │ ├── messages.dart │ ├── translations_controller.dart │ ├── translations_example.dart │ └── translations_view.dart ├── 6_themes │ ├── themes.dart │ ├── themes_controller.dart │ ├── themes_example.dart │ └── themes_view.dart ├── 7_getx_service_&_get_view │ ├── service_example.dart │ ├── service_view.dart │ └── settings_service.dart ├── 8_get_widget │ └── get_widget_example.dart ├── 9_get_connect │ └── get_connect_example.dart ├── main.dart └── routes.dart ├── pubspec.lock ├── pubspec.yaml ├── screenshots ├── badges │ ├── Dart-0175C2.svg │ ├── Flutter-02569B.svg │ ├── Flutter-3.svg │ ├── built-with-love.svg │ ├── dart-null_safety-blue.svg │ ├── flutter-dart.svg │ └── license-MIT.svg └── images │ ├── JSON_Viewer_pro.png │ ├── change_theme.gif │ ├── dependency_management.gif │ ├── getx_service_-_get_view.gif │ ├── internationalization.gif │ ├── navigation.gif │ ├── reactive_state_controller.gif │ ├── reactive_state_management.gif │ ├── simple_state_controller.gif │ └── simple_state_management.gif ├── test └── widget_test.dart └── web ├── favicon.png ├── icons ├── Icon-192.png ├── Icon-512.png ├── Icon-maskable-192.png └── Icon-maskable-512.png ├── index.html └── manifest.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Symbolication related 36 | app.*.symbols 37 | 38 | # Obfuscation related 39 | app.*.map.json 40 | 41 | # Android Studio will place build artifacts here 42 | /android/app/debug 43 | /android/app/profile 44 | /android/app/release 45 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled. 5 | 6 | version: 7 | revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 8 | channel: stable 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 17 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 18 | - platform: android 19 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 20 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 21 | - platform: ios 22 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 23 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 24 | - platform: linux 25 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 26 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 27 | - platform: macos 28 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 29 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 30 | - platform: web 31 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 32 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 33 | - platform: windows 34 | create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 35 | base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8 36 | 37 | # User provided section 38 | 39 | # List of Local paths (relative to this file) that should be 40 | # ignored by the migrate tool. 41 | # 42 | # Files that are not part of the templates will be ignored by default. 43 | unmanaged_files: 44 | - 'lib/main.dart' 45 | - 'ios/Runner.xcodeproj/project.pbxproj' 46 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "cupertino", 4 | "getx", 5 | "jsonkeeper", 6 | "playstore", 7 | "prefs", 8 | "Schyler", 9 | "Udemy" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Md. Siam 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |    2 |    3 |    4 | 5 | 6 | # GteX Tutorial - [Udemy](https://www.udemy.com/course/2022-dart-flutter-master-class-zero-to-hero/) 7 | 8 | 9 | GetX is one of the most popular state management solution in flutter. 10 | In addition to state management, GetX provides easy way to manage page routes. 11 | 12 | ## YouTube 13 | 14 | Video on [YouTube](https://www.youtube.com/watch?v=vIIBp6xJJeA) 15 | 16 | ## For [JSON Viewer Pro](https://chrome.google.com/webstore/detail/json-viewer-pro/eifflpmocdbdmepbjaopkkhbfmdgijcc) 17 | 18 | 19 | 20 | 0. [GetX](https://jsonkeeper.com/b/B4WJ) 21 | 1. [Navigation](https://jsonkeeper.com/b/LU24) 22 | 2. [State Management](https://jsonkeeper.com/b/0OSR) 23 | 3. [GetX Controller](https://jsonkeeper.com/b/08T2) 24 | 4. [Dependency Management](https://jsonkeeper.com/b/ESXV) 25 | 5. [Translation](https://jsonkeeper.com/b/1E6M) 26 | 6. [Themes](https://jsonkeeper.com/b/9XMT) 27 | 7. [GetXService & GetView](https://jsonkeeper.com/b/Y2JV) 28 | 8. [GetWidget](https://jsonkeeper.com/b/4QJS) 29 | 9. [GetConnect](https://jsonkeeper.com/b/LC6P) 30 | 10. [GetX Pattern](https://jsonkeeper.com/b/TI0Z) 31 | 11. [Utils](https://jsonkeeper.com/b/K7O1) 32 | 33 |
JSON files are hosted by [jsonkeeper](https://jsonkeeper.com/) 34 | 35 | ## Table of Contents 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 56 | 57 | 58 | 59 | 60 | 61 | 72 | 73 | 74 | 75 | 76 | 77 | 85 | 86 | 87 | 88 | 89 | 90 | 111 | 112 | 113 | 114 | 115 | 116 | 132 | 133 | 134 | 135 | 136 | 137 | 160 | 161 | 162 | 163 | 164 | 165 | 180 | 181 | 182 | 183 | 184 | 185 | 199 | 200 | 201 | 202 | 203 | 204 | 214 | 215 | 216 | 217 |
No.NameContentsScreenshots
1Navigation 48 | Get.to()
49 | Get.back()
50 | Get.off()
51 | Get.ofAll()
52 | Get.toNamed()
53 | Get.offNamed()
54 | Get.offAllNamed() 55 |
2Reactive State Management 62 | final name = ''.obs;
63 | final isLogged = false.obs;
64 | final count = 0.obs;
65 | final balance = 0.0.obs;
66 | final number = 0.obs;
67 | final items = [].obs;
68 | final myMap = {}.obs;

69 | Obx(() =>Text('${count.value}'));

70 | onPressed: () => increment() 71 |
3Simple State Management 78 | class Controller extends GetxController {}
79 | static Controller get to => Get.find();
80 | update();

81 | GetBuilder()
82 | init: Controller(),
83 | builder: (controller) => Text('${controller.counter}') 84 |
4Reactive State Controller 91 | GetX()
92 | init: Controller(),
93 | builder: (controller) => Text()

94 | In 'Controller' class:
95 | final count = 0.obs;
96 |    void increment() {
97 |      count.value++;
98 |    }

99 |    void clearCount() {
100 |      count.value = 0;
101 |    }

102 |    void onInit() { {
103 |      super.onInit();
104 |      ever(count, (_));
105 |      everAll([count], (_));
106 |      once(count, (_));
107 |      debounce(count, (_));
108 |      interval(count, (_))
109 |    } 110 |
5Simple State Controller 117 | final controller = Get.put(Controller());
118 | GetBuilder()
119 | id: 'count1',
120 | builder: (controller) =>Text()

121 | In 'Controller' class:
122 | int count = 0;
123 |    void increment() {
124 |      count++;
125 |      update();
126 |    }

127 |    void clearCount() {
128 |      count = 0;
129 |      update();
130 |    }
131 |
6Dependency Management 138 | Instancing methods
139 |   Get.put()
140 |   Get.lazyPut()
141 |   Get.putAsync()
142 |   Get.create()
143 |   Get.delete()

144 | Find controller
145 |   final controller = Get.find< Controller>();
146 |   Controller controller = Get.find();
147 | Alternate controller
148 |   Get.replace()
149 |   Get.lazyReplace()

150 | Binding
151 |   void dependency(){}
152 |   Named route > getPages > BindingBuilder() > void Function
153 |   Named route
154 |   initialBinding

155 | SmartManagement
156 |   ✰ full
157 |   onlyBuilder
158 |   keepFactory
159 |
7Internationalization 166 | Custom class
167 |   @override
168 |   Map< String, Map< String, String>> get keys

169 | tr > Text('key'.tr)

170 | @key > trParams({'key':'value'})

171 | translations
172 |   Custom class that extends Translations

173 | locale
174 |   Locale()
175 |   Get.deviceLocale()
176 |   Get.updateLocale()

177 | fallbackLocale
178 |   Locale()
179 |
8Change Theme 186 | void main() async {
187 |   await GetStorage.init();
188 |   runApp(const MyApp());
189 | }

190 | Create theme file

191 | Config lightTheme & darkTheme

192 | Change theme dynamically
193 |   Get.isDarkMode > bool
194 |   Get.changeThemeMode()
195 |   Get.changeTheme()

196 | Store them in local storage
197 |   GetStorage() > read() & write()
198 |
9GetX Service & GetView 205 | void main() async {
206 |   WidgetsFlutterBinding.ensureInitialized();
207 |   await initServices();
208 |   runApp(const MyApp());
209 | }

210 | GetView< SettingsService>

211 | late SharedPreferences _prefs;
212 | final counter = 0.obs;
213 |
218 | 219 | ## Directory 220 | 221 | ``` 222 | lib/ 223 | ├── 1_navigation/ 224 | │ ├── navigation.dart 225 | │ └── next_screen.dart 226 | ├── 2_state_management/ 227 | │ ├── reactive/ 228 | │ │ ├── reactive_state_management.dart 229 | │ │ └── user.dart 230 | │ └── simple/ 231 | │ ├── simple_state_controller.dart 232 | │ └── simple_state_management.dart 233 | ├── 3_getx_controller/ 234 | │ ├── controller.dart 235 | │ ├── detail_page.dart 236 | │ └── view.dart 237 | ├── 4_dependency_management/ 238 | │ ├── binding.dart 239 | │ ├── class.dart 240 | │ ├── controller.dart 241 | │ ├── detail_page.dart 242 | │ └── view.dart 243 | ├── 5_translations/ 244 | │ ├── messages.dart 245 | │ ├── translations_controller.dart 246 | │ ├── translations_example.dart 247 | │ └── translations_view.dart 248 | ├── 6_themes/ 249 | │ ├── themes_controller.dart 250 | │ ├── themes_example.dart 251 | │ ├── themes_view.dart 252 | │ └── themes.dart 253 | ├── 7_getx_service_&_get_view/ 254 | │ ├── service_view.dart 255 | │ ├── service_example.dart 256 | │ └── settings_service.dart 257 | ├── 8_get_widget/ 258 | │ └── get_widget_example.dart 259 | ├── 9_get_connect/ 260 | │ └── get_connect_example.dart 261 | ├── 10_get_pattern/ 262 | │ └── get_pattern_example.dart 263 | ├── main.dart 264 | └── routes.dart 265 | ``` 266 | 267 | ## Life Cycle of GetX Controller 268 | 269 | 270 | 271 | 272 | ## Dependency Management using GetX 273 | 274 | 275 | 276 | ## Internationalization/Translations using GetX 277 | 278 | For language code: `http://lingoes.net/en/translator/langcode.htm`
279 | For language code: `https://www.science.co.il/language/Codes.php`
280 | 281 | 282 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | namespace "com.example.getx_tutorial" 30 | compileSdkVersion flutter.compileSdkVersion 31 | ndkVersion flutter.ndkVersion 32 | 33 | compileOptions { 34 | sourceCompatibility JavaVersion.VERSION_1_8 35 | targetCompatibility JavaVersion.VERSION_1_8 36 | } 37 | 38 | kotlinOptions { 39 | jvmTarget = '1.8' 40 | } 41 | 42 | sourceSets { 43 | main.java.srcDirs += 'src/main/kotlin' 44 | } 45 | 46 | defaultConfig { 47 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 48 | applicationId "com.example.getx_tutorial" 49 | // You can update the following values to match your application needs. 50 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. 51 | minSdkVersion flutter.minSdkVersion 52 | targetSdkVersion flutter.targetSdkVersion 53 | versionCode flutterVersionCode.toInteger() 54 | versionName flutterVersionName 55 | } 56 | 57 | buildTypes { 58 | release { 59 | // TODO: Add your own signing config for the release build. 60 | // Signing with the debug keys for now, so `flutter run --release` works. 61 | signingConfig signingConfigs.debug 62 | } 63 | } 64 | } 65 | 66 | flutter { 67 | source '../..' 68 | } 69 | 70 | dependencies { 71 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 72 | } 73 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 14 | 18 | 22 | 23 | 24 | 25 | 26 | 27 | 29 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/getx_tutorial/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.getx_tutorial 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.7.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.3.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | tasks.register("clean", Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip 6 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /assets/appstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/assets/appstore.png -------------------------------------------------------------------------------- /assets/images/getx_controller_detail_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/assets/images/getx_controller_detail_page.png -------------------------------------------------------------------------------- /assets/images/getx_controller_lifecycle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/assets/images/getx_controller_lifecycle.png -------------------------------------------------------------------------------- /assets/images/getx_dependency_management.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/assets/images/getx_dependency_management.png -------------------------------------------------------------------------------- /assets/images/getx_internationalization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/assets/images/getx_internationalization.png -------------------------------------------------------------------------------- /assets/playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/assets/playstore.png -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 11.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '11.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | target 'RunnerTests' do 36 | inherit! :search_paths 37 | end 38 | end 39 | 40 | post_install do |installer| 41 | installer.pods_project.targets.each do |target| 42 | flutter_additional_ios_build_settings(target) 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Flutter (1.0.0) 3 | - path_provider_foundation (0.0.1): 4 | - Flutter 5 | - FlutterMacOS 6 | - shared_preferences_foundation (0.0.1): 7 | - Flutter 8 | - FlutterMacOS 9 | 10 | DEPENDENCIES: 11 | - Flutter (from `Flutter`) 12 | - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) 13 | - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) 14 | 15 | EXTERNAL SOURCES: 16 | Flutter: 17 | :path: Flutter 18 | path_provider_foundation: 19 | :path: ".symlinks/plugins/path_provider_foundation/darwin" 20 | shared_preferences_foundation: 21 | :path: ".symlinks/plugins/shared_preferences_foundation/darwin" 22 | 23 | SPEC CHECKSUMS: 24 | Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 25 | path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 26 | shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 27 | 28 | PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189 29 | 30 | COCOAPODS: 1.12.1 31 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 12 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 13 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 14 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 15 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 16 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 17 | B2439F882FEDE0E427A032CC /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF4E2DDE4C3D54764F5978BE /* Pods_RunnerTests.framework */; }; 18 | D8348A809E43C599DCF5019D /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA9D34F8D01ED4A4F38FC0F7 /* Pods_Runner.framework */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 97C146E61CF9000F007C117D /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 97C146ED1CF9000F007C117D; 27 | remoteInfo = Runner; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXCopyFilesBuildPhase section */ 32 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 33 | isa = PBXCopyFilesBuildPhase; 34 | buildActionMask = 2147483647; 35 | dstPath = ""; 36 | dstSubfolderSpec = 10; 37 | files = ( 38 | ); 39 | name = "Embed Frameworks"; 40 | runOnlyForDeploymentPostprocessing = 0; 41 | }; 42 | /* End PBXCopyFilesBuildPhase section */ 43 | 44 | /* Begin PBXFileReference section */ 45 | 0BD83D79A00847CF68748B52 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 46 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 47 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 48 | 2C9F6D6D6EC98C85863C39F2 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 49 | 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 50 | 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | 340ED17E8B3DFD7098B75A49 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 52 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 53 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 54 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 55 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 56 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 57 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 58 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 60 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 61 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 62 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 63 | CF6450264DC2B98413EE8404 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 64 | F69F0B3B6C8CA475C28A3A43 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 65 | FA9D34F8D01ED4A4F38FC0F7 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | FB1037273E4FC33976502961 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 67 | FF4E2DDE4C3D54764F5978BE /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 68 | /* End PBXFileReference section */ 69 | 70 | /* Begin PBXFrameworksBuildPhase section */ 71 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 72 | isa = PBXFrameworksBuildPhase; 73 | buildActionMask = 2147483647; 74 | files = ( 75 | D8348A809E43C599DCF5019D /* Pods_Runner.framework in Frameworks */, 76 | ); 77 | runOnlyForDeploymentPostprocessing = 0; 78 | }; 79 | DD5983C905AA2A0A3A9BA210 /* Frameworks */ = { 80 | isa = PBXFrameworksBuildPhase; 81 | buildActionMask = 2147483647; 82 | files = ( 83 | B2439F882FEDE0E427A032CC /* Pods_RunnerTests.framework in Frameworks */, 84 | ); 85 | runOnlyForDeploymentPostprocessing = 0; 86 | }; 87 | /* End PBXFrameworksBuildPhase section */ 88 | 89 | /* Begin PBXGroup section */ 90 | 331C8082294A63A400263BE5 /* RunnerTests */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 331C807B294A618700263BE5 /* RunnerTests.swift */, 94 | ); 95 | path = RunnerTests; 96 | sourceTree = ""; 97 | }; 98 | 83DBC6058EA89FAF2DFA8E57 /* Frameworks */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | FA9D34F8D01ED4A4F38FC0F7 /* Pods_Runner.framework */, 102 | FF4E2DDE4C3D54764F5978BE /* Pods_RunnerTests.framework */, 103 | ); 104 | name = Frameworks; 105 | sourceTree = ""; 106 | }; 107 | 9740EEB11CF90186004384FC /* Flutter */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 111 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 112 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 113 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 114 | ); 115 | name = Flutter; 116 | sourceTree = ""; 117 | }; 118 | 97C146E51CF9000F007C117D = { 119 | isa = PBXGroup; 120 | children = ( 121 | 9740EEB11CF90186004384FC /* Flutter */, 122 | 97C146F01CF9000F007C117D /* Runner */, 123 | 97C146EF1CF9000F007C117D /* Products */, 124 | 331C8082294A63A400263BE5 /* RunnerTests */, 125 | BDFEB03EA95694C569E2FAEC /* Pods */, 126 | 83DBC6058EA89FAF2DFA8E57 /* Frameworks */, 127 | ); 128 | sourceTree = ""; 129 | }; 130 | 97C146EF1CF9000F007C117D /* Products */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 97C146EE1CF9000F007C117D /* Runner.app */, 134 | 331C8081294A63A400263BE5 /* RunnerTests.xctest */, 135 | ); 136 | name = Products; 137 | sourceTree = ""; 138 | }; 139 | 97C146F01CF9000F007C117D /* Runner */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 143 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 144 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 145 | 97C147021CF9000F007C117D /* Info.plist */, 146 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 147 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 148 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 149 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 150 | ); 151 | path = Runner; 152 | sourceTree = ""; 153 | }; 154 | BDFEB03EA95694C569E2FAEC /* Pods */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 2C9F6D6D6EC98C85863C39F2 /* Pods-Runner.debug.xcconfig */, 158 | 0BD83D79A00847CF68748B52 /* Pods-Runner.release.xcconfig */, 159 | F69F0B3B6C8CA475C28A3A43 /* Pods-Runner.profile.xcconfig */, 160 | FB1037273E4FC33976502961 /* Pods-RunnerTests.debug.xcconfig */, 161 | 340ED17E8B3DFD7098B75A49 /* Pods-RunnerTests.release.xcconfig */, 162 | CF6450264DC2B98413EE8404 /* Pods-RunnerTests.profile.xcconfig */, 163 | ); 164 | name = Pods; 165 | path = Pods; 166 | sourceTree = ""; 167 | }; 168 | /* End PBXGroup section */ 169 | 170 | /* Begin PBXNativeTarget section */ 171 | 331C8080294A63A400263BE5 /* RunnerTests */ = { 172 | isa = PBXNativeTarget; 173 | buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; 174 | buildPhases = ( 175 | 1D3C930D671B318865FC0F51 /* [CP] Check Pods Manifest.lock */, 176 | 331C807D294A63A400263BE5 /* Sources */, 177 | 331C807F294A63A400263BE5 /* Resources */, 178 | DD5983C905AA2A0A3A9BA210 /* Frameworks */, 179 | ); 180 | buildRules = ( 181 | ); 182 | dependencies = ( 183 | 331C8086294A63A400263BE5 /* PBXTargetDependency */, 184 | ); 185 | name = RunnerTests; 186 | productName = RunnerTests; 187 | productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; 188 | productType = "com.apple.product-type.bundle.unit-test"; 189 | }; 190 | 97C146ED1CF9000F007C117D /* Runner */ = { 191 | isa = PBXNativeTarget; 192 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 193 | buildPhases = ( 194 | 0AD69FC11A5D381A263ADC11 /* [CP] Check Pods Manifest.lock */, 195 | 9740EEB61CF901F6004384FC /* Run Script */, 196 | 97C146EA1CF9000F007C117D /* Sources */, 197 | 97C146EB1CF9000F007C117D /* Frameworks */, 198 | 97C146EC1CF9000F007C117D /* Resources */, 199 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 200 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 201 | E040DF0C0826B8B39329671A /* [CP] Embed Pods Frameworks */, 202 | ); 203 | buildRules = ( 204 | ); 205 | dependencies = ( 206 | ); 207 | name = Runner; 208 | productName = Runner; 209 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 210 | productType = "com.apple.product-type.application"; 211 | }; 212 | /* End PBXNativeTarget section */ 213 | 214 | /* Begin PBXProject section */ 215 | 97C146E61CF9000F007C117D /* Project object */ = { 216 | isa = PBXProject; 217 | attributes = { 218 | LastUpgradeCheck = 1300; 219 | ORGANIZATIONNAME = ""; 220 | TargetAttributes = { 221 | 331C8080294A63A400263BE5 = { 222 | CreatedOnToolsVersion = 14.0; 223 | TestTargetID = 97C146ED1CF9000F007C117D; 224 | }; 225 | 97C146ED1CF9000F007C117D = { 226 | CreatedOnToolsVersion = 7.3.1; 227 | LastSwiftMigration = 1100; 228 | }; 229 | }; 230 | }; 231 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 232 | compatibilityVersion = "Xcode 9.3"; 233 | developmentRegion = en; 234 | hasScannedForEncodings = 0; 235 | knownRegions = ( 236 | en, 237 | Base, 238 | ); 239 | mainGroup = 97C146E51CF9000F007C117D; 240 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 241 | projectDirPath = ""; 242 | projectRoot = ""; 243 | targets = ( 244 | 97C146ED1CF9000F007C117D /* Runner */, 245 | 331C8080294A63A400263BE5 /* RunnerTests */, 246 | ); 247 | }; 248 | /* End PBXProject section */ 249 | 250 | /* Begin PBXResourcesBuildPhase section */ 251 | 331C807F294A63A400263BE5 /* Resources */ = { 252 | isa = PBXResourcesBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | ); 256 | runOnlyForDeploymentPostprocessing = 0; 257 | }; 258 | 97C146EC1CF9000F007C117D /* Resources */ = { 259 | isa = PBXResourcesBuildPhase; 260 | buildActionMask = 2147483647; 261 | files = ( 262 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 263 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 264 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 265 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 266 | ); 267 | runOnlyForDeploymentPostprocessing = 0; 268 | }; 269 | /* End PBXResourcesBuildPhase section */ 270 | 271 | /* Begin PBXShellScriptBuildPhase section */ 272 | 0AD69FC11A5D381A263ADC11 /* [CP] Check Pods Manifest.lock */ = { 273 | isa = PBXShellScriptBuildPhase; 274 | buildActionMask = 2147483647; 275 | files = ( 276 | ); 277 | inputFileListPaths = ( 278 | ); 279 | inputPaths = ( 280 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 281 | "${PODS_ROOT}/Manifest.lock", 282 | ); 283 | name = "[CP] Check Pods Manifest.lock"; 284 | outputFileListPaths = ( 285 | ); 286 | outputPaths = ( 287 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 288 | ); 289 | runOnlyForDeploymentPostprocessing = 0; 290 | shellPath = /bin/sh; 291 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 292 | showEnvVarsInLog = 0; 293 | }; 294 | 1D3C930D671B318865FC0F51 /* [CP] Check Pods Manifest.lock */ = { 295 | isa = PBXShellScriptBuildPhase; 296 | buildActionMask = 2147483647; 297 | files = ( 298 | ); 299 | inputFileListPaths = ( 300 | ); 301 | inputPaths = ( 302 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 303 | "${PODS_ROOT}/Manifest.lock", 304 | ); 305 | name = "[CP] Check Pods Manifest.lock"; 306 | outputFileListPaths = ( 307 | ); 308 | outputPaths = ( 309 | "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", 310 | ); 311 | runOnlyForDeploymentPostprocessing = 0; 312 | shellPath = /bin/sh; 313 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 314 | showEnvVarsInLog = 0; 315 | }; 316 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 317 | isa = PBXShellScriptBuildPhase; 318 | alwaysOutOfDate = 1; 319 | buildActionMask = 2147483647; 320 | files = ( 321 | ); 322 | inputPaths = ( 323 | "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", 324 | ); 325 | name = "Thin Binary"; 326 | outputPaths = ( 327 | ); 328 | runOnlyForDeploymentPostprocessing = 0; 329 | shellPath = /bin/sh; 330 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 331 | }; 332 | 9740EEB61CF901F6004384FC /* Run Script */ = { 333 | isa = PBXShellScriptBuildPhase; 334 | alwaysOutOfDate = 1; 335 | buildActionMask = 2147483647; 336 | files = ( 337 | ); 338 | inputPaths = ( 339 | ); 340 | name = "Run Script"; 341 | outputPaths = ( 342 | ); 343 | runOnlyForDeploymentPostprocessing = 0; 344 | shellPath = /bin/sh; 345 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 346 | }; 347 | E040DF0C0826B8B39329671A /* [CP] Embed Pods Frameworks */ = { 348 | isa = PBXShellScriptBuildPhase; 349 | buildActionMask = 2147483647; 350 | files = ( 351 | ); 352 | inputFileListPaths = ( 353 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 354 | ); 355 | name = "[CP] Embed Pods Frameworks"; 356 | outputFileListPaths = ( 357 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 358 | ); 359 | runOnlyForDeploymentPostprocessing = 0; 360 | shellPath = /bin/sh; 361 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 362 | showEnvVarsInLog = 0; 363 | }; 364 | /* End PBXShellScriptBuildPhase section */ 365 | 366 | /* Begin PBXSourcesBuildPhase section */ 367 | 331C807D294A63A400263BE5 /* Sources */ = { 368 | isa = PBXSourcesBuildPhase; 369 | buildActionMask = 2147483647; 370 | files = ( 371 | 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, 372 | ); 373 | runOnlyForDeploymentPostprocessing = 0; 374 | }; 375 | 97C146EA1CF9000F007C117D /* Sources */ = { 376 | isa = PBXSourcesBuildPhase; 377 | buildActionMask = 2147483647; 378 | files = ( 379 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 380 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 381 | ); 382 | runOnlyForDeploymentPostprocessing = 0; 383 | }; 384 | /* End PBXSourcesBuildPhase section */ 385 | 386 | /* Begin PBXTargetDependency section */ 387 | 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { 388 | isa = PBXTargetDependency; 389 | target = 97C146ED1CF9000F007C117D /* Runner */; 390 | targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; 391 | }; 392 | /* End PBXTargetDependency section */ 393 | 394 | /* Begin PBXVariantGroup section */ 395 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 396 | isa = PBXVariantGroup; 397 | children = ( 398 | 97C146FB1CF9000F007C117D /* Base */, 399 | ); 400 | name = Main.storyboard; 401 | sourceTree = ""; 402 | }; 403 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 404 | isa = PBXVariantGroup; 405 | children = ( 406 | 97C147001CF9000F007C117D /* Base */, 407 | ); 408 | name = LaunchScreen.storyboard; 409 | sourceTree = ""; 410 | }; 411 | /* End PBXVariantGroup section */ 412 | 413 | /* Begin XCBuildConfiguration section */ 414 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 415 | isa = XCBuildConfiguration; 416 | buildSettings = { 417 | ALWAYS_SEARCH_USER_PATHS = NO; 418 | CLANG_ANALYZER_NONNULL = YES; 419 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 420 | CLANG_CXX_LIBRARY = "libc++"; 421 | CLANG_ENABLE_MODULES = YES; 422 | CLANG_ENABLE_OBJC_ARC = YES; 423 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 424 | CLANG_WARN_BOOL_CONVERSION = YES; 425 | CLANG_WARN_COMMA = YES; 426 | CLANG_WARN_CONSTANT_CONVERSION = YES; 427 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 428 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 429 | CLANG_WARN_EMPTY_BODY = YES; 430 | CLANG_WARN_ENUM_CONVERSION = YES; 431 | CLANG_WARN_INFINITE_RECURSION = YES; 432 | CLANG_WARN_INT_CONVERSION = YES; 433 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 434 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 435 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 436 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 437 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 438 | CLANG_WARN_STRICT_PROTOTYPES = YES; 439 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 440 | CLANG_WARN_UNREACHABLE_CODE = YES; 441 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 442 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 443 | COPY_PHASE_STRIP = NO; 444 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 445 | ENABLE_NS_ASSERTIONS = NO; 446 | ENABLE_STRICT_OBJC_MSGSEND = YES; 447 | GCC_C_LANGUAGE_STANDARD = gnu99; 448 | GCC_NO_COMMON_BLOCKS = YES; 449 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 450 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 451 | GCC_WARN_UNDECLARED_SELECTOR = YES; 452 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 453 | GCC_WARN_UNUSED_FUNCTION = YES; 454 | GCC_WARN_UNUSED_VARIABLE = YES; 455 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 456 | MTL_ENABLE_DEBUG_INFO = NO; 457 | SDKROOT = iphoneos; 458 | SUPPORTED_PLATFORMS = iphoneos; 459 | TARGETED_DEVICE_FAMILY = "1,2"; 460 | VALIDATE_PRODUCT = YES; 461 | }; 462 | name = Profile; 463 | }; 464 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 465 | isa = XCBuildConfiguration; 466 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 467 | buildSettings = { 468 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 469 | CLANG_ENABLE_MODULES = YES; 470 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 471 | ENABLE_BITCODE = NO; 472 | INFOPLIST_FILE = Runner/Info.plist; 473 | LD_RUNPATH_SEARCH_PATHS = ( 474 | "$(inherited)", 475 | "@executable_path/Frameworks", 476 | ); 477 | PRODUCT_BUNDLE_IDENTIFIER = com.example.getxTutorial; 478 | PRODUCT_NAME = "$(TARGET_NAME)"; 479 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 480 | SWIFT_VERSION = 5.0; 481 | VERSIONING_SYSTEM = "apple-generic"; 482 | }; 483 | name = Profile; 484 | }; 485 | 331C8088294A63A400263BE5 /* Debug */ = { 486 | isa = XCBuildConfiguration; 487 | baseConfigurationReference = FB1037273E4FC33976502961 /* Pods-RunnerTests.debug.xcconfig */; 488 | buildSettings = { 489 | BUNDLE_LOADER = "$(TEST_HOST)"; 490 | CODE_SIGN_STYLE = Automatic; 491 | CURRENT_PROJECT_VERSION = 1; 492 | GENERATE_INFOPLIST_FILE = YES; 493 | MARKETING_VERSION = 1.0; 494 | PRODUCT_BUNDLE_IDENTIFIER = com.example.getxTutorial.RunnerTests; 495 | PRODUCT_NAME = "$(TARGET_NAME)"; 496 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 497 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 498 | SWIFT_VERSION = 5.0; 499 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 500 | }; 501 | name = Debug; 502 | }; 503 | 331C8089294A63A400263BE5 /* Release */ = { 504 | isa = XCBuildConfiguration; 505 | baseConfigurationReference = 340ED17E8B3DFD7098B75A49 /* Pods-RunnerTests.release.xcconfig */; 506 | buildSettings = { 507 | BUNDLE_LOADER = "$(TEST_HOST)"; 508 | CODE_SIGN_STYLE = Automatic; 509 | CURRENT_PROJECT_VERSION = 1; 510 | GENERATE_INFOPLIST_FILE = YES; 511 | MARKETING_VERSION = 1.0; 512 | PRODUCT_BUNDLE_IDENTIFIER = com.example.getxTutorial.RunnerTests; 513 | PRODUCT_NAME = "$(TARGET_NAME)"; 514 | SWIFT_VERSION = 5.0; 515 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 516 | }; 517 | name = Release; 518 | }; 519 | 331C808A294A63A400263BE5 /* Profile */ = { 520 | isa = XCBuildConfiguration; 521 | baseConfigurationReference = CF6450264DC2B98413EE8404 /* Pods-RunnerTests.profile.xcconfig */; 522 | buildSettings = { 523 | BUNDLE_LOADER = "$(TEST_HOST)"; 524 | CODE_SIGN_STYLE = Automatic; 525 | CURRENT_PROJECT_VERSION = 1; 526 | GENERATE_INFOPLIST_FILE = YES; 527 | MARKETING_VERSION = 1.0; 528 | PRODUCT_BUNDLE_IDENTIFIER = com.example.getxTutorial.RunnerTests; 529 | PRODUCT_NAME = "$(TARGET_NAME)"; 530 | SWIFT_VERSION = 5.0; 531 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; 532 | }; 533 | name = Profile; 534 | }; 535 | 97C147031CF9000F007C117D /* Debug */ = { 536 | isa = XCBuildConfiguration; 537 | buildSettings = { 538 | ALWAYS_SEARCH_USER_PATHS = NO; 539 | CLANG_ANALYZER_NONNULL = YES; 540 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 541 | CLANG_CXX_LIBRARY = "libc++"; 542 | CLANG_ENABLE_MODULES = YES; 543 | CLANG_ENABLE_OBJC_ARC = YES; 544 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 545 | CLANG_WARN_BOOL_CONVERSION = YES; 546 | CLANG_WARN_COMMA = YES; 547 | CLANG_WARN_CONSTANT_CONVERSION = YES; 548 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 549 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 550 | CLANG_WARN_EMPTY_BODY = YES; 551 | CLANG_WARN_ENUM_CONVERSION = YES; 552 | CLANG_WARN_INFINITE_RECURSION = YES; 553 | CLANG_WARN_INT_CONVERSION = YES; 554 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 555 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 556 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 557 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 558 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 559 | CLANG_WARN_STRICT_PROTOTYPES = YES; 560 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 561 | CLANG_WARN_UNREACHABLE_CODE = YES; 562 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 563 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 564 | COPY_PHASE_STRIP = NO; 565 | DEBUG_INFORMATION_FORMAT = dwarf; 566 | ENABLE_STRICT_OBJC_MSGSEND = YES; 567 | ENABLE_TESTABILITY = YES; 568 | GCC_C_LANGUAGE_STANDARD = gnu99; 569 | GCC_DYNAMIC_NO_PIC = NO; 570 | GCC_NO_COMMON_BLOCKS = YES; 571 | GCC_OPTIMIZATION_LEVEL = 0; 572 | GCC_PREPROCESSOR_DEFINITIONS = ( 573 | "DEBUG=1", 574 | "$(inherited)", 575 | ); 576 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 577 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 578 | GCC_WARN_UNDECLARED_SELECTOR = YES; 579 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 580 | GCC_WARN_UNUSED_FUNCTION = YES; 581 | GCC_WARN_UNUSED_VARIABLE = YES; 582 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 583 | MTL_ENABLE_DEBUG_INFO = YES; 584 | ONLY_ACTIVE_ARCH = YES; 585 | SDKROOT = iphoneos; 586 | TARGETED_DEVICE_FAMILY = "1,2"; 587 | }; 588 | name = Debug; 589 | }; 590 | 97C147041CF9000F007C117D /* Release */ = { 591 | isa = XCBuildConfiguration; 592 | buildSettings = { 593 | ALWAYS_SEARCH_USER_PATHS = NO; 594 | CLANG_ANALYZER_NONNULL = YES; 595 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 596 | CLANG_CXX_LIBRARY = "libc++"; 597 | CLANG_ENABLE_MODULES = YES; 598 | CLANG_ENABLE_OBJC_ARC = YES; 599 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 600 | CLANG_WARN_BOOL_CONVERSION = YES; 601 | CLANG_WARN_COMMA = YES; 602 | CLANG_WARN_CONSTANT_CONVERSION = YES; 603 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 604 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 605 | CLANG_WARN_EMPTY_BODY = YES; 606 | CLANG_WARN_ENUM_CONVERSION = YES; 607 | CLANG_WARN_INFINITE_RECURSION = YES; 608 | CLANG_WARN_INT_CONVERSION = YES; 609 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 610 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 611 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 612 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 613 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 614 | CLANG_WARN_STRICT_PROTOTYPES = YES; 615 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 616 | CLANG_WARN_UNREACHABLE_CODE = YES; 617 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 618 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 619 | COPY_PHASE_STRIP = NO; 620 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 621 | ENABLE_NS_ASSERTIONS = NO; 622 | ENABLE_STRICT_OBJC_MSGSEND = YES; 623 | GCC_C_LANGUAGE_STANDARD = gnu99; 624 | GCC_NO_COMMON_BLOCKS = YES; 625 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 626 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 627 | GCC_WARN_UNDECLARED_SELECTOR = YES; 628 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 629 | GCC_WARN_UNUSED_FUNCTION = YES; 630 | GCC_WARN_UNUSED_VARIABLE = YES; 631 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 632 | MTL_ENABLE_DEBUG_INFO = NO; 633 | SDKROOT = iphoneos; 634 | SUPPORTED_PLATFORMS = iphoneos; 635 | SWIFT_COMPILATION_MODE = wholemodule; 636 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 637 | TARGETED_DEVICE_FAMILY = "1,2"; 638 | VALIDATE_PRODUCT = YES; 639 | }; 640 | name = Release; 641 | }; 642 | 97C147061CF9000F007C117D /* Debug */ = { 643 | isa = XCBuildConfiguration; 644 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 645 | buildSettings = { 646 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 647 | CLANG_ENABLE_MODULES = YES; 648 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 649 | ENABLE_BITCODE = NO; 650 | INFOPLIST_FILE = Runner/Info.plist; 651 | LD_RUNPATH_SEARCH_PATHS = ( 652 | "$(inherited)", 653 | "@executable_path/Frameworks", 654 | ); 655 | PRODUCT_BUNDLE_IDENTIFIER = com.example.getxTutorial; 656 | PRODUCT_NAME = "$(TARGET_NAME)"; 657 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 658 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 659 | SWIFT_VERSION = 5.0; 660 | VERSIONING_SYSTEM = "apple-generic"; 661 | }; 662 | name = Debug; 663 | }; 664 | 97C147071CF9000F007C117D /* Release */ = { 665 | isa = XCBuildConfiguration; 666 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 667 | buildSettings = { 668 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 669 | CLANG_ENABLE_MODULES = YES; 670 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 671 | ENABLE_BITCODE = NO; 672 | INFOPLIST_FILE = Runner/Info.plist; 673 | LD_RUNPATH_SEARCH_PATHS = ( 674 | "$(inherited)", 675 | "@executable_path/Frameworks", 676 | ); 677 | PRODUCT_BUNDLE_IDENTIFIER = com.example.getxTutorial; 678 | PRODUCT_NAME = "$(TARGET_NAME)"; 679 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 680 | SWIFT_VERSION = 5.0; 681 | VERSIONING_SYSTEM = "apple-generic"; 682 | }; 683 | name = Release; 684 | }; 685 | /* End XCBuildConfiguration section */ 686 | 687 | /* Begin XCConfigurationList section */ 688 | 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { 689 | isa = XCConfigurationList; 690 | buildConfigurations = ( 691 | 331C8088294A63A400263BE5 /* Debug */, 692 | 331C8089294A63A400263BE5 /* Release */, 693 | 331C808A294A63A400263BE5 /* Profile */, 694 | ); 695 | defaultConfigurationIsVisible = 0; 696 | defaultConfigurationName = Release; 697 | }; 698 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 699 | isa = XCConfigurationList; 700 | buildConfigurations = ( 701 | 97C147031CF9000F007C117D /* Debug */, 702 | 97C147041CF9000F007C117D /* Release */, 703 | 249021D3217E4FDB00AE95B9 /* Profile */, 704 | ); 705 | defaultConfigurationIsVisible = 0; 706 | defaultConfigurationName = Release; 707 | }; 708 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 709 | isa = XCConfigurationList; 710 | buildConfigurations = ( 711 | 97C147061CF9000F007C117D /* Debug */, 712 | 97C147071CF9000F007C117D /* Release */, 713 | 249021D4217E4FDB00AE95B9 /* Profile */, 714 | ); 715 | defaultConfigurationIsVisible = 0; 716 | defaultConfigurationName = Release; 717 | }; 718 | /* End XCConfigurationList section */ 719 | }; 720 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 721 | } 722 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 43 | 49 | 50 | 51 | 52 | 53 | 63 | 65 | 71 | 72 | 73 | 74 | 80 | 82 | 88 | 89 | 90 | 91 | 93 | 94 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | {"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]} -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Getx Tutorial 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | getx_tutorial 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | CADisableMinimumFrameDurationOnPhone 47 | 48 | UIApplicationSupportsIndirectInputEvents 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /ios/RunnerTests/RunnerTests.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | import XCTest 4 | 5 | class RunnerTests: XCTestCase { 6 | 7 | func testExample() { 8 | // If you add code to the Runner application, consider adding tests here. 9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /lib/10_get_pattern/get_pattern_example.dart: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/lib/10_get_pattern/get_pattern_example.dart -------------------------------------------------------------------------------- /lib/1_navigation/navigation.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'next_screen.dart'; 5 | 6 | class MyGetNavigation extends StatelessWidget { 7 | const MyGetNavigation({Key? key}) : super(key: key); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return GetMaterialApp( 12 | debugShowCheckedModeBanner: false, 13 | theme: ThemeData(primarySwatch: Colors.deepPurple), 14 | initialRoute: '/', 15 | // unknownRoute: GetPage(name: '/notFound', page() => UnknownPage()) 16 | getPages: [ 17 | GetPage(name: '/', page: () => const MyGetNavigation()), 18 | GetPage(name: '/next', page: () => const NextScreen()), 19 | ], 20 | // If you want to listen Get events to trigger actions, 21 | // you can use routingCallback to it 22 | routingCallback: (routing) { 23 | if (routing!.current == '/next') { 24 | debugPrint('Open Ads'); 25 | } 26 | }, 27 | home: Scaffold( 28 | backgroundColor: Colors.deepPurple[100], 29 | appBar: AppBar( 30 | title: const Text('GetX Navigation'), 31 | ), 32 | body: Center( 33 | child: Column( 34 | mainAxisAlignment: MainAxisAlignment.center, 35 | children: [ 36 | ElevatedButton( 37 | onPressed: () async { 38 | // To navigate to a new screen 39 | var data = await Get.to( 40 | // Using a widget function instead of a widget 41 | // fully guarantees that the widget and its controllers 42 | // will be removed from memory when they are no longer used. 43 | () => const NextScreen(), 44 | // transition: Transition.rightToLeft, 45 | // duration: const Duration(seconds: 1), 46 | // curve: Curves.easeInOut, 47 | // https://api.flutter.dev/flutter/animation/Curves-class.html 48 | arguments: 'Hello World from Get.to()', 49 | ); 50 | debugPrint(data); 51 | }, 52 | child: const Text('Get.to(NextScreen())'), 53 | ), 54 | ElevatedButton( 55 | onPressed: () { 56 | // To go to the next screen and no option to go back to 57 | // the previous screen (for use in SplashScreen) 58 | Get.off( 59 | const NextScreen(), 60 | arguments: 'Hello World from Get.off()', 61 | ); 62 | }, 63 | child: const Text('Get.off(NextScreen())'), 64 | ), 65 | ElevatedButton( 66 | onPressed: () { 67 | Get.offAll( 68 | const NextScreen(), 69 | arguments: 'Hello World from Get.offAll()', 70 | ); 71 | }, 72 | child: const Text('Get.offAll(NextScreen())'), 73 | ), 74 | ElevatedButton( 75 | onPressed: () { 76 | Get.toNamed( 77 | '/next', 78 | arguments: 'Hello World from Get.toNamed("/next")', 79 | ); 80 | }, 81 | child: const Text('Get.toNamed("/next")'), 82 | ), 83 | ElevatedButton( 84 | onPressed: () { 85 | Get.offNamed( 86 | '/next', 87 | arguments: 'Hello World from Get.offNamed("/next")', 88 | ); 89 | }, 90 | child: const Text('Get.offNamed("/next")'), 91 | ), 92 | ElevatedButton( 93 | onPressed: () { 94 | Get.offAllNamed( 95 | '/next', 96 | arguments: 'Hello World from Get.offAllNamed("/next")', 97 | ); 98 | }, 99 | child: const Text('Get.offAllNamed("/next")'), 100 | ), 101 | ], 102 | ), 103 | ), 104 | ), 105 | ); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /lib/1_navigation/next_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | class NextScreen extends StatelessWidget { 5 | const NextScreen({Key? key}) : super(key: key); 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return Scaffold( 10 | backgroundColor: Colors.deepPurple[100], 11 | appBar: AppBar(), 12 | body: Center( 13 | child: Column( 14 | mainAxisAlignment: MainAxisAlignment.center, 15 | children: [ 16 | const Text('Next Screen'), 17 | Text('argument: ${Get.arguments}'), 18 | ElevatedButton( 19 | onPressed: () { 20 | // To navigate to a new screen 21 | Get.back( 22 | result: 'success', 23 | // if your set [closeOverlays] to true, Get.back() will close 24 | // the currently open snackbar/dialog/bottomsheet 25 | closeOverlays: false, 26 | ); 27 | }, 28 | child: const Text('Get.back()'), 29 | ), 30 | ], 31 | ), 32 | ), 33 | ); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/2_state_management/reactive/reactive_state_management.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'user.dart'; 5 | 6 | class ReactiveStateManagement extends StatelessWidget { 7 | ReactiveStateManagement({Key? key}) : super(key: key); 8 | // // 1. The first is using Rx(Type). 9 | // // initial value is recommended, but not mandatory 10 | // final name = RxString(''); 11 | // final isLogged = RxBool(false); 12 | // final count = RxInt(0); 13 | // final balance = RxDouble(0.0); 14 | // final items = RxList([]); 15 | // final myMap = RxMap({}); 16 | 17 | // // 2. The second is to use Rx and use Darts Generics, Rx 18 | // final name = Rx(''); 19 | // final isLogged = Rx(false); 20 | // final count = Rx(0); 21 | // final balance = Rx(0.0); 22 | // final number = Rx(0); 23 | // final items = Rx>([]); 24 | // final myMap = Rx>({}); 25 | // // Custom classes - it can be any class, literally 26 | // final user = Rx(User(name: 'Ruize', age: 30)); 27 | 28 | // 3. The third, more practical, easier and preferred approach 29 | // just add .obs (observable) as a property of your value 30 | final name = ''.obs; 31 | final isLogged = false.obs; 32 | final count = 0.obs; 33 | final balance = 0.0.obs; 34 | final number = 0.obs; 35 | final items = [].obs; 36 | final myMap = {}.obs; 37 | // Custom classes - it can be any class, literally 38 | final user = User(name: 'Ruize', age: 30).obs; 39 | // Attribute inside User class is observer 40 | //final user = User(); 41 | 42 | void increment() { 43 | count.value++; 44 | } 45 | 46 | void decrement() { 47 | count.value--; 48 | } 49 | 50 | void toUpper() { 51 | // // Attribute inside User class is observable 52 | // user.name.value = user.name.value.toUpperCase(); 53 | // user.age.value++; 54 | // Entire class is observer 55 | // 1. User update method 56 | user.update((user) { 57 | user!.name = user.name.toUpperCase(); 58 | user.age = user.age + 1; 59 | }); 60 | // // 2. An alternative way to update the user variable 61 | // user(User(name: 'RUIZE')); 62 | } 63 | 64 | @override 65 | Widget build(BuildContext context) { 66 | return GetMaterialApp( 67 | debugShowCheckedModeBanner: false, 68 | theme: ThemeData(primarySwatch: Colors.deepPurple), 69 | home: Scaffold( 70 | appBar: AppBar( 71 | title: const Text('Reactive State Management'), 72 | ), 73 | body: Center( 74 | child: Column( 75 | mainAxisAlignment: MainAxisAlignment.center, 76 | children: [ 77 | Obx( 78 | () => Text( 79 | '${count.value}', 80 | style: const TextStyle(fontSize: 28), 81 | ), 82 | ), 83 | Obx( 84 | () => Text( 85 | // 'Name: ${user.name.value} Age: ${user.age.value}', 86 | // Entire class is observable 87 | 'Name: ${user.value.name}, Age: ${user.value.age}', 88 | style: const TextStyle(fontSize: 28), 89 | ), 90 | ) 91 | ], 92 | ), 93 | ), 94 | floatingActionButton: Row( 95 | mainAxisAlignment: MainAxisAlignment.end, 96 | children: [ 97 | FloatingActionButton( 98 | child: const Icon(Icons.remove), 99 | onPressed: () => decrement(), 100 | ), 101 | const SizedBox(width: 20), 102 | FloatingActionButton( 103 | child: const Icon(Icons.add), 104 | onPressed: () => increment(), 105 | ), 106 | const SizedBox(width: 20), 107 | // Attribute inside User class is observer 108 | FloatingActionButton( 109 | child: const Icon(Icons.arrow_upward), 110 | onPressed: () => toUpper(), 111 | ), 112 | ], 113 | ), 114 | ), 115 | ); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /lib/2_state_management/reactive/user.dart: -------------------------------------------------------------------------------- 1 | 2 | class User { 3 | // var name = 'Ruize'.obs; //RxString 4 | // var age = 30.obs; //RxInt 5 | 6 | String name; 7 | int age; 8 | User({this.name = '', this.age = 0}); 9 | } 10 | -------------------------------------------------------------------------------- /lib/2_state_management/simple/simple_state_controller.dart: -------------------------------------------------------------------------------- 1 | // Create controller class and extends GetxController 2 | import 'package:get/get.dart'; 3 | 4 | class Controller extends GetxController { 5 | // with static method: Controller.to.increment(); 6 | // with no static method: Get.find().increment(); 7 | static Controller get to => Get.find(); 8 | 9 | int counter = 0; 10 | //final name = 'Ruize'.obs; 11 | 12 | void increment() { 13 | counter++; 14 | // use update() to update counter variable 15 | // on UI when increment be called 16 | update(); 17 | } 18 | 19 | void decrement() { 20 | counter--; 21 | // use update() to update counter variable 22 | // on UI when decrement be called 23 | update(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/2_state_management/simple/simple_state_management.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'simple_state_controller.dart'; 5 | 6 | class SimpleStateManagement extends StatelessWidget { 7 | const SimpleStateManagement({Key? key}) : super(key: key); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return GetMaterialApp( 12 | debugShowCheckedModeBanner: false, 13 | theme: ThemeData(primarySwatch: Colors.deepPurple), 14 | home: Scaffold( 15 | appBar: AppBar( 16 | title: const Text('Simple State Management'), 17 | ), 18 | body: Center( 19 | child: Column( 20 | mainAxisAlignment: MainAxisAlignment.center, 21 | children: [ 22 | // On your Stateless/Statefull class, use GetBuilder 23 | GetBuilder( 24 | init: Controller(), 25 | // INIT IT ONLY THE FIRST TIME 26 | builder: (controller) => Text( 27 | '${controller.counter}', 28 | // ${Controller.to.counter}, 29 | style: const TextStyle(fontSize: 28), 30 | ), 31 | ), 32 | // GetX( 33 | // builder: (controller)=>Text(controller.name.value), 34 | // ), 35 | ], 36 | ), 37 | ), 38 | floatingActionButton: Row( 39 | mainAxisAlignment: MainAxisAlignment.end, 40 | children: [ 41 | FloatingActionButton( 42 | child: const Icon(Icons.remove), 43 | onPressed: () => Controller.to.decrement(), 44 | ), 45 | const SizedBox(width: 20), 46 | FloatingActionButton( 47 | child: const Icon(Icons.add), 48 | onPressed: () => Controller.to.increment(), 49 | ), 50 | ], 51 | ), 52 | ), 53 | ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /lib/3_getx_controller/controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | // Class name can be anything 5 | class Controller extends GetxController { 6 | // Declare the reactive variable 7 | final count = 0.obs; 8 | // // Declare the normal variable 9 | // int count = 0; 10 | 11 | void increment() { 12 | count.value++; 13 | // count++; 14 | // update(); 15 | // update(['count1']); 16 | // update(['count1'], count < 10); 17 | } 18 | 19 | void clearCount() { 20 | debugPrint('clearCount been called'); 21 | count.value = 0; 22 | // count = 0; 23 | // update(); 24 | } 25 | 26 | @override 27 | void onInit() { 28 | super.onInit(); 29 | debugPrint('Controller on Init been called'); 30 | 31 | /// Called every time `count` changes 32 | ever(count, (_) => debugPrint('$_ has been called')); 33 | // everAll([count], (_) => debugPrint('$_ has been changes')); 34 | 35 | /// Called `only first time` the variable $_ is changed 36 | // once(count,(_)=> debugPrint('$_ was changed once')); 37 | 38 | /// Called every time the user `stops typing` for 1000 milliseconds 39 | /// used for designing search bar 40 | // debounce(count, (_) => debugPrint('debounce $_'), 41 | // time: const Duration(milliseconds: 1000)); 42 | 43 | /// `Ignore` all changes within 1000 milliseconds 44 | // interval(count,(_)=> debugPrint('interval $_'), 45 | // time: const Duration(milliseconds:1000)); 46 | } 47 | 48 | @override 49 | void onReady() { 50 | super.onReady(); 51 | debugPrint('Controller onReady been called'); 52 | } 53 | 54 | @override 55 | void onClose() { 56 | debugPrint('Controller onClose been called'); 57 | clearCount(); 58 | super.onClose(); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/3_getx_controller/detail_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'controller.dart'; 5 | 6 | class DetailPage extends StatelessWidget { 7 | DetailPage({Key? key}) : super(key: key); 8 | 9 | final controller = Get.put(Controller()); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Scaffold( 14 | appBar: AppBar(title: const Text('Detail Page')), 15 | body: Center( 16 | child: Column( 17 | mainAxisAlignment: MainAxisAlignment.center, 18 | children: [ 19 | // // Reactive State Management 20 | // GetX( 21 | // init: Controller(), 22 | // builder: (controller) => Text( 23 | // '${controller.count.value}', 24 | // style: const TextStyle(fontSize: 28), 25 | // ), 26 | // ), 27 | // Obx( 28 | // () => Text( 29 | // '${controller.count.value}', 30 | // style: const TextStyle(fontSize: 28), 31 | // ), 32 | // ), 33 | 34 | // Simple State Management 35 | GetBuilder( 36 | id: 'count1', 37 | // init: Controller(), 38 | builder: (controller) => Text( 39 | '${controller.count}', 40 | style: const TextStyle(fontSize: 28), 41 | ), 42 | ), 43 | // GetBuilder( 44 | // id: 'count2', 45 | // init: Controller(), 46 | // builder: (controller) => Text( 47 | // '${controller.count}', 48 | // style: const TextStyle(fontSize: 28), 49 | // ), 50 | // ), 51 | ], 52 | ), 53 | ), 54 | floatingActionButton: FloatingActionButton( 55 | child: const Icon(Icons.add), 56 | onPressed: () => Get.find().increment(), 57 | ), 58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/3_getx_controller/view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'controller.dart'; 5 | 6 | class GetXControllerExample extends StatelessWidget { 7 | GetXControllerExample({Key? key}) : super(key: key); 8 | 9 | // final controller = Get.put(Controller()); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return GetMaterialApp( 14 | debugShowCheckedModeBanner: false, 15 | theme: ThemeData(primarySwatch: Colors.deepPurple), 16 | home: Scaffold( 17 | appBar: AppBar( 18 | title: const Text('GetX Controller'), 19 | ), 20 | body: Center( 21 | child: Column( 22 | mainAxisAlignment: MainAxisAlignment.center, 23 | children: [ 24 | //! Reactive State Management 25 | GetX( 26 | init: Controller(), 27 | builder: (controller) => Text( 28 | '${controller.count.value}', 29 | style: const TextStyle(fontSize: 28), 30 | ), 31 | ), 32 | // Obx( 33 | // () => Text( 34 | // '${controller.count.value}', 35 | // style: const TextStyle(fontSize: 28), 36 | // ), 37 | // ), 38 | 39 | //! Simple State Management 40 | // GetBuilder( 41 | // id: 'count1', 42 | // init: Controller(), 43 | // builder: (controller) => Text( 44 | // '${controller.count}', 45 | // style: const TextStyle(fontSize: 28), 46 | // ), 47 | // ), 48 | // GetBuilder( 49 | // id: 'count2', 50 | // init: Controller(), 51 | // builder: (controller) => Text( 52 | // '${controller.count}', 53 | // style: const TextStyle(fontSize: 28), 54 | // ), 55 | // ), 56 | // ElevatedButton( 57 | // onPressed: () => Get.to(() => DetailPage()), 58 | // child: const Text('Detail Page'), 59 | // ), 60 | ], 61 | ), 62 | ), 63 | floatingActionButton: FloatingActionButton( 64 | child: const Icon(Icons.add), 65 | onPressed: () => Get.find().increment(), 66 | ), 67 | ), 68 | ); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /lib/4_dependency_management/binding.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | import 'controller.dart'; 4 | 5 | class DetailsBinding implements Bindings { 6 | @override 7 | void dependencies() { 8 | // lazyLoad a dependency only when is used. 9 | Get.lazyPut(() => Controller()); 10 | // Get.lazyPut( 11 | // // method that will be executed when your class is executed 12 | // () => Controller() 13 | // // same as Get.put() 14 | // // tag: 'uniqueId' for lazyPut' 15 | // // It is similar to "permanent", 16 | // // recreate the instance from 'same place' 17 | // // if set to true, it will stay in the memory 18 | // fenix: false, 19 | // ); 20 | 21 | // // an async method that will be executed to instantiate 22 | // Get.putAsync( 23 | // () async { 24 | // await Future.delayed(const Duration(seconds: 3)); 25 | // return AsyncTask(); 26 | // }, 27 | // // using Get.find() with unique Id 28 | // // tag: `uniqueId for putAsync`, 29 | // // kept instance throughout the entire app 30 | // permanent: false, 31 | // ); 32 | 33 | // // Create new instance every time, not Singleton 34 | // Get.create( 35 | // // a function that return a class 36 | // () => Controller(), 37 | // // tag: 'uniqueId for create' 38 | // Permanent: true, 39 | // ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/4_dependency_management/class.dart: -------------------------------------------------------------------------------- 1 | abstract class Base {} 2 | 3 | class Parent extends Base {} 4 | 5 | class Child extends Parent {} 6 | 7 | class AsyncTask {} 8 | -------------------------------------------------------------------------------- /lib/4_dependency_management/controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | // Class name can be anything 5 | class Controller extends GetxController { 6 | // Declare the reactive variable 7 | final count = 0.obs; 8 | 9 | void increment() { 10 | count.value++; 11 | } 12 | 13 | @override 14 | void onInit() { 15 | super.onInit(); 16 | // called immediately after the widget is allocated memory 17 | // usually for API calls 18 | debugPrint('Controller onInit been called'); 19 | } 20 | 21 | @override 22 | void onReady() { 23 | super.onReady(); 24 | // called after the widget is rendered on screen 25 | debugPrint('Controller onReady been called'); 26 | } 27 | 28 | @override 29 | void onClose() { 30 | // called just before the Controller is deleted from memory 31 | debugPrint('Controller onClose been called'); 32 | super.onClose(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/4_dependency_management/detail_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'controller.dart'; 5 | 6 | class DetailPage extends StatelessWidget { 7 | DetailPage({Key? key}) : super(key: key); 8 | 9 | // Find controller 10 | final controller = Get.find(); 11 | // final controller2 = Get.find(); 12 | // Controller controller = Get.find(); 13 | // final child = Get.find(); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | // debugPrint('is Children? ${child is Child}'); 18 | 19 | return Scaffold( 20 | appBar: AppBar(title: const Text('Detail Page')), 21 | body: Center( 22 | child: Column( 23 | mainAxisAlignment: MainAxisAlignment.center, 24 | children: [ 25 | Obx( 26 | () => Text( 27 | '${controller.count.value}', 28 | style: const TextStyle(fontSize: 28), 29 | ), 30 | ), 31 | // Obx( 32 | // () => Text( 33 | // '${controller2.count.value}', 34 | // style: const TextStyle(fontSize: 28), 35 | // ), 36 | // ), 37 | ], 38 | ), 39 | ), 40 | floatingActionButton: FloatingActionButton( 41 | child: const Icon(Icons.add), 42 | onPressed: () => controller.increment(), 43 | ), 44 | ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /lib/4_dependency_management/view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'controller.dart'; 5 | import 'detail_page.dart'; 6 | 7 | class DependencyManagementExample extends StatelessWidget { 8 | DependencyManagementExample({Key? key}) : super(key: key); 9 | 10 | // Singleton, one instance share with entire app 11 | // Controller controller = Controller(); 12 | // final controller = Get.put(Controller()); 13 | 14 | // Specific the type of controller 15 | // final parent = Get.put(Parent()); 16 | // final child = Get.put(Child()); 17 | 18 | // final child = Get.replace(Child()); 19 | // final child = Get.lazyReplacement(()=> Child()); 20 | 21 | // final controller2 = Get.put(Controller()); 22 | // final controller2 = Get.put( 23 | // // it can be a class of any type 24 | // Controller(), 25 | // // multiple classes that are of the same type 26 | // // using Get.find() with unique id 27 | // tag: 'uniqueId', 28 | // // kept instance throughout the entire app 29 | // // permanent: false, 30 | // ); 31 | 32 | @override 33 | Widget build(BuildContext context) { 34 | return GetMaterialApp( 35 | // initialBinding: DetailsBinding(), 36 | getPages: [ 37 | GetPage( 38 | name: '/detail', 39 | page: () => DetailPage(), 40 | //binding: DetailsBinding(), 41 | binding: BindingsBuilder( 42 | () { 43 | // lazyLoad a dependency only when is used. 44 | Get.lazyPut(() => Controller()); 45 | // Get.lazyPut( 46 | // // method that will be executed when your class 47 | // () => Controller(), 48 | // // same as Get.put() 49 | // // tag: 'uniqueId for lazyPut', 50 | // // It is similar to "permanent" 51 | // // recreate the instances from 'same place' 52 | // fenix: true, 53 | // ); 54 | 55 | // an async method that will be executed to instantiate 56 | // Get.putAsync( 57 | // () async { 58 | // await Future.delayed(const Duration(seconds: 3)); 59 | // return AsyncTask(); 60 | // }, 61 | // // using Get.find() with unique Id 62 | // // tag: `uniqueId for putAsync`, 63 | // // kept instance throughout the entire app 64 | // permanent: false, 65 | // ); 66 | 67 | // Create new instances every time, not Singleton 68 | Get.create( 69 | // a function that returns a class 70 | () => Controller(), 71 | // tag: `uniqueId `, 72 | permanent: true, 73 | ); 74 | Get.create( 75 | // a function that returns a class 76 | () => Controller(), 77 | // tag: `uniqueId `, 78 | permanent: true, 79 | ); 80 | }, 81 | ), 82 | ) 83 | ], 84 | debugShowCheckedModeBanner: false, 85 | theme: ThemeData(primarySwatch: Colors.deepPurple), 86 | home: Scaffold( 87 | appBar: AppBar(title: const Text('GetX Dependency Management')), 88 | body: Center( 89 | child: Column( 90 | mainAxisAlignment: MainAxisAlignment.center, 91 | children: [ 92 | // Reactive State Management 93 | // Obx( 94 | // () => Text( 95 | // '${controller.count.value}', 96 | // style: const TextStyle(fontSize: 28), 97 | // ), 98 | // ), 99 | // Obx( 100 | // () => Text( 101 | // '${controller2.count.value}', 102 | // style: const TextStyle(fontSize: 28), 103 | // ), 104 | // ), 105 | ElevatedButton( 106 | onPressed: () => Get.toNamed('/detail'), 107 | // onPressed: () => 108 | // Get.to(() => DetailPage(), binding: DetailsBinding()), 109 | child: const Text('Detail Page'), 110 | ), 111 | ], 112 | ), 113 | ), 114 | // floatingActionButton: FloatingActionButton( 115 | // child: const Icon(Icons.add), 116 | // //onPressed: () => Get.find().increment(), 117 | // onPressed: () => Get.find(tag: 'uniqueId').increment(), 118 | // //onPressed: () => controller.increment(), 119 | // ), 120 | ), 121 | ); 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /lib/5_translations/messages.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | /// For language code: `http://lingoes.net/en/translator/langcode.htm` 4 | /// For language code: `https://www.science.co.il/language/Codes.php` 5 | 6 | class Messages extends Translations { 7 | @override 8 | Map> get keys => { 9 | 'en_US': { 10 | 'hello': 'Hello World', 11 | 'logged_in': 'Logged in as: @name \n Email: @email' 12 | }, 13 | 'bn_BN': { 14 | 'hello': 'ওহে বিশ্ব', 15 | 'logged_in': 'এই নামে লগ-ইন করাঃ @name \n ই-মেইল: @email' 16 | }, 17 | 'es_ES': { 18 | 'hello': 'Hola Mundo', 19 | 'logged_in': 'Iniciado sesión como: @name \n E-mail: @email' 20 | }, 21 | 'de_DE': { 22 | 'hello': 'Hallo Welt', 23 | 'logged_in': 'Eingeloggt als: @name \n Email: @email' 24 | }, 25 | }; 26 | } 27 | -------------------------------------------------------------------------------- /lib/5_translations/translations_controller.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:get/get.dart'; 4 | 5 | class MessagesController extends GetxController { 6 | void changeLanguage(String languageCode, String countryCode) { 7 | var locale = Locale(languageCode, countryCode); 8 | Get.updateLocale(locale); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/5_translations/translations_example.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'messages.dart'; 5 | import 'translations_view.dart'; 6 | 7 | class TranslationExample extends StatelessWidget { 8 | const TranslationExample({Key? key}) : super(key: key); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return GetMaterialApp( 13 | // use custom translation 14 | translations: Messages(), 15 | // translations will be displayed in that locale 16 | locale: const Locale('en', 'US'), 17 | // system locale 18 | // locale: Get.deviceLocale, 19 | // specify the fallback locale in case an invalid locale 20 | fallbackLocale: const Locale('en', 'US'), 21 | debugShowCheckedModeBanner: false, 22 | theme: ThemeData(primarySwatch: Colors.deepPurple), 23 | home: TranslationView(), 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/5_translations/translations_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'translations_controller.dart'; 5 | 6 | class TranslationView extends StatelessWidget { 7 | TranslationView({Key? key}) : super(key: key); 8 | 9 | final messagesController = Get.put(MessagesController()); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | var products = []; 14 | return Scaffold( 15 | appBar: AppBar(title: const Text('GetX Internationalization')), 16 | body: Center( 17 | child: Column( 18 | mainAxisAlignment: MainAxisAlignment.center, 19 | children: [ 20 | Text( 21 | 'hello'.tr, 22 | style: const TextStyle(fontSize: 28), 23 | ), 24 | const SizedBox(height: 20), 25 | Text( 26 | 'logged_in' 27 | .trParams({'name': 'Siam', 'email': 'md.siam03@gmail.com'}), 28 | style: const TextStyle(fontSize: 22), 29 | textAlign: TextAlign.center, 30 | ), 31 | const SizedBox(height: 20), 32 | ElevatedButton( 33 | child: const Text('English'), 34 | onPressed: () => messagesController.changeLanguage('en', 'US'), 35 | ), 36 | const SizedBox(height: 10), 37 | ElevatedButton( 38 | child: const Text('Bengali'), 39 | onPressed: () => messagesController.changeLanguage('bn', 'BN'), 40 | ), 41 | const SizedBox(height: 10), 42 | ElevatedButton( 43 | child: const Text('Spanish'), 44 | onPressed: () => messagesController.changeLanguage('es', 'ES'), 45 | ), 46 | const SizedBox(height: 10), 47 | ElevatedButton( 48 | child: const Text('German'), 49 | onPressed: () => messagesController.changeLanguage('de', 'DE'), 50 | ), 51 | ], 52 | ), 53 | ), 54 | ); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /lib/6_themes/themes.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class Themes { 4 | static final lightTheme = ThemeData( 5 | colorScheme: const ColorScheme.light(), 6 | ); 7 | static final darkTheme = ThemeData( 8 | colorScheme: const ColorScheme.dark(), 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /lib/6_themes/themes_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | import 'package:get_storage/get_storage.dart'; 4 | 5 | class ThemeController extends GetxController { 6 | // Get the instance of GetStorage 7 | final _box = GetStorage(); 8 | final _key = 'isDarkMode'; 9 | 10 | // Get the theme mode from local storage 11 | ThemeMode get theme => _loadTheme() ? ThemeMode.dark : ThemeMode.light; 12 | 13 | bool _loadTheme() => _box.read(_key) ?? false; 14 | 15 | void saveTheme(bool isDarkMode) => _box.write(_key, isDarkMode); 16 | 17 | void changeTheme(ThemeData theme) => Get.changeTheme(theme); 18 | 19 | void changeThemeMode(ThemeMode themeMode) => Get.changeThemeMode(themeMode); 20 | } 21 | -------------------------------------------------------------------------------- /lib/6_themes/themes_example.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'themes.dart'; 5 | import 'themes_controller.dart'; 6 | import 'themes_view.dart'; 7 | 8 | class ThemesExample extends StatelessWidget { 9 | ThemesExample({Key? key}) : super(key: key); 10 | 11 | final themeController = Get.put(ThemeController()); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return GetMaterialApp( 16 | // change themeMode instead of Theme 17 | themeMode: themeController.theme, 18 | theme: Themes.lightTheme, 19 | darkTheme: Themes.darkTheme, 20 | debugShowCheckedModeBanner: false, 21 | home: ThemesView(), 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/6_themes/themes_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'themes_controller.dart'; 5 | 6 | class ThemesView extends StatelessWidget { 7 | ThemesView({Key? key}) : super(key: key); 8 | 9 | final themeController = Get.find(); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Scaffold( 14 | appBar: AppBar(title: const Text('GetX Change Theme')), 15 | body: Center( 16 | child: Column( 17 | mainAxisAlignment: MainAxisAlignment.center, 18 | children: [ 19 | const Text( 20 | 'GetX Theme', 21 | style: TextStyle(fontSize: 25), 22 | ), 23 | const SizedBox(height: 10), 24 | ElevatedButton( 25 | child: const Text('Change Theme'), 26 | onPressed: () { 27 | if (Get.isDarkMode) { 28 | // Change the theme mode to light mode 29 | themeController.changeThemeMode(ThemeMode.light); 30 | // Change the theme to light theme 31 | // themeController.changeTheme(Themes.lightTheme); 32 | themeController.saveTheme(false); 33 | } else { 34 | // Change the theme mode to dark mode 35 | themeController.changeThemeMode(ThemeMode.dark); 36 | // Change the theme to dark theme 37 | // themeController.changeTheme(Themes.darkTheme); 38 | themeController.saveTheme(true); 39 | } 40 | }, 41 | ), 42 | ], 43 | ), 44 | ), 45 | ); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /lib/7_getx_service_&_get_view/service_example.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'service_view.dart'; 5 | 6 | class ServiceExample extends StatelessWidget { 7 | const ServiceExample({Key? key}) : super(key: key); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return GetMaterialApp( 12 | debugShowCheckedModeBanner: false, 13 | theme: ThemeData(primarySwatch: Colors.deepPurple), 14 | home: const ServiceView(), 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/7_getx_service_&_get_view/service_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import 'settings_service.dart'; 5 | 6 | class ServiceView extends GetView { 7 | const ServiceView({Key? key}) : super(key: key); 8 | 9 | // final controller = Get.find(); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Scaffold( 14 | appBar: AppBar(title: const Text('GetX Service')), 15 | body: Center( 16 | child: Column( 17 | mainAxisAlignment: MainAxisAlignment.center, 18 | children: [ 19 | Obx( 20 | () => Text( 21 | 'Pressed ${controller.counter} times', 22 | style: const TextStyle(fontSize: 22), 23 | ), 24 | ), 25 | const SizedBox(height: 20), 26 | ElevatedButton( 27 | child: const Text('Increment'), 28 | onPressed: () { 29 | controller.incrementCounter(); 30 | }, 31 | ), 32 | ElevatedButton( 33 | child: const Text('Reset Counter'), 34 | onPressed: () { 35 | controller.resetCounter(); 36 | }, 37 | ), 38 | ], 39 | ), 40 | ), 41 | ); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /lib/7_getx_service_&_get_view/settings_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | import 'package:shared_preferences/shared_preferences.dart'; 4 | 5 | class SettingsService extends GetxService { 6 | late SharedPreferences _prefs; 7 | final counter = 0.obs; 8 | 9 | Future init() async { 10 | debugPrint('$runtimeType initialize shared preference'); 11 | _prefs = await SharedPreferences.getInstance(); 12 | debugPrint('$runtimeType shared preference ready!'); 13 | counter.value = _prefs.getInt('counter') ?? 0; 14 | return this; 15 | } 16 | 17 | Future incrementCounter() async { 18 | counter.value = (_prefs.getInt('counter')! + 1); 19 | _prefs.setInt('counter', counter.value); 20 | } 21 | 22 | Future resetCounter() async { 23 | counter.value = 0; 24 | _prefs.setInt('counter', counter.value); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/8_get_widget/get_widget_example.dart: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/lib/8_get_widget/get_widget_example.dart -------------------------------------------------------------------------------- /lib/9_get_connect/get_connect_example.dart: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/lib/9_get_connect/get_connect_example.dart -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | import 'package:getx_tutorial/routes.dart'; 4 | 5 | void main() async { 6 | // await GetStorage.init(); 7 | WidgetsFlutterBinding.ensureInitialized(); 8 | await initServices(); // AWAIT SERVICES INITIALIZATION 9 | runApp(const MyApp()); 10 | } 11 | 12 | Future initServices() async { 13 | debugPrint('starting services...'); 14 | // Here is where you put get_storage, hive, shared_pref initialization 15 | // or moor connection, or whatever that's async. 16 | await Get.putAsync(() => SettingsService().init()); 17 | debugPrint('services started...'); 18 | } 19 | 20 | class MyApp extends StatelessWidget { 21 | const MyApp({Key? key}) : super(key: key); 22 | 23 | @override 24 | Widget build(BuildContext context) { 25 | return MaterialApp( 26 | debugShowCheckedModeBanner: false, 27 | title: 'GetX Tutorial', 28 | theme: ThemeData( 29 | primarySwatch: Colors.deepPurple, 30 | useMaterial3: true, 31 | ), 32 | home: const MyGetNavigation(), 33 | //home: ReactiveStateManagement(), 34 | //home: const SimpleStateManagement(), 35 | //home: GetXControllerExample(), 36 | //home: GetXControllerExample(), 37 | //home: DependencyManagementExample(), 38 | //home: const TranslationExample(), 39 | //home: ThemesExample(), 40 | //home: const ServiceExample(), 41 | ); 42 | } 43 | } 44 | 45 | -------------------------------------------------------------------------------- /lib/routes.dart: -------------------------------------------------------------------------------- 1 | export '1_navigation/navigation.dart'; 2 | export '2_state_management/reactive/reactive_state_management.dart'; 3 | export '2_state_management/simple/simple_state_management.dart'; 4 | export '3_getx_controller/view.dart'; 5 | export '4_dependency_management/view.dart'; 6 | export '5_translations/translations_example.dart'; 7 | export '6_themes/themes_example.dart'; 8 | export '7_getx_service_&_get_view/service_example.dart'; 9 | export '7_getx_service_&_get_view/settings_service.dart'; 10 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.11.0" 12 | boolean_selector: 13 | dependency: transitive 14 | description: 15 | name: boolean_selector 16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.1.1" 20 | characters: 21 | dependency: transitive 22 | description: 23 | name: characters 24 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "1.3.0" 28 | clock: 29 | dependency: transitive 30 | description: 31 | name: clock 32 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "1.1.1" 36 | collection: 37 | dependency: transitive 38 | description: 39 | name: collection 40 | sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.17.1" 44 | cupertino_icons: 45 | dependency: "direct main" 46 | description: 47 | name: cupertino_icons 48 | sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.0.6" 52 | fake_async: 53 | dependency: transitive 54 | description: 55 | name: fake_async 56 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.3.1" 60 | ffi: 61 | dependency: transitive 62 | description: 63 | name: ffi 64 | sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "2.1.0" 68 | file: 69 | dependency: transitive 70 | description: 71 | name: file 72 | sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "7.0.0" 76 | flutter: 77 | dependency: "direct main" 78 | description: flutter 79 | source: sdk 80 | version: "0.0.0" 81 | flutter_lints: 82 | dependency: "direct dev" 83 | description: 84 | name: flutter_lints 85 | sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 86 | url: "https://pub.dev" 87 | source: hosted 88 | version: "2.0.3" 89 | flutter_test: 90 | dependency: "direct dev" 91 | description: flutter 92 | source: sdk 93 | version: "0.0.0" 94 | flutter_web_plugins: 95 | dependency: transitive 96 | description: flutter 97 | source: sdk 98 | version: "0.0.0" 99 | get: 100 | dependency: "direct main" 101 | description: 102 | name: get 103 | sha256: "2ba20a47c8f1f233bed775ba2dd0d3ac97b4cf32fc17731b3dfc672b06b0e92a" 104 | url: "https://pub.dev" 105 | source: hosted 106 | version: "4.6.5" 107 | get_storage: 108 | dependency: "direct main" 109 | description: 110 | name: get_storage 111 | sha256: "39db1fffe779d0c22b3a744376e86febe4ade43bf65e06eab5af707dc84185a2" 112 | url: "https://pub.dev" 113 | source: hosted 114 | version: "2.1.1" 115 | js: 116 | dependency: transitive 117 | description: 118 | name: js 119 | sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 120 | url: "https://pub.dev" 121 | source: hosted 122 | version: "0.6.7" 123 | lints: 124 | dependency: transitive 125 | description: 126 | name: lints 127 | sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" 128 | url: "https://pub.dev" 129 | source: hosted 130 | version: "2.1.1" 131 | matcher: 132 | dependency: transitive 133 | description: 134 | name: matcher 135 | sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" 136 | url: "https://pub.dev" 137 | source: hosted 138 | version: "0.12.15" 139 | material_color_utilities: 140 | dependency: transitive 141 | description: 142 | name: material_color_utilities 143 | sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 144 | url: "https://pub.dev" 145 | source: hosted 146 | version: "0.2.0" 147 | meta: 148 | dependency: transitive 149 | description: 150 | name: meta 151 | sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" 152 | url: "https://pub.dev" 153 | source: hosted 154 | version: "1.9.1" 155 | path: 156 | dependency: transitive 157 | description: 158 | name: path 159 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" 160 | url: "https://pub.dev" 161 | source: hosted 162 | version: "1.8.3" 163 | path_provider: 164 | dependency: transitive 165 | description: 166 | name: path_provider 167 | sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa 168 | url: "https://pub.dev" 169 | source: hosted 170 | version: "2.1.1" 171 | path_provider_android: 172 | dependency: transitive 173 | description: 174 | name: path_provider_android 175 | sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72 176 | url: "https://pub.dev" 177 | source: hosted 178 | version: "2.2.1" 179 | path_provider_foundation: 180 | dependency: transitive 181 | description: 182 | name: path_provider_foundation 183 | sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" 184 | url: "https://pub.dev" 185 | source: hosted 186 | version: "2.3.1" 187 | path_provider_linux: 188 | dependency: transitive 189 | description: 190 | name: path_provider_linux 191 | sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 192 | url: "https://pub.dev" 193 | source: hosted 194 | version: "2.2.1" 195 | path_provider_platform_interface: 196 | dependency: transitive 197 | description: 198 | name: path_provider_platform_interface 199 | sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" 200 | url: "https://pub.dev" 201 | source: hosted 202 | version: "2.1.1" 203 | path_provider_windows: 204 | dependency: transitive 205 | description: 206 | name: path_provider_windows 207 | sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" 208 | url: "https://pub.dev" 209 | source: hosted 210 | version: "2.2.1" 211 | platform: 212 | dependency: transitive 213 | description: 214 | name: platform 215 | sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" 216 | url: "https://pub.dev" 217 | source: hosted 218 | version: "3.1.3" 219 | plugin_platform_interface: 220 | dependency: transitive 221 | description: 222 | name: plugin_platform_interface 223 | sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d 224 | url: "https://pub.dev" 225 | source: hosted 226 | version: "2.1.6" 227 | shared_preferences: 228 | dependency: "direct main" 229 | description: 230 | name: shared_preferences 231 | sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" 232 | url: "https://pub.dev" 233 | source: hosted 234 | version: "2.2.2" 235 | shared_preferences_android: 236 | dependency: transitive 237 | description: 238 | name: shared_preferences_android 239 | sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" 240 | url: "https://pub.dev" 241 | source: hosted 242 | version: "2.2.1" 243 | shared_preferences_foundation: 244 | dependency: transitive 245 | description: 246 | name: shared_preferences_foundation 247 | sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" 248 | url: "https://pub.dev" 249 | source: hosted 250 | version: "2.3.4" 251 | shared_preferences_linux: 252 | dependency: transitive 253 | description: 254 | name: shared_preferences_linux 255 | sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" 256 | url: "https://pub.dev" 257 | source: hosted 258 | version: "2.3.2" 259 | shared_preferences_platform_interface: 260 | dependency: transitive 261 | description: 262 | name: shared_preferences_platform_interface 263 | sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a 264 | url: "https://pub.dev" 265 | source: hosted 266 | version: "2.3.1" 267 | shared_preferences_web: 268 | dependency: transitive 269 | description: 270 | name: shared_preferences_web 271 | sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf 272 | url: "https://pub.dev" 273 | source: hosted 274 | version: "2.2.1" 275 | shared_preferences_windows: 276 | dependency: transitive 277 | description: 278 | name: shared_preferences_windows 279 | sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" 280 | url: "https://pub.dev" 281 | source: hosted 282 | version: "2.3.2" 283 | sky_engine: 284 | dependency: transitive 285 | description: flutter 286 | source: sdk 287 | version: "0.0.99" 288 | source_span: 289 | dependency: transitive 290 | description: 291 | name: source_span 292 | sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 293 | url: "https://pub.dev" 294 | source: hosted 295 | version: "1.9.1" 296 | stack_trace: 297 | dependency: transitive 298 | description: 299 | name: stack_trace 300 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 301 | url: "https://pub.dev" 302 | source: hosted 303 | version: "1.11.0" 304 | stream_channel: 305 | dependency: transitive 306 | description: 307 | name: stream_channel 308 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 309 | url: "https://pub.dev" 310 | source: hosted 311 | version: "2.1.1" 312 | string_scanner: 313 | dependency: transitive 314 | description: 315 | name: string_scanner 316 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 317 | url: "https://pub.dev" 318 | source: hosted 319 | version: "1.2.0" 320 | term_glyph: 321 | dependency: transitive 322 | description: 323 | name: term_glyph 324 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 325 | url: "https://pub.dev" 326 | source: hosted 327 | version: "1.2.1" 328 | test_api: 329 | dependency: transitive 330 | description: 331 | name: test_api 332 | sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb 333 | url: "https://pub.dev" 334 | source: hosted 335 | version: "0.5.1" 336 | vector_math: 337 | dependency: transitive 338 | description: 339 | name: vector_math 340 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 341 | url: "https://pub.dev" 342 | source: hosted 343 | version: "2.1.4" 344 | win32: 345 | dependency: transitive 346 | description: 347 | name: win32 348 | sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" 349 | url: "https://pub.dev" 350 | source: hosted 351 | version: "5.0.9" 352 | xdg_directories: 353 | dependency: transitive 354 | description: 355 | name: xdg_directories 356 | sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" 357 | url: "https://pub.dev" 358 | source: hosted 359 | version: "1.0.3" 360 | sdks: 361 | dart: ">=3.0.6 <4.0.0" 362 | flutter: ">=3.7.0" 363 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: getx_tutorial 2 | description: A new Flutter project. 3 | # The following line prevents the package from being accidentally published to 4 | # pub.dev using `flutter pub publish`. This is preferred for private packages. 5 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 6 | 7 | # The following defines the version and build number for your application. 8 | # A version number is three numbers separated by dots, like 1.2.43 9 | # followed by an optional build number separated by a +. 10 | # Both the version and the builder number may be overridden in flutter 11 | # build by specifying --build-name and --build-number, respectively. 12 | # In Android, build-name is used as versionName while build-number used as versionCode. 13 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 14 | # In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. 15 | # Read more about iOS versioning at 16 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 17 | # In Windows, build-name is used as the major, minor, and patch parts 18 | # of the product and file versions while build-number is used as the build suffix. 19 | version: 1.0.0+1 20 | 21 | environment: 22 | sdk: '>=3.0.6 <4.0.0' 23 | 24 | # Dependencies specify other packages that your package needs in order to work. 25 | # To automatically upgrade your package dependencies to the latest versions 26 | # consider running `flutter pub upgrade --major-versions`. Alternatively, 27 | # dependencies can be manually updated by changing the version numbers below to 28 | # the latest version available on pub.dev. To see which dependencies have newer 29 | # versions available, run `flutter pub outdated`. 30 | dependencies: 31 | flutter: 32 | sdk: flutter 33 | 34 | 35 | # The following adds the Cupertino Icons font to your application. 36 | # Use with the CupertinoIcons class for iOS style icons. 37 | cupertino_icons: ^1.0.2 38 | get: ^4.6.3 39 | get_storage: ^2.0.3 40 | shared_preferences: ^2.0.15 41 | 42 | dev_dependencies: 43 | flutter_test: 44 | sdk: flutter 45 | 46 | # The "flutter_lints" package below contains a set of recommended lints to 47 | # encourage good coding practices. The lint set provided by the package is 48 | # activated in the `analysis_options.yaml` file located at the root of your 49 | # package. See that file for information about deactivating specific lint 50 | # rules and activating additional ones. 51 | flutter_lints: ^2.0.0 52 | 53 | # For information on the generic Dart part of this file, see the 54 | # following page: https://dart.dev/tools/pub/pubspec 55 | 56 | # The following section is specific to Flutter packages. 57 | flutter: 58 | 59 | # The following line ensures that the Material Icons font is 60 | # included with your application, so that you can use the icons in 61 | # the material Icons class. 62 | uses-material-design: true 63 | 64 | # To add assets to your application, add an assets section, like this: 65 | # assets: 66 | # - images/a_dot_burr.jpeg 67 | # - images/a_dot_ham.jpeg 68 | 69 | # An image asset can refer to one or more resolution-specific "variants", see 70 | # https://flutter.dev/assets-and-images/#resolution-aware 71 | 72 | # For details regarding adding assets from package dependencies, see 73 | # https://flutter.dev/assets-and-images/#from-packages 74 | 75 | # To add custom fonts to your application, add a fonts section here, 76 | # in this "flutter" section. Each entry in this list should have a 77 | # "family" key with the font family name, and a "fonts" key with a 78 | # list giving the asset and other descriptors for the font. For 79 | # example: 80 | # fonts: 81 | # - family: Schyler 82 | # fonts: 83 | # - asset: fonts/Schyler-Regular.ttf 84 | # - asset: fonts/Schyler-Italic.ttf 85 | # style: italic 86 | # - family: Trajan Pro 87 | # fonts: 88 | # - asset: fonts/TrajanPro.ttf 89 | # - asset: fonts/TrajanPro_Bold.ttf 90 | # weight: 700 91 | # 92 | # For details regarding fonts from package dependencies, 93 | # see https://flutter.dev/custom-fonts/#from-packages 94 | -------------------------------------------------------------------------------- /screenshots/badges/Dart-0175C2.svg: -------------------------------------------------------------------------------- 1 | DARTDART -------------------------------------------------------------------------------- /screenshots/badges/Flutter-02569B.svg: -------------------------------------------------------------------------------- 1 | FLUTTERFLUTTER -------------------------------------------------------------------------------- /screenshots/badges/Flutter-3.svg: -------------------------------------------------------------------------------- 1 | FLUTTER 3.0FLUTTER 3.0 -------------------------------------------------------------------------------- /screenshots/badges/built-with-love.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenshots/badges/dart-null_safety-blue.svg: -------------------------------------------------------------------------------- 1 | Dart: Null SafetyDartNull Safety -------------------------------------------------------------------------------- /screenshots/badges/flutter-dart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenshots/badges/license-MIT.svg: -------------------------------------------------------------------------------- 1 | LICENSE: MITLICENSEMIT -------------------------------------------------------------------------------- /screenshots/images/JSON_Viewer_pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/screenshots/images/JSON_Viewer_pro.png -------------------------------------------------------------------------------- /screenshots/images/change_theme.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/screenshots/images/change_theme.gif -------------------------------------------------------------------------------- /screenshots/images/dependency_management.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/screenshots/images/dependency_management.gif -------------------------------------------------------------------------------- /screenshots/images/getx_service_-_get_view.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/screenshots/images/getx_service_-_get_view.gif -------------------------------------------------------------------------------- /screenshots/images/internationalization.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/screenshots/images/internationalization.gif -------------------------------------------------------------------------------- /screenshots/images/navigation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/screenshots/images/navigation.gif -------------------------------------------------------------------------------- /screenshots/images/reactive_state_controller.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/screenshots/images/reactive_state_controller.gif -------------------------------------------------------------------------------- /screenshots/images/reactive_state_management.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/screenshots/images/reactive_state_management.gif -------------------------------------------------------------------------------- /screenshots/images/simple_state_controller.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/screenshots/images/simple_state_controller.gif -------------------------------------------------------------------------------- /screenshots/images/simple_state_management.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/screenshots/images/simple_state_management.gif -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility in the flutter_test package. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:getx_tutorial/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(const MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/getx_tutorial/6f607b657772ee80b4e283d6988517d9887b4708/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | getx_tutorial 33 | 34 | 35 | 39 | 40 | 41 | 42 | 43 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "getx_tutorial", 3 | "short_name": "getx_tutorial", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | --------------------------------------------------------------------------------