├── .editorconfig ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE.md ├── LICENSE ├── README.md ├── android ├── app │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── flutterexampleapp │ │ │ └── MainActivity.java │ │ └── res │ │ ├── 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 │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── fonts │ ├── Roboto-Black.ttf │ ├── Roboto-Bold.ttf │ ├── Roboto-Light.ttf │ ├── Roboto-Medium.ttf │ ├── Roboto-Regular.ttf │ └── Roboto-Thin.ttf └── images │ └── icon.png ├── ios ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── GoogleService-Info.plist │ ├── Info.plist │ └── main.m ├── lib ├── l10n │ ├── intl_en.arb │ ├── intl_es.arb │ ├── intl_messages.arb │ ├── messages_all.dart │ ├── messages_en.dart │ ├── messages_es.dart │ └── messages_messages.dart ├── localizations.dart ├── main.dart └── tabs │ ├── first.dart │ ├── second.dart │ └── third.dart ├── pubspec.yaml └── test └── widget_test.dart /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Flutter Generated 2 | 3 | # Miscellaneous 4 | *.class 5 | *.lock 6 | *.log 7 | *.pyc 8 | *.swp 9 | .DS_Store 10 | .atom/ 11 | .buildlog/ 12 | .history 13 | .svn/ 14 | 15 | # IntelliJ related 16 | *.iml 17 | *.ipr 18 | *.iws 19 | .idea/ 20 | 21 | # Visual Studio Code related 22 | .vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | .dart_tool/ 27 | .flutter-plugins 28 | .packages 29 | .pub-cache/ 30 | .pub/ 31 | build/ 32 | 33 | # Android related 34 | **/android/**/gradle-wrapper.jar 35 | **/android/.gradle 36 | **/android/captures/ 37 | **/android/gradlew 38 | **/android/gradlew.bat 39 | **/android/local.properties 40 | **/android/**/GeneratedPluginRegistrant.java 41 | 42 | # iOS/XCode related 43 | **/ios/**/*.mode1v3 44 | **/ios/**/*.mode2v3 45 | **/ios/**/*.moved-aside 46 | **/ios/**/*.pbxuser 47 | **/ios/**/*.perspectivev3 48 | **/ios/**/*sync/ 49 | **/ios/**/.sconsign.dblite 50 | **/ios/**/.tags* 51 | **/ios/**/.vagrant/ 52 | **/ios/**/DerivedData/ 53 | **/ios/**/Icon? 54 | **/ios/**/Pods/ 55 | **/ios/**/.symlinks/ 56 | **/ios/**/profile 57 | **/ios/**/xcuserdata 58 | **/ios/.generated/ 59 | **/ios/Flutter/App.framework 60 | **/ios/Flutter/Flutter.framework 61 | **/ios/Flutter/Generated.xcconfig 62 | **/ios/Flutter/app.flx 63 | **/ios/Flutter/app.zip 64 | **/ios/Flutter/flutter_assets/ 65 | **/ios/ServiceDefinitions.json 66 | **/ios/Runner/GeneratedPluginRegistrant.* 67 | 68 | 69 | ### https://raw.github.com/github/gitignore//Android.gitignore 70 | 71 | # Built application files 72 | *.apk 73 | *.ap_ 74 | 75 | # Files for the ART/Dalvik VM 76 | *.dex 77 | 78 | # Java class files 79 | *.class 80 | 81 | # Generated files 82 | bin/ 83 | gen/ 84 | out/ 85 | 86 | # Gradle files 87 | .gradle/ 88 | build/ 89 | 90 | # Local configuration file (sdk path, etc) 91 | local.properties 92 | 93 | # Proguard folder generated by Eclipse 94 | proguard/ 95 | 96 | # Log Files 97 | *.log 98 | 99 | # Android Studio Navigation editor temp files 100 | .navigation/ 101 | 102 | # Android Studio captures folder 103 | captures/ 104 | 105 | # IntelliJ 106 | *.iml 107 | .idea/workspace.xml 108 | .idea/tasks.xml 109 | .idea/gradle.xml 110 | .idea/assetWizardSettings.xml 111 | .idea/dictionaries 112 | .idea/libraries 113 | .idea/caches 114 | 115 | # Keystore files 116 | # Uncomment the following line if you do not want to check your keystore files in. 117 | #*.jks 118 | 119 | # External native build folder generated in Android Studio 2.2 and later 120 | .externalNativeBuild 121 | 122 | # Google Services (e.g. APIs or Firebase) 123 | google-services.json 124 | 125 | # Freeline 126 | freeline.py 127 | freeline/ 128 | freeline_project_description.json 129 | 130 | # fastlane 131 | fastlane/report.xml 132 | fastlane/Preview.html 133 | fastlane/screenshots 134 | fastlane/test_output 135 | fastlane/readme.md 136 | 137 | 138 | ### https://raw.github.com/github/gitignore//Dart.gitignore 139 | 140 | # See https://www.dartlang.org/guides/libraries/private-files 141 | 142 | # Files and directories created by pub 143 | .dart_tool/ 144 | .packages 145 | build/ 146 | # If you're building an application, you may want to check-in your pubspec.lock 147 | pubspec.lock 148 | 149 | # Directory created by dartdoc 150 | # If you don't generate documentation locally you can remove this line. 151 | doc/api/ 152 | 153 | # Avoid committing generated Javascript files: 154 | *.dart.js 155 | *.info.json # Produced by the --dump-info flag. 156 | *.js # When generated by dart2js. Don't specify *.js if your 157 | # project includes source files written in JavaScript. 158 | *.js_ 159 | *.js.deps 160 | *.js.map 161 | 162 | 163 | ### https://raw.github.com/github/gitignore//Global/JetBrains.gitignore 164 | 165 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm 166 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 167 | 168 | # User-specific stuff 169 | .idea/**/workspace.xml 170 | .idea/**/tasks.xml 171 | .idea/**/usage.statistics.xml 172 | .idea/**/dictionaries 173 | .idea/**/shelf 174 | 175 | # Generated files 176 | .idea/**/contentModel.xml 177 | 178 | # Sensitive or high-churn files 179 | .idea/**/dataSources/ 180 | .idea/**/dataSources.ids 181 | .idea/**/dataSources.local.xml 182 | .idea/**/sqlDataSources.xml 183 | .idea/**/dynamic.xml 184 | .idea/**/uiDesigner.xml 185 | .idea/**/dbnavigator.xml 186 | 187 | # Gradle 188 | .idea/**/gradle.xml 189 | .idea/**/libraries 190 | 191 | # Gradle and Maven with auto-import 192 | # When using Gradle or Maven with auto-import, you should exclude module files, 193 | # since they will be recreated, and may cause churn. Uncomment if using 194 | # auto-import. 195 | # .idea/modules.xml 196 | # .idea/*.iml 197 | # .idea/modules 198 | 199 | # CMake 200 | cmake-build-*/ 201 | 202 | # Mongo Explorer plugin 203 | .idea/**/mongoSettings.xml 204 | 205 | # File-based project format 206 | *.iws 207 | 208 | # IntelliJ 209 | out/ 210 | 211 | # mpeltonen/sbt-idea plugin 212 | .idea_modules/ 213 | 214 | # JIRA plugin 215 | atlassian-ide-plugin.xml 216 | 217 | # Cursive Clojure plugin 218 | .idea/replstate.xml 219 | 220 | # Crashlytics plugin (for Android Studio and IntelliJ) 221 | com_crashlytics_export_strings.xml 222 | crashlytics.properties 223 | crashlytics-build.properties 224 | fabric.properties 225 | 226 | # Editor-based Rest Client 227 | .idea/httpRequests 228 | 229 | # Android studio 3.1+ serialized cache file 230 | .idea/caches/build_file_checksums.ser 231 | 232 | 233 | ### https://raw.github.com/github/gitignore//Global/macOS.gitignore 234 | 235 | # General 236 | .DS_Store 237 | .AppleDouble 238 | .LSOverride 239 | 240 | # Icon must end with two \r 241 | Icon 242 | 243 | 244 | # Thumbnails 245 | ._* 246 | 247 | # Files that might appear in the root of a volume 248 | .DocumentRevisions-V100 249 | .fseventsd 250 | .Spotlight-V100 251 | .TemporaryItems 252 | .Trashes 253 | .VolumeIcon.icns 254 | .com.apple.timemachine.donotpresent 255 | 256 | # Directories potentially created on remote AFP share 257 | .AppleDB 258 | .AppleDesktop 259 | Network Trash Folder 260 | Temporary Items 261 | .apdisk 262 | 263 | 264 | ### https://raw.github.com/github/gitignore//Global/Xcode.gitignore 265 | 266 | # Xcode 267 | # 268 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 269 | 270 | ## User settings 271 | xcuserdata/ 272 | 273 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 274 | *.xcscmblueprint 275 | *.xccheckout 276 | 277 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 278 | build/ 279 | DerivedData/ 280 | *.moved-aside 281 | *.pbxuser 282 | !default.pbxuser 283 | *.mode1v3 284 | !default.mode1v3 285 | *.mode2v3 286 | !default.mode2v3 287 | *.perspectivev3 288 | !default.perspectivev3 289 | 290 | 291 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/Archives.gitignore 292 | 293 | # It's better to unpack these files and commit the raw source because 294 | # git has its own built in compression methods. 295 | *.7z 296 | *.jar 297 | *.rar 298 | *.zip 299 | *.gz 300 | *.tgz 301 | *.bzip 302 | *.bz2 303 | *.xz 304 | *.lzma 305 | *.cab 306 | 307 | # Packing-only formats 308 | *.iso 309 | *.tar 310 | 311 | # Package management formats 312 | *.dmg 313 | *.xpi 314 | *.gem 315 | *.egg 316 | *.deb 317 | *.rpm 318 | *.msi 319 | *.msm 320 | *.msp 321 | 322 | 323 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/Backup.gitignore 324 | 325 | *.bak 326 | *.gho 327 | *.ori 328 | *.orig 329 | *.tmp 330 | 331 | 332 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Android.gitignore 333 | 334 | # Built application files 335 | *.apk 336 | *.ap_ 337 | 338 | # Files for the ART/Dalvik VM 339 | *.dex 340 | 341 | # Java class files 342 | *.class 343 | 344 | # Generated files 345 | bin/ 346 | gen/ 347 | out/ 348 | 349 | # Gradle files 350 | .gradle/ 351 | build/ 352 | 353 | # Local configuration file (sdk path, etc) 354 | local.properties 355 | 356 | # Proguard folder generated by Eclipse 357 | proguard/ 358 | 359 | # Log Files 360 | *.log 361 | 362 | # Android Studio Navigation editor temp files 363 | .navigation/ 364 | 365 | # Android Studio captures folder 366 | captures/ 367 | 368 | # IntelliJ 369 | *.iml 370 | .idea/workspace.xml 371 | .idea/tasks.xml 372 | .idea/gradle.xml 373 | .idea/assetWizardSettings.xml 374 | .idea/dictionaries 375 | .idea/libraries 376 | .idea/caches 377 | 378 | # Keystore files 379 | # Uncomment the following line if you do not want to check your keystore files in. 380 | #*.jks 381 | 382 | # External native build folder generated in Android Studio 2.2 and later 383 | .externalNativeBuild 384 | 385 | # Google Services (e.g. APIs or Firebase) 386 | google-services.json 387 | 388 | # Freeline 389 | freeline.py 390 | freeline/ 391 | freeline_project_description.json 392 | 393 | # fastlane 394 | fastlane/report.xml 395 | fastlane/Preview.html 396 | fastlane/screenshots 397 | fastlane/test_output 398 | fastlane/readme.md 399 | 400 | 401 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Dart.gitignore 402 | 403 | # See https://www.dartlang.org/guides/libraries/private-files 404 | 405 | # Files and directories created by pub 406 | .dart_tool/ 407 | .packages 408 | build/ 409 | # If you're building an application, you may want to check-in your pubspec.lock 410 | pubspec.lock 411 | 412 | # Directory created by dartdoc 413 | # If you don't generate documentation locally you can remove this line. 414 | doc/api/ 415 | 416 | # Avoid committing generated Javascript files: 417 | *.dart.js 418 | *.info.json # Produced by the --dump-info flag. 419 | *.js # When generated by dart2js. Don't specify *.js if your 420 | # project includes source files written in JavaScript. 421 | *.js_ 422 | *.js.deps 423 | *.js.map 424 | 425 | 426 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/DartEditor.gitignore 427 | 428 | .project 429 | .buildlog 430 | 431 | 432 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/Emacs.gitignore 433 | 434 | # -*- mode: gitignore; -*- 435 | *~ 436 | \#*\# 437 | /.emacs.desktop 438 | /.emacs.desktop.lock 439 | *.elc 440 | auto-save-list 441 | tramp 442 | .\#* 443 | 444 | # Org-mode 445 | .org-id-locations 446 | *_archive 447 | 448 | # flymake-mode 449 | *_flymake.* 450 | 451 | # eshell files 452 | /eshell/history 453 | /eshell/lastdir 454 | 455 | # elpa packages 456 | /elpa/ 457 | 458 | # reftex files 459 | *.rel 460 | 461 | # AUCTeX auto folder 462 | /auto/ 463 | 464 | # cask packages 465 | .cask/ 466 | dist/ 467 | 468 | # Flycheck 469 | flycheck_*.el 470 | 471 | # server auth directory 472 | /server/ 473 | 474 | # projectiles files 475 | .projectile 476 | 477 | # directory configuration 478 | .dir-locals.el 479 | 480 | 481 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Gradle.gitignore 482 | 483 | .gradle 484 | /build/ 485 | 486 | # Ignore Gradle GUI config 487 | gradle-app.setting 488 | 489 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) 490 | !gradle-wrapper.jar 491 | 492 | # Cache of project 493 | .gradletasknamecache 494 | 495 | # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 496 | # gradle/wrapper/gradle-wrapper.properties 497 | 498 | 499 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Java.gitignore 500 | 501 | # Compiled class file 502 | *.class 503 | 504 | # Log file 505 | *.log 506 | 507 | # BlueJ files 508 | *.ctxt 509 | 510 | # Mobile Tools for Java (J2ME) 511 | .mtj.tmp/ 512 | 513 | # Package Files # 514 | *.jar 515 | *.war 516 | *.nar 517 | *.ear 518 | *.zip 519 | *.tar.gz 520 | *.rar 521 | 522 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 523 | hs_err_pid* 524 | 525 | 526 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/JetBrains.gitignore 527 | 528 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm 529 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 530 | 531 | # User-specific stuff 532 | .idea/**/workspace.xml 533 | .idea/**/tasks.xml 534 | .idea/**/usage.statistics.xml 535 | .idea/**/dictionaries 536 | .idea/**/shelf 537 | 538 | # Generated files 539 | .idea/**/contentModel.xml 540 | 541 | # Sensitive or high-churn files 542 | .idea/**/dataSources/ 543 | .idea/**/dataSources.ids 544 | .idea/**/dataSources.local.xml 545 | .idea/**/sqlDataSources.xml 546 | .idea/**/dynamic.xml 547 | .idea/**/uiDesigner.xml 548 | .idea/**/dbnavigator.xml 549 | 550 | # Gradle 551 | .idea/**/gradle.xml 552 | .idea/**/libraries 553 | 554 | # Gradle and Maven with auto-import 555 | # When using Gradle or Maven with auto-import, you should exclude module files, 556 | # since they will be recreated, and may cause churn. Uncomment if using 557 | # auto-import. 558 | # .idea/modules.xml 559 | # .idea/*.iml 560 | # .idea/modules 561 | 562 | # CMake 563 | cmake-build-*/ 564 | 565 | # Mongo Explorer plugin 566 | .idea/**/mongoSettings.xml 567 | 568 | # File-based project format 569 | *.iws 570 | 571 | # IntelliJ 572 | out/ 573 | 574 | # mpeltonen/sbt-idea plugin 575 | .idea_modules/ 576 | 577 | # JIRA plugin 578 | atlassian-ide-plugin.xml 579 | 580 | # Cursive Clojure plugin 581 | .idea/replstate.xml 582 | 583 | # Crashlytics plugin (for Android Studio and IntelliJ) 584 | com_crashlytics_export_strings.xml 585 | crashlytics.properties 586 | crashlytics-build.properties 587 | fabric.properties 588 | 589 | # Editor-based Rest Client 590 | .idea/httpRequests 591 | 592 | # Android studio 3.1+ serialized cache file 593 | .idea/caches/build_file_checksums.ser 594 | 595 | 596 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/JEnv.gitignore 597 | 598 | # JEnv local Java version configuration file 599 | .java-version 600 | 601 | # Used by previous versions of JEnv 602 | .jenv-version 603 | 604 | 605 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Kotlin.gitignore 606 | 607 | # Compiled class file 608 | *.class 609 | 610 | # Log file 611 | *.log 612 | 613 | # BlueJ files 614 | *.ctxt 615 | 616 | # Mobile Tools for Java (J2ME) 617 | .mtj.tmp/ 618 | 619 | # Package Files # 620 | *.jar 621 | *.war 622 | *.nar 623 | *.ear 624 | *.zip 625 | *.tar.gz 626 | *.rar 627 | 628 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 629 | hs_err_pid* 630 | 631 | 632 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/Linux.gitignore 633 | 634 | *~ 635 | 636 | # temporary files which can be created if a process still has a handle open of a deleted file 637 | .fuse_hidden* 638 | 639 | # KDE directory preferences 640 | .directory 641 | 642 | # Linux trash folder which might appear on any partition or disk 643 | .Trash-* 644 | 645 | # .nfs files are created when an open file is removed but is still being accessed 646 | .nfs* 647 | 648 | 649 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/macOS.gitignore 650 | 651 | # General 652 | .DS_Store 653 | .AppleDouble 654 | .LSOverride 655 | 656 | # Icon must end with two \r 657 | Icon 658 | 659 | 660 | # Thumbnails 661 | ._* 662 | 663 | # Files that might appear in the root of a volume 664 | .DocumentRevisions-V100 665 | .fseventsd 666 | .Spotlight-V100 667 | .TemporaryItems 668 | .Trashes 669 | .VolumeIcon.icns 670 | .com.apple.timemachine.donotpresent 671 | 672 | # Directories potentially created on remote AFP share 673 | .AppleDB 674 | .AppleDesktop 675 | Network Trash Folder 676 | Temporary Items 677 | .apdisk 678 | 679 | 680 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Maven.gitignore 681 | 682 | target/ 683 | pom.xml.tag 684 | pom.xml.releaseBackup 685 | pom.xml.versionsBackup 686 | pom.xml.next 687 | release.properties 688 | dependency-reduced-pom.xml 689 | buildNumber.properties 690 | .mvn/timing.properties 691 | .mvn/wrapper/maven-wrapper.jar 692 | 693 | 694 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Objective-C.gitignore 695 | 696 | # Xcode 697 | # 698 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 699 | 700 | ## Build generated 701 | build/ 702 | DerivedData/ 703 | 704 | ## Various settings 705 | *.pbxuser 706 | !default.pbxuser 707 | *.mode1v3 708 | !default.mode1v3 709 | *.mode2v3 710 | !default.mode2v3 711 | *.perspectivev3 712 | !default.perspectivev3 713 | xcuserdata/ 714 | 715 | ## Other 716 | *.moved-aside 717 | *.xccheckout 718 | *.xcscmblueprint 719 | 720 | ## Obj-C/Swift specific 721 | *.hmap 722 | *.ipa 723 | *.dSYM.zip 724 | *.dSYM 725 | 726 | # CocoaPods 727 | # 728 | # We recommend against adding the Pods directory to your .gitignore. However 729 | # you should judge for yourself, the pros and cons are mentioned at: 730 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 731 | # 732 | # Pods/ 733 | # 734 | # Add this line if you want to avoid checking in source code from the Xcode workspace 735 | # *.xcworkspace 736 | 737 | # Carthage 738 | # 739 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 740 | # Carthage/Checkouts 741 | 742 | Carthage/Build 743 | 744 | # fastlane 745 | # 746 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 747 | # screenshots whenever they are needed. 748 | # For more information about the recommended setup visit: 749 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 750 | 751 | fastlane/report.xml 752 | fastlane/Preview.html 753 | fastlane/screenshots/**/*.png 754 | fastlane/test_output 755 | 756 | # Code Injection 757 | # 758 | # After new code Injection tools there's a generated folder /iOSInjectionProject 759 | # https://github.com/johnno1962/injectionforxcode 760 | 761 | iOSInjectionProject/ 762 | 763 | 764 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/SublimeText.gitignore 765 | 766 | # Cache files for Sublime Text 767 | *.tmlanguage.cache 768 | *.tmPreferences.cache 769 | *.stTheme.cache 770 | 771 | # Workspace files are user-specific 772 | *.sublime-workspace 773 | 774 | # Project files should be checked into the repository, unless a significant 775 | # proportion of contributors will probably not be using Sublime Text 776 | # *.sublime-project 777 | 778 | # SFTP configuration file 779 | sftp-config.json 780 | 781 | # Package control specific files 782 | Package Control.last-run 783 | Package Control.ca-list 784 | Package Control.ca-bundle 785 | Package Control.system-ca-bundle 786 | Package Control.cache/ 787 | Package Control.ca-certs/ 788 | Package Control.merged-ca-bundle 789 | Package Control.user-ca-bundle 790 | oscrypto-ca-bundle.crt 791 | bh_unicode_properties.cache 792 | 793 | # Sublime-github package stores a github token in this file 794 | # https://packagecontrol.io/packages/sublime-github 795 | GitHub.sublime-settings 796 | 797 | 798 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/Vim.gitignore 799 | 800 | # Swap 801 | [._]*.s[a-v][a-z] 802 | [._]*.sw[a-p] 803 | [._]s[a-rt-v][a-z] 804 | [._]ss[a-gi-z] 805 | [._]sw[a-p] 806 | 807 | # Session 808 | Session.vim 809 | 810 | # Temporary 811 | .netrwhist 812 | *~ 813 | # Auto-generated tag files 814 | tags 815 | # Persistent undo 816 | [._]*.un~ 817 | 818 | 819 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/VisualStudioCode.gitignore 820 | 821 | .vscode/* 822 | !.vscode/settings.json 823 | !.vscode/tasks.json 824 | !.vscode/launch.json 825 | !.vscode/extensions.json 826 | 827 | 828 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/Windows.gitignore 829 | 830 | # Windows thumbnail cache files 831 | Thumbs.db 832 | ehthumbs.db 833 | ehthumbs_vista.db 834 | 835 | # Dump file 836 | *.stackdump 837 | 838 | # Folder config file 839 | [Dd]esktop.ini 840 | 841 | # Recycle Bin used on file shares 842 | $RECYCLE.BIN/ 843 | 844 | # Windows Installer files 845 | *.cab 846 | *.msi 847 | *.msix 848 | *.msm 849 | *.msp 850 | 851 | # Windows shortcuts 852 | *.lnk 853 | 854 | 855 | ### https://raw.github.com/github/gitignore/340e2fe08a2356c2e3760ff58c3a9e1fddf08060/Global/Xcode.gitignore 856 | 857 | # Xcode 858 | # 859 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 860 | 861 | ## User settings 862 | xcuserdata/ 863 | 864 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 865 | *.xcscmblueprint 866 | *.xccheckout 867 | 868 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 869 | build/ 870 | DerivedData/ 871 | *.moved-aside 872 | *.pbxuser 873 | !default.pbxuser 874 | *.mode1v3 875 | !default.mode1v3 876 | *.mode2v3 877 | !default.mode2v3 878 | *.perspectivev3 879 | !default.perspectivev3 880 | 881 | 882 | ### Flutter Generated Exceptions 883 | 884 | # Exceptions to above rules. 885 | !**/ios/**/default.mode1v3 886 | !**/ios/**/default.mode2v3 887 | !**/ios/**/default.pbxuser 888 | !**/ios/**/default.perspectivev3 889 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at ramossilvanismael@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Contributing 2 | 3 | When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change. 4 | 5 | Please note we have a code of conduct, please follow it in all your interactions with the project. 6 | 7 | Pull Request Process 8 | 9 | Ensure any install or build dependencies are removed before the end of the layer when doing a build. 10 | Update the README.md with details of changes to the interface, this includes new environment variables, exposed ports, useful file locations and container parameters. 11 | Increase the version numbers in any examples files and the README.md to the new version that this Pull Request would represent. The versioning scheme we use is SemVer. 12 | You may merge the Pull Request in once you have the sign-off of two other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you. 13 | Code of Conduct 14 | 15 | Our Pledge 16 | 17 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 18 | 19 | Our Standards 20 | 21 | Examples of behavior that contributes to creating a positive environment include: 22 | 23 | Using welcoming and inclusive language 24 | Being respectful of differing viewpoints and experiences 25 | Gracefully accepting constructive criticism 26 | Focusing on what is best for the community 27 | Showing empathy towards other community members 28 | Examples of unacceptable behavior by participants include: 29 | 30 | The use of sexualized language or imagery and unwelcome sexual attention or advances 31 | Trolling, insulting/derogatory comments, and personal or political attacks 32 | Public or private harassment 33 | Publishing others' private information, such as a physical or electronic address, without explicit permission 34 | Other conduct which could reasonably be considered inappropriate in a professional setting 35 | Our Responsibilities 36 | 37 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 38 | 39 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 40 | 41 | Scope 42 | 43 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 44 | 45 | Enforcement 46 | 47 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at ramossilvanismael@gmail.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 48 | 49 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 50 | 51 | Attribution 52 | 53 | This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at http://contributor-covenant.org/version/1/4 54 | -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 4 | ### Bug Report or Feature Request (mark with an `x`) 5 | 6 | - [ ] bug report -> please search issues before submitting 7 | - [ ] feature request 8 | 9 | ### Versions. 10 | 15 | 16 | 17 | ### Repro steps. 18 | 23 | 24 | 25 | ### The log given by the failure. 26 | 27 | 28 | 29 | ### Desired functionality. 30 | 34 | 35 | 36 | ### Mention any other details that might be useful. 37 | 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Ismael Ramos 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. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | Logo 4 | 5 | 6 |

Flutter Example App

7 | 8 |

9 | Example app with Flutter that uses Firebase 10 |
11 | Base project made with much :heart: . Contains CRUD, patterns, and much more! 12 |
13 |
14 | Report bug 15 | · 16 | Request feature 17 |

18 |

19 | 20 | ## Table of contents 21 | 22 | - [Quick start](#quick-start) 23 | - [What's included](#whats-included) 24 | - [Bugs and feature requests](#bugs-and-feature-requests) 25 | - [Contributing](#contributing) 26 | - [Creators](#creators) 27 | - [Thanks](#thanks) 28 | - [Copyright and license](#copyright-and-license) 29 | 30 | ## Quick start 31 | 32 | This is a normal flutter app. You should follow the instructions in the [official documentation](https://flutter.io/docs/get-started/install). 33 | 34 | ## What's included 35 | 36 | * CRUD: create, update and remove heroes with Firebase! 37 | * Search bar, to look for heroes 38 | * Internationalization 39 | * Responsive layout 40 | * [Sentry](https://sentry.io)! (logs any error in the app) 41 | * Google Tag Manager 42 | * Unit tests including code coverage 43 | * Integration tests 44 | * CI with Travis 45 | * Changelog generation 46 | * Following the [best practices](https://angular.io/guide/styleguide)! 47 | 48 | ### Firebase 49 | 50 | This repo is using Firebase. We use Cloud Firestore and Cloud Storage to handle CRUD operations over the heroes and to store their images. 51 | 52 | ### Travis CI 53 | 54 | We use Travis CI to run this tasks in order: 55 | * Linter 56 | * Tests 57 | * Build for production 58 | 59 | ## Bugs and feature requests 60 | 61 | Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/Ismaestro/flutter-example-app/blob/master/CONTRIBUTING.md) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/Ismaestro/flutter-example-app/issues/new). 62 | 63 | ## Contributing 64 | 65 | Please read through our [contributing guidelines](https://github.com/Ismaestro/flutter-example-app/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development. 66 | 67 | Moreover, all HTML and CSS should conform to the [Code Guide](https://github.com/mdo/code-guide), maintained by [Ismael Ramos](https://github.com/ismaestro). 68 | 69 | Editor preferences are available in the [editor config](https://github.com/Ismaestro/flutter-example-app/blob/master/.editorconfig) for easy use in common text editors. Read more and download plugins at . 70 | 71 | ## Creators 72 | 73 | **Ismael Ramos** 74 | 75 | - 76 | 77 | Buy Me a Coffee at ko-fi.com 78 | 79 | ## Thanks 80 | 81 | Thanks to all contributors and their support: 82 | 83 | ## Copyright and license 84 | 85 | Code and documentation copyright 2018 the authors. Code released under the [MIT License](https://github.com/Ismaestro/flutter-example-app/blob/master/LICENSE). 86 | 87 | Enjoy :metal: 88 | -------------------------------------------------------------------------------- /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 from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 26 | 27 | android { 28 | compileSdkVersion 27 29 | 30 | lintOptions { 31 | disable 'InvalidPackage' 32 | } 33 | 34 | defaultConfig { 35 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 36 | applicationId "com.example.flutterexampleapp" 37 | minSdkVersion 16 38 | targetSdkVersion 27 39 | versionCode flutterVersionCode.toInteger() 40 | versionName flutterVersionName 41 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 42 | } 43 | 44 | buildTypes { 45 | release { 46 | // TODO: Add your own signing config for the release build. 47 | // Signing with the debug keys for now, so `flutter run --release` works. 48 | signingConfig signingConfigs.debug 49 | } 50 | } 51 | } 52 | 53 | flutter { 54 | source '../..' 55 | } 56 | 57 | dependencies { 58 | testImplementation 'junit:junit:4.12' 59 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 60 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 61 | } 62 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 8 | 9 | 10 | 15 | 19 | 26 | 30 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/example/flutterexampleapp/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.flutterexampleapp; 2 | 3 | import android.os.Bundle; 4 | import io.flutter.app.FlutterActivity; 5 | import io.flutter.plugins.GeneratedPluginRegistrant; 6 | 7 | public class MainActivity extends FlutterActivity { 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | GeneratedPluginRegistrant.registerWith(this); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /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/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | google() 4 | jcenter() 5 | } 6 | 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:3.2.1' 9 | } 10 | } 11 | 12 | allprojects { 13 | repositories { 14 | google() 15 | jcenter() 16 | } 17 | } 18 | 19 | rootProject.buildDir = '../build' 20 | subprojects { 21 | project.buildDir = "${rootProject.buildDir}/${project.name}" 22 | } 23 | subprojects { 24 | project.evaluationDependsOn(':app') 25 | } 26 | 27 | task clean(type: Delete) { 28 | delete rootProject.buildDir 29 | } 30 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /assets/fonts/Roboto-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/assets/fonts/Roboto-Black.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/assets/fonts/Roboto-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/assets/fonts/Roboto-Light.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/assets/fonts/Roboto-Medium.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/assets/fonts/Roboto-Regular.ttf -------------------------------------------------------------------------------- /assets/fonts/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/assets/fonts/Roboto-Thin.ttf -------------------------------------------------------------------------------- /assets/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/assets/images/icon.png -------------------------------------------------------------------------------- /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 | 8.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, '9.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 parse_KV_file(file, separator='=') 14 | file_abs_path = File.expand_path(file) 15 | if !File.exists? file_abs_path 16 | return []; 17 | end 18 | pods_ary = [] 19 | skip_line_start_symbols = ["#", "/"] 20 | File.foreach(file_abs_path) { |line| 21 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 22 | plugin = line.split(pattern=separator) 23 | if plugin.length == 2 24 | podname = plugin[0].strip() 25 | path = plugin[1].strip() 26 | podpath = File.expand_path("#{path}", file_abs_path) 27 | pods_ary.push({:name => podname, :path => podpath}); 28 | else 29 | puts "Invalid plugin specification: #{line}" 30 | end 31 | } 32 | return pods_ary 33 | end 34 | 35 | target 'Runner' do 36 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 37 | # referring to absolute paths on developers' machines. 38 | system('rm -rf .symlinks') 39 | system('mkdir -p .symlinks/plugins') 40 | 41 | # Flutter Pods 42 | generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') 43 | if generated_xcode_build_settings.empty? 44 | puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." 45 | end 46 | generated_xcode_build_settings.map { |p| 47 | if p[:name] == 'FLUTTER_FRAMEWORK_DIR' 48 | symlink = File.join('.symlinks', 'flutter') 49 | File.symlink(File.dirname(p[:path]), symlink) 50 | pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) 51 | end 52 | } 53 | 54 | # Plugin Pods 55 | plugin_pods = parse_KV_file('../.flutter-plugins') 56 | plugin_pods.map { |p| 57 | symlink = File.join('.symlinks', 'plugins', p[:name]) 58 | File.symlink(p[:path], symlink) 59 | pod p[:name], :path => File.join(symlink, 'ios') 60 | } 61 | end 62 | 63 | post_install do |installer| 64 | installer.pods_project.targets.each do |target| 65 | target.build_configurations.each do |config| 66 | config.build_settings['ENABLE_BITCODE'] = 'NO' 67 | end 68 | end 69 | end 70 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 12 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 13 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 14 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 15 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 16 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 18 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 19 | 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 20 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 21 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 22 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 23 | E86F508821D2C5C8005E9176 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = E86F508721D2C5C8005E9176 /* GoogleService-Info.plist */; }; 24 | EE426706A8DDC84B805AAA7F /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D052A6683BC1CF5B2AFFCD6 /* libPods-Runner.a */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXCopyFilesBuildPhase section */ 28 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 29 | isa = PBXCopyFilesBuildPhase; 30 | buildActionMask = 2147483647; 31 | dstPath = ""; 32 | dstSubfolderSpec = 10; 33 | files = ( 34 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, 35 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, 36 | ); 37 | name = "Embed Frameworks"; 38 | runOnlyForDeploymentPostprocessing = 0; 39 | }; 40 | /* End PBXCopyFilesBuildPhase section */ 41 | 42 | /* Begin PBXFileReference section */ 43 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 44 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 45 | 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 46 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 47 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 48 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 49 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 50 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 51 | 7D052A6683BC1CF5B2AFFCD6 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 53 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 54 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 55 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 57 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 58 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 59 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 60 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 61 | E86F508721D2C5C8005E9176 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 62 | /* End PBXFileReference section */ 63 | 64 | /* Begin PBXFrameworksBuildPhase section */ 65 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 66 | isa = PBXFrameworksBuildPhase; 67 | buildActionMask = 2147483647; 68 | files = ( 69 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 70 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, 71 | EE426706A8DDC84B805AAA7F /* libPods-Runner.a in Frameworks */, 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | /* End PBXFrameworksBuildPhase section */ 76 | 77 | /* Begin PBXGroup section */ 78 | 9740EEB11CF90186004384FC /* Flutter */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 82 | 3B80C3931E831B6300D905FE /* App.framework */, 83 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 84 | 9740EEBA1CF902C7004384FC /* Flutter.framework */, 85 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 86 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 87 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 88 | ); 89 | name = Flutter; 90 | sourceTree = ""; 91 | }; 92 | 97C146E51CF9000F007C117D = { 93 | isa = PBXGroup; 94 | children = ( 95 | 9740EEB11CF90186004384FC /* Flutter */, 96 | 97C146F01CF9000F007C117D /* Runner */, 97 | 97C146EF1CF9000F007C117D /* Products */, 98 | C55E486F49FBD3AA83548BEE /* Pods */, 99 | A3191B470FAE44A1CB054BA2 /* Frameworks */, 100 | ); 101 | sourceTree = ""; 102 | }; 103 | 97C146EF1CF9000F007C117D /* Products */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 97C146EE1CF9000F007C117D /* Runner.app */, 107 | ); 108 | name = Products; 109 | sourceTree = ""; 110 | }; 111 | 97C146F01CF9000F007C117D /* Runner */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | E86F508721D2C5C8005E9176 /* GoogleService-Info.plist */, 115 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, 116 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, 117 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 118 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 119 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 120 | 97C147021CF9000F007C117D /* Info.plist */, 121 | 97C146F11CF9000F007C117D /* Supporting Files */, 122 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 123 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 124 | ); 125 | path = Runner; 126 | sourceTree = ""; 127 | }; 128 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 129 | isa = PBXGroup; 130 | children = ( 131 | 97C146F21CF9000F007C117D /* main.m */, 132 | ); 133 | name = "Supporting Files"; 134 | sourceTree = ""; 135 | }; 136 | A3191B470FAE44A1CB054BA2 /* Frameworks */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | 7D052A6683BC1CF5B2AFFCD6 /* libPods-Runner.a */, 140 | ); 141 | name = Frameworks; 142 | sourceTree = ""; 143 | }; 144 | C55E486F49FBD3AA83548BEE /* Pods */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | ); 148 | name = Pods; 149 | sourceTree = ""; 150 | }; 151 | /* End PBXGroup section */ 152 | 153 | /* Begin PBXNativeTarget section */ 154 | 97C146ED1CF9000F007C117D /* Runner */ = { 155 | isa = PBXNativeTarget; 156 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 157 | buildPhases = ( 158 | 7B6E12C4713332EDB86DC49A /* [CP] Check Pods Manifest.lock */, 159 | 9740EEB61CF901F6004384FC /* Run Script */, 160 | 97C146EA1CF9000F007C117D /* Sources */, 161 | 97C146EB1CF9000F007C117D /* Frameworks */, 162 | 97C146EC1CF9000F007C117D /* Resources */, 163 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 164 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 165 | 298F322E21BC7547DA80C1A0 /* [CP] Embed Pods Frameworks */, 166 | 46AC85A01C586B4400B6B6A7 /* [CP] Copy Pods Resources */, 167 | ); 168 | buildRules = ( 169 | ); 170 | dependencies = ( 171 | ); 172 | name = Runner; 173 | productName = Runner; 174 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 175 | productType = "com.apple.product-type.application"; 176 | }; 177 | /* End PBXNativeTarget section */ 178 | 179 | /* Begin PBXProject section */ 180 | 97C146E61CF9000F007C117D /* Project object */ = { 181 | isa = PBXProject; 182 | attributes = { 183 | LastUpgradeCheck = 0910; 184 | ORGANIZATIONNAME = "The Chromium Authors"; 185 | TargetAttributes = { 186 | 97C146ED1CF9000F007C117D = { 187 | CreatedOnToolsVersion = 7.3.1; 188 | }; 189 | }; 190 | }; 191 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 192 | compatibilityVersion = "Xcode 3.2"; 193 | developmentRegion = English; 194 | hasScannedForEncodings = 0; 195 | knownRegions = ( 196 | en, 197 | Base, 198 | ); 199 | mainGroup = 97C146E51CF9000F007C117D; 200 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 201 | projectDirPath = ""; 202 | projectRoot = ""; 203 | targets = ( 204 | 97C146ED1CF9000F007C117D /* Runner */, 205 | ); 206 | }; 207 | /* End PBXProject section */ 208 | 209 | /* Begin PBXResourcesBuildPhase section */ 210 | 97C146EC1CF9000F007C117D /* Resources */ = { 211 | isa = PBXResourcesBuildPhase; 212 | buildActionMask = 2147483647; 213 | files = ( 214 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 215 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 216 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 217 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 218 | 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, 219 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 220 | E86F508821D2C5C8005E9176 /* GoogleService-Info.plist in Resources */, 221 | ); 222 | runOnlyForDeploymentPostprocessing = 0; 223 | }; 224 | /* End PBXResourcesBuildPhase section */ 225 | 226 | /* Begin PBXShellScriptBuildPhase section */ 227 | 298F322E21BC7547DA80C1A0 /* [CP] Embed Pods Frameworks */ = { 228 | isa = PBXShellScriptBuildPhase; 229 | buildActionMask = 2147483647; 230 | files = ( 231 | ); 232 | inputFileListPaths = ( 233 | ); 234 | inputPaths = ( 235 | "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", 236 | "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", 237 | ); 238 | name = "[CP] Embed Pods Frameworks"; 239 | outputFileListPaths = ( 240 | ); 241 | outputPaths = ( 242 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", 243 | ); 244 | runOnlyForDeploymentPostprocessing = 0; 245 | shellPath = /bin/sh; 246 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 247 | showEnvVarsInLog = 0; 248 | }; 249 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 250 | isa = PBXShellScriptBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | ); 254 | inputPaths = ( 255 | ); 256 | name = "Thin Binary"; 257 | outputPaths = ( 258 | ); 259 | runOnlyForDeploymentPostprocessing = 0; 260 | shellPath = /bin/sh; 261 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; 262 | }; 263 | 46AC85A01C586B4400B6B6A7 /* [CP] Copy Pods Resources */ = { 264 | isa = PBXShellScriptBuildPhase; 265 | buildActionMask = 2147483647; 266 | files = ( 267 | ); 268 | inputFileListPaths = ( 269 | ); 270 | inputPaths = ( 271 | "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", 272 | "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseFirestore/gRPCCertificates.bundle", 273 | ); 274 | name = "[CP] Copy Pods Resources"; 275 | outputFileListPaths = ( 276 | ); 277 | outputPaths = ( 278 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle", 279 | ); 280 | runOnlyForDeploymentPostprocessing = 0; 281 | shellPath = /bin/sh; 282 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; 283 | showEnvVarsInLog = 0; 284 | }; 285 | 7B6E12C4713332EDB86DC49A /* [CP] Check Pods Manifest.lock */ = { 286 | isa = PBXShellScriptBuildPhase; 287 | buildActionMask = 2147483647; 288 | files = ( 289 | ); 290 | inputFileListPaths = ( 291 | ); 292 | inputPaths = ( 293 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 294 | "${PODS_ROOT}/Manifest.lock", 295 | ); 296 | name = "[CP] Check Pods Manifest.lock"; 297 | outputFileListPaths = ( 298 | ); 299 | outputPaths = ( 300 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 301 | ); 302 | runOnlyForDeploymentPostprocessing = 0; 303 | shellPath = /bin/sh; 304 | 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"; 305 | showEnvVarsInLog = 0; 306 | }; 307 | 9740EEB61CF901F6004384FC /* Run Script */ = { 308 | isa = PBXShellScriptBuildPhase; 309 | buildActionMask = 2147483647; 310 | files = ( 311 | ); 312 | inputPaths = ( 313 | ); 314 | name = "Run Script"; 315 | outputPaths = ( 316 | ); 317 | runOnlyForDeploymentPostprocessing = 0; 318 | shellPath = /bin/sh; 319 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 320 | }; 321 | /* End PBXShellScriptBuildPhase section */ 322 | 323 | /* Begin PBXSourcesBuildPhase section */ 324 | 97C146EA1CF9000F007C117D /* Sources */ = { 325 | isa = PBXSourcesBuildPhase; 326 | buildActionMask = 2147483647; 327 | files = ( 328 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, 329 | 97C146F31CF9000F007C117D /* main.m in Sources */, 330 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 331 | ); 332 | runOnlyForDeploymentPostprocessing = 0; 333 | }; 334 | /* End PBXSourcesBuildPhase section */ 335 | 336 | /* Begin PBXVariantGroup section */ 337 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 338 | isa = PBXVariantGroup; 339 | children = ( 340 | 97C146FB1CF9000F007C117D /* Base */, 341 | ); 342 | name = Main.storyboard; 343 | sourceTree = ""; 344 | }; 345 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 346 | isa = PBXVariantGroup; 347 | children = ( 348 | 97C147001CF9000F007C117D /* Base */, 349 | ); 350 | name = LaunchScreen.storyboard; 351 | sourceTree = ""; 352 | }; 353 | /* End PBXVariantGroup section */ 354 | 355 | /* Begin XCBuildConfiguration section */ 356 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 357 | isa = XCBuildConfiguration; 358 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 359 | buildSettings = { 360 | ALWAYS_SEARCH_USER_PATHS = NO; 361 | CLANG_ANALYZER_NONNULL = YES; 362 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 363 | CLANG_CXX_LIBRARY = "libc++"; 364 | CLANG_ENABLE_MODULES = YES; 365 | CLANG_ENABLE_OBJC_ARC = YES; 366 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 367 | CLANG_WARN_BOOL_CONVERSION = YES; 368 | CLANG_WARN_COMMA = YES; 369 | CLANG_WARN_CONSTANT_CONVERSION = YES; 370 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 371 | CLANG_WARN_EMPTY_BODY = YES; 372 | CLANG_WARN_ENUM_CONVERSION = YES; 373 | CLANG_WARN_INFINITE_RECURSION = YES; 374 | CLANG_WARN_INT_CONVERSION = YES; 375 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 376 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 377 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 378 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 379 | CLANG_WARN_STRICT_PROTOTYPES = YES; 380 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 381 | CLANG_WARN_UNREACHABLE_CODE = YES; 382 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 383 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 384 | COPY_PHASE_STRIP = NO; 385 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 386 | ENABLE_NS_ASSERTIONS = NO; 387 | ENABLE_STRICT_OBJC_MSGSEND = YES; 388 | GCC_C_LANGUAGE_STANDARD = gnu99; 389 | GCC_NO_COMMON_BLOCKS = YES; 390 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 391 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 392 | GCC_WARN_UNDECLARED_SELECTOR = YES; 393 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 394 | GCC_WARN_UNUSED_FUNCTION = YES; 395 | GCC_WARN_UNUSED_VARIABLE = YES; 396 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 397 | MTL_ENABLE_DEBUG_INFO = NO; 398 | SDKROOT = iphoneos; 399 | TARGETED_DEVICE_FAMILY = "1,2"; 400 | VALIDATE_PRODUCT = YES; 401 | }; 402 | name = Profile; 403 | }; 404 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 405 | isa = XCBuildConfiguration; 406 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 407 | buildSettings = { 408 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 409 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 410 | DEVELOPMENT_TEAM = S8QB4VV633; 411 | ENABLE_BITCODE = NO; 412 | FRAMEWORK_SEARCH_PATHS = ( 413 | "$(inherited)", 414 | "$(PROJECT_DIR)/Flutter", 415 | ); 416 | INFOPLIST_FILE = Runner/Info.plist; 417 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 418 | LIBRARY_SEARCH_PATHS = ( 419 | "$(inherited)", 420 | "$(PROJECT_DIR)/Flutter", 421 | ); 422 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterExampleApp; 423 | PRODUCT_NAME = "$(TARGET_NAME)"; 424 | VERSIONING_SYSTEM = "apple-generic"; 425 | }; 426 | name = Profile; 427 | }; 428 | 97C147031CF9000F007C117D /* Debug */ = { 429 | isa = XCBuildConfiguration; 430 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 431 | buildSettings = { 432 | ALWAYS_SEARCH_USER_PATHS = NO; 433 | CLANG_ANALYZER_NONNULL = YES; 434 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 435 | CLANG_CXX_LIBRARY = "libc++"; 436 | CLANG_ENABLE_MODULES = YES; 437 | CLANG_ENABLE_OBJC_ARC = YES; 438 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 439 | CLANG_WARN_BOOL_CONVERSION = YES; 440 | CLANG_WARN_COMMA = YES; 441 | CLANG_WARN_CONSTANT_CONVERSION = YES; 442 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 443 | CLANG_WARN_EMPTY_BODY = YES; 444 | CLANG_WARN_ENUM_CONVERSION = YES; 445 | CLANG_WARN_INFINITE_RECURSION = YES; 446 | CLANG_WARN_INT_CONVERSION = YES; 447 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 448 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 449 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 450 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 451 | CLANG_WARN_STRICT_PROTOTYPES = YES; 452 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 453 | CLANG_WARN_UNREACHABLE_CODE = YES; 454 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 455 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 456 | COPY_PHASE_STRIP = NO; 457 | DEBUG_INFORMATION_FORMAT = dwarf; 458 | ENABLE_STRICT_OBJC_MSGSEND = YES; 459 | ENABLE_TESTABILITY = YES; 460 | GCC_C_LANGUAGE_STANDARD = gnu99; 461 | GCC_DYNAMIC_NO_PIC = NO; 462 | GCC_NO_COMMON_BLOCKS = YES; 463 | GCC_OPTIMIZATION_LEVEL = 0; 464 | GCC_PREPROCESSOR_DEFINITIONS = ( 465 | "DEBUG=1", 466 | "$(inherited)", 467 | ); 468 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 469 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 470 | GCC_WARN_UNDECLARED_SELECTOR = YES; 471 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 472 | GCC_WARN_UNUSED_FUNCTION = YES; 473 | GCC_WARN_UNUSED_VARIABLE = YES; 474 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 475 | MTL_ENABLE_DEBUG_INFO = YES; 476 | ONLY_ACTIVE_ARCH = YES; 477 | SDKROOT = iphoneos; 478 | TARGETED_DEVICE_FAMILY = "1,2"; 479 | }; 480 | name = Debug; 481 | }; 482 | 97C147041CF9000F007C117D /* Release */ = { 483 | isa = XCBuildConfiguration; 484 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 485 | buildSettings = { 486 | ALWAYS_SEARCH_USER_PATHS = NO; 487 | CLANG_ANALYZER_NONNULL = YES; 488 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 489 | CLANG_CXX_LIBRARY = "libc++"; 490 | CLANG_ENABLE_MODULES = YES; 491 | CLANG_ENABLE_OBJC_ARC = YES; 492 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 493 | CLANG_WARN_BOOL_CONVERSION = YES; 494 | CLANG_WARN_COMMA = YES; 495 | CLANG_WARN_CONSTANT_CONVERSION = YES; 496 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 497 | CLANG_WARN_EMPTY_BODY = YES; 498 | CLANG_WARN_ENUM_CONVERSION = YES; 499 | CLANG_WARN_INFINITE_RECURSION = YES; 500 | CLANG_WARN_INT_CONVERSION = YES; 501 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 502 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 503 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 504 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 505 | CLANG_WARN_STRICT_PROTOTYPES = YES; 506 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 507 | CLANG_WARN_UNREACHABLE_CODE = YES; 508 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 509 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 510 | COPY_PHASE_STRIP = NO; 511 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 512 | ENABLE_NS_ASSERTIONS = NO; 513 | ENABLE_STRICT_OBJC_MSGSEND = YES; 514 | GCC_C_LANGUAGE_STANDARD = gnu99; 515 | GCC_NO_COMMON_BLOCKS = YES; 516 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 517 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 518 | GCC_WARN_UNDECLARED_SELECTOR = YES; 519 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 520 | GCC_WARN_UNUSED_FUNCTION = YES; 521 | GCC_WARN_UNUSED_VARIABLE = YES; 522 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 523 | MTL_ENABLE_DEBUG_INFO = NO; 524 | SDKROOT = iphoneos; 525 | TARGETED_DEVICE_FAMILY = "1,2"; 526 | VALIDATE_PRODUCT = YES; 527 | }; 528 | name = Release; 529 | }; 530 | 97C147061CF9000F007C117D /* Debug */ = { 531 | isa = XCBuildConfiguration; 532 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 533 | buildSettings = { 534 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 535 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 536 | ENABLE_BITCODE = NO; 537 | FRAMEWORK_SEARCH_PATHS = ( 538 | "$(inherited)", 539 | "$(PROJECT_DIR)/Flutter", 540 | ); 541 | INFOPLIST_FILE = Runner/Info.plist; 542 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 543 | LIBRARY_SEARCH_PATHS = ( 544 | "$(inherited)", 545 | "$(PROJECT_DIR)/Flutter", 546 | ); 547 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterExampleApp; 548 | PRODUCT_NAME = "$(TARGET_NAME)"; 549 | VERSIONING_SYSTEM = "apple-generic"; 550 | }; 551 | name = Debug; 552 | }; 553 | 97C147071CF9000F007C117D /* Release */ = { 554 | isa = XCBuildConfiguration; 555 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 556 | buildSettings = { 557 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 558 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 559 | ENABLE_BITCODE = NO; 560 | FRAMEWORK_SEARCH_PATHS = ( 561 | "$(inherited)", 562 | "$(PROJECT_DIR)/Flutter", 563 | ); 564 | INFOPLIST_FILE = Runner/Info.plist; 565 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 566 | LIBRARY_SEARCH_PATHS = ( 567 | "$(inherited)", 568 | "$(PROJECT_DIR)/Flutter", 569 | ); 570 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterExampleApp; 571 | PRODUCT_NAME = "$(TARGET_NAME)"; 572 | VERSIONING_SYSTEM = "apple-generic"; 573 | }; 574 | name = Release; 575 | }; 576 | /* End XCBuildConfiguration section */ 577 | 578 | /* Begin XCConfigurationList section */ 579 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 580 | isa = XCConfigurationList; 581 | buildConfigurations = ( 582 | 97C147031CF9000F007C117D /* Debug */, 583 | 97C147041CF9000F007C117D /* Release */, 584 | 249021D3217E4FDB00AE95B9 /* Profile */, 585 | ); 586 | defaultConfigurationIsVisible = 0; 587 | defaultConfigurationName = Release; 588 | }; 589 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 590 | isa = XCConfigurationList; 591 | buildConfigurations = ( 592 | 97C147061CF9000F007C117D /* Debug */, 593 | 97C147071CF9000F007C117D /* Release */, 594 | 249021D4217E4FDB00AE95B9 /* Profile */, 595 | ); 596 | defaultConfigurationIsVisible = 0; 597 | defaultConfigurationName = Release; 598 | }; 599 | /* End XCConfigurationList section */ 600 | }; 601 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 602 | } 603 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 33 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 56 | 58 | 64 | 65 | 66 | 67 | 68 | 69 | 75 | 77 | 83 | 84 | 85 | 86 | 88 | 89 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /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 | BuildSystemType 6 | Original 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : FlutterAppDelegate 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #include "AppDelegate.h" 2 | #include "GeneratedPluginRegistrant.h" 3 | 4 | @implementation AppDelegate 5 | 6 | - (BOOL)application:(UIApplication *)application 7 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 8 | [GeneratedPluginRegistrant registerWithRegistry:self]; 9 | // Override point for customization after application launch. 10 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 11 | } 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /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/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ismaestro/flutter-example-app/bd3096451f0440ac4144d073de28bb5563d7f586/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/GoogleService-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AD_UNIT_ID_FOR_BANNER_TEST 6 | ca-app-pub-3940256099942544/2934735716 7 | AD_UNIT_ID_FOR_INTERSTITIAL_TEST 8 | ca-app-pub-3940256099942544/4411468910 9 | CLIENT_ID 10 | 965114235515-j48ljs1gs9e37fcofab1vus5utulm6dp.apps.googleusercontent.com 11 | REVERSED_CLIENT_ID 12 | com.googleusercontent.apps.965114235515-j48ljs1gs9e37fcofab1vus5utulm6dp 13 | API_KEY 14 | AIzaSyAA1OV5kLVpnVCV-0iGW7igH3sqQcoYFv8 15 | GCM_SENDER_ID 16 | 965114235515 17 | PLIST_VERSION 18 | 1 19 | BUNDLE_ID 20 | com.ismaestro.flutterexampleapp 21 | PROJECT_ID 22 | ismaestro-angularexampleapp 23 | STORAGE_BUCKET 24 | ismaestro-angularexampleapp.appspot.com 25 | IS_ADS_ENABLED 26 | 27 | IS_ANALYTICS_ENABLED 28 | 29 | IS_APPINVITE_ENABLED 30 | 31 | IS_GCM_ENABLED 32 | 33 | IS_SIGNIN_ENABLED 34 | 35 | GOOGLE_APP_ID 36 | 1:965114235515:ios:2e199be51da4feba 37 | DATABASE_URL 38 | https://ismaestro-angularexampleapp.firebaseio.com 39 | 40 | 41 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | flutter_example_app 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char* argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/l10n/intl_en.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@locale": "en", 3 | "@@last_modified": "2018-11-03T15:02:36.546976", 4 | "title": "Flutter Example App", 5 | "@title": { 6 | "type": "text", 7 | "placeholders": {} 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/l10n/intl_es.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@locale": "es", 3 | "@@last_modified": "2018-11-03T15:02:36.546976", 4 | "title": "Flutter Ejemplo de App", 5 | "@title": { 6 | "type": "text", 7 | "placeholders": {} 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/l10n/intl_messages.arb: -------------------------------------------------------------------------------- 1 | { 2 | "@@last_modified": "2018-12-24T15:42:37.298140", 3 | "title": "Flutter Example App", 4 | "@title": { 5 | "description": "The application title", 6 | "type": "text", 7 | "placeholders": {} 8 | } 9 | } -------------------------------------------------------------------------------- /lib/l10n/messages_all.dart: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT. This is code generated via package:intl/generate_localized.dart 2 | // This is a library that looks up messages for specific locales by 3 | // delegating to the appropriate library. 4 | 5 | import 'dart:async'; 6 | 7 | import 'package:intl/intl.dart'; 8 | import 'package:intl/message_lookup_by_library.dart'; 9 | // ignore: implementation_imports 10 | import 'package:intl/src/intl_helpers.dart'; 11 | 12 | import 'messages_en.dart' deferred as messages_en; 13 | import 'messages_es.dart' deferred as messages_es; 14 | import 'messages_messages.dart' deferred as messages_messages; 15 | 16 | typedef Future LibraryLoader(); 17 | Map _deferredLibraries = { 18 | 'en': () => messages_en.loadLibrary(), 19 | 'es': () => messages_es.loadLibrary(), 20 | 'messages': () => messages_messages.loadLibrary(), 21 | }; 22 | 23 | MessageLookupByLibrary _findExact(localeName) { 24 | switch (localeName) { 25 | case 'en': 26 | return messages_en.messages; 27 | case 'es': 28 | return messages_es.messages; 29 | case 'messages': 30 | return messages_messages.messages; 31 | default: 32 | return null; 33 | } 34 | } 35 | 36 | /// User programs should call this before using [localeName] for messages. 37 | Future initializeMessages(String localeName) async { 38 | var availableLocale = Intl.verifiedLocale( 39 | localeName, 40 | (locale) => _deferredLibraries[locale] != null, 41 | onFailure: (_) => null); 42 | if (availableLocale == null) { 43 | // ignore: unnecessary_new 44 | return new Future.value(false); 45 | } 46 | var lib = _deferredLibraries[availableLocale]; 47 | // ignore: unnecessary_new 48 | await (lib == null ? new Future.value(false) : lib()); 49 | // ignore: unnecessary_new 50 | initializeInternalMessageLookup(() => new CompositeMessageLookup()); 51 | messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor); 52 | // ignore: unnecessary_new 53 | return new Future.value(true); 54 | } 55 | 56 | bool _messagesExistFor(String locale) { 57 | try { 58 | return _findExact(locale) != null; 59 | } catch (e) { 60 | return false; 61 | } 62 | } 63 | 64 | MessageLookupByLibrary _findGeneratedMessagesFor(locale) { 65 | var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor, 66 | onFailure: (_) => null); 67 | if (actualLocale == null) return null; 68 | return _findExact(actualLocale); 69 | } 70 | -------------------------------------------------------------------------------- /lib/l10n/messages_en.dart: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT. This is code generated via package:intl/generate_localized.dart 2 | // This is a library that provides messages for a en locale. All the 3 | // messages from the main program should be duplicated here with the same 4 | // function name. 5 | 6 | import 'package:intl/intl.dart'; 7 | import 'package:intl/message_lookup_by_library.dart'; 8 | 9 | // ignore: unnecessary_new 10 | final messages = new MessageLookup(); 11 | 12 | // ignore: unused_element 13 | final _keepAnalysisHappy = Intl.defaultLocale; 14 | 15 | // ignore: non_constant_identifier_names 16 | typedef MessageIfAbsent(String message_str, List args); 17 | 18 | class MessageLookup extends MessageLookupByLibrary { 19 | get localeName => 'en'; 20 | 21 | final messages = _notInlinedMessages(_notInlinedMessages); 22 | static _notInlinedMessages(_) => { 23 | "title" : MessageLookupByLibrary.simpleMessage("Flutter Example App") 24 | }; 25 | } 26 | -------------------------------------------------------------------------------- /lib/l10n/messages_es.dart: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT. This is code generated via package:intl/generate_localized.dart 2 | // This is a library that provides messages for a es locale. All the 3 | // messages from the main program should be duplicated here with the same 4 | // function name. 5 | 6 | import 'package:intl/intl.dart'; 7 | import 'package:intl/message_lookup_by_library.dart'; 8 | 9 | // ignore: unnecessary_new 10 | final messages = new MessageLookup(); 11 | 12 | // ignore: unused_element 13 | final _keepAnalysisHappy = Intl.defaultLocale; 14 | 15 | // ignore: non_constant_identifier_names 16 | typedef MessageIfAbsent(String message_str, List args); 17 | 18 | class MessageLookup extends MessageLookupByLibrary { 19 | get localeName => 'es'; 20 | 21 | final messages = _notInlinedMessages(_notInlinedMessages); 22 | static _notInlinedMessages(_) => { 23 | "title" : MessageLookupByLibrary.simpleMessage("Flutter Ejemplo de App") 24 | }; 25 | } 26 | -------------------------------------------------------------------------------- /lib/l10n/messages_messages.dart: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT. This is code generated via package:intl/generate_localized.dart 2 | // This is a library that provides messages for a messages locale. All the 3 | // messages from the main program should be duplicated here with the same 4 | // function name. 5 | 6 | import 'package:intl/intl.dart'; 7 | import 'package:intl/message_lookup_by_library.dart'; 8 | 9 | // ignore: unnecessary_new 10 | final messages = new MessageLookup(); 11 | 12 | // ignore: unused_element 13 | final _keepAnalysisHappy = Intl.defaultLocale; 14 | 15 | // ignore: non_constant_identifier_names 16 | typedef MessageIfAbsent(String message_str, List args); 17 | 18 | class MessageLookup extends MessageLookupByLibrary { 19 | get localeName => 'messages'; 20 | 21 | final messages = _notInlinedMessages(_notInlinedMessages); 22 | static _notInlinedMessages(_) => { 23 | "title" : MessageLookupByLibrary.simpleMessage("Flutter Example App") 24 | }; 25 | } 26 | -------------------------------------------------------------------------------- /lib/localizations.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:intl/intl.dart'; 5 | 6 | import 'l10n/messages_all.dart'; 7 | 8 | // flutter pub pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/localizations.dart 9 | // flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/l10n \ --no-use-deferred-loading lib/localizations.dart lib/l10n/intl_*.arb 10 | 11 | class AppLocalizations { 12 | static Future load(Locale locale) { 13 | final String name = 14 | locale.countryCode == null ? locale.languageCode : locale.toString(); 15 | final String localeName = Intl.canonicalizedLocale(name); 16 | 17 | return initializeMessages(localeName).then((bool _) { 18 | Intl.defaultLocale = localeName; 19 | return new AppLocalizations(); 20 | }); 21 | } 22 | 23 | static AppLocalizations of(BuildContext context) { 24 | return Localizations.of(context, AppLocalizations); 25 | } 26 | 27 | String get title { 28 | return Intl.message('Flutter Example App', name: 'title'); 29 | } 30 | } 31 | 32 | class AppLocalizationsDelegate extends LocalizationsDelegate { 33 | const AppLocalizationsDelegate(); 34 | 35 | @override 36 | bool isSupported(Locale locale) { 37 | return ['en', 'es'].contains(locale.languageCode); 38 | } 39 | 40 | @override 41 | Future load(Locale locale) { 42 | return AppLocalizations.load(locale); 43 | } 44 | 45 | @override 46 | bool shouldReload(LocalizationsDelegate old) { 47 | return false; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_example_app/tabs/first.dart'; 3 | import 'package:flutter_example_app/tabs/second.dart'; 4 | import 'package:flutter_example_app/tabs/third.dart'; 5 | import 'package:flutter_localizations/flutter_localizations.dart'; 6 | 7 | import 'localizations.dart'; 8 | 9 | void main() { 10 | runApp(new MaterialApp( 11 | localizationsDelegates: [ 12 | AppLocalizationsDelegate(), 13 | GlobalMaterialLocalizations.delegate, 14 | GlobalWidgetsLocalizations.delegate 15 | ], 16 | supportedLocales: [ 17 | Locale("en"), 18 | Locale("es") 19 | ], 20 | onGenerateTitle: (BuildContext context) => 21 | AppLocalizations.of(context).title, 22 | theme: ThemeData(fontFamily: 'Roboto'), 23 | home: new MyHome())); 24 | } 25 | 26 | class MyHome extends StatefulWidget { 27 | @override 28 | MyHomeState createState() => new MyHomeState(); 29 | } 30 | 31 | class MyHomeState extends State with SingleTickerProviderStateMixin { 32 | TabController controller; 33 | 34 | @override 35 | void initState() { 36 | super.initState(); 37 | controller = new TabController(length: 3, initialIndex: 1, vsync: this); 38 | } 39 | 40 | @override 41 | void dispose() { 42 | controller.dispose(); 43 | super.dispose(); 44 | } 45 | 46 | @override 47 | Widget build(BuildContext context) { 48 | return new Scaffold( 49 | appBar: new AppBar( 50 | title: Text(AppLocalizations.of(context).title), 51 | backgroundColor: Color(0xFF3f51b5), 52 | ), 53 | body: new TabBarView( 54 | children: [new FirstTab(), new SecondTab(), new MyHomePage()], 55 | controller: controller, 56 | ), 57 | bottomNavigationBar: new Material( 58 | color: new Color(0xFF3f51b5), 59 | child: new TabBar( 60 | tabs: [ 61 | new Tab( 62 | icon: new Icon(Icons.view_list), 63 | ), 64 | new Tab( 65 | icon: new Icon(Icons.favorite), 66 | ), 67 | new Tab( 68 | icon: new Icon(Icons.search), 69 | ), 70 | ], 71 | controller: controller, 72 | indicator: UnderlineTabIndicator(borderSide: BorderSide(width: 0)), 73 | labelPadding: EdgeInsets.only(bottom: 16.0)), 74 | ), 75 | ); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /lib/tabs/first.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:cloud_firestore/cloud_firestore.dart'; 3 | 4 | class FirstTab extends StatelessWidget { 5 | @override 6 | Widget build(BuildContext context) { 7 | return StreamBuilder( 8 | stream: Firestore.instance 9 | .collection('heroes') 10 | .orderBy('likes', descending: true) 11 | .snapshots(), 12 | builder: (BuildContext context, AsyncSnapshot snapshot) { 13 | if (snapshot.hasError) return new Text('Error: ${snapshot.error}'); 14 | switch (snapshot.connectionState) { 15 | case ConnectionState.waiting: 16 | return new Text('Loading...'); 17 | default: 18 | return new ListView( 19 | children: 20 | snapshot.data.documents.map((DocumentSnapshot document) { 21 | return new ListTile( 22 | title: new Text(document['name']), 23 | subtitle: new Text(document['likes'].toString()), 24 | ); 25 | }).toList(), 26 | ); 27 | } 28 | }, 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/tabs/second.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:cloud_firestore/cloud_firestore.dart'; 3 | 4 | class SecondTab extends StatelessWidget { 5 | @override 6 | Widget build(BuildContext context) { 7 | Column buildButtonColumn(IconData icon, String label) { 8 | Color color = Theme.of(context).primaryColor; 9 | 10 | return Column( 11 | mainAxisSize: MainAxisSize.min, 12 | mainAxisAlignment: MainAxisAlignment.center, 13 | children: [ 14 | Icon(icon, color: color), 15 | Container( 16 | margin: const EdgeInsets.only(top: 8.0), 17 | child: Text( 18 | label, 19 | style: TextStyle( 20 | fontSize: 12.0, 21 | fontWeight: FontWeight.w400, 22 | color: color, 23 | ), 24 | ), 25 | ), 26 | ], 27 | ); 28 | } 29 | 30 | Widget buttonSection = Container( 31 | child: Row( 32 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 33 | children: [ 34 | buildButtonColumn(Icons.call, 'CALL'), 35 | buildButtonColumn(Icons.near_me, 'ROUTE'), 36 | buildButtonColumn(Icons.share, 'SHARE'), 37 | ], 38 | ), 39 | ); 40 | 41 | Widget textSection = Container( 42 | padding: const EdgeInsets.all(32.0), 43 | child: Text( 44 | ''' 45 | Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese Alps. Situated 1,578 meters above sea level, it is one of the larger Alpine Lakes. A gondola ride from Kandersteg, followed by a half-hour walk through pastures and pine forest, leads you to the lake, which warms to 20 degrees Celsius in the summer. Activities enjoyed here include rowing, and riding the summer toboggan run. 46 | ''', 47 | softWrap: true, 48 | ), 49 | ); 50 | 51 | Widget titleSection = Container( 52 | padding: const EdgeInsets.all(32.0), 53 | child: Row( 54 | children: [ 55 | Expanded( 56 | child: Column( 57 | crossAxisAlignment: CrossAxisAlignment.start, 58 | children: [ 59 | Container( 60 | padding: const EdgeInsets.only(bottom: 8.0), 61 | child: Text( 62 | 'Oeschinen Lake Campground', 63 | style: TextStyle( 64 | fontWeight: FontWeight.bold, 65 | ), 66 | ), 67 | ), 68 | Text( 69 | 'Kandersteg, Switzerland', 70 | style: TextStyle( 71 | color: Colors.grey[500], 72 | ), 73 | ), 74 | ], 75 | ), 76 | ), 77 | Icon( 78 | Icons.star, 79 | color: Colors.red[500], 80 | ), 81 | Text('41'), 82 | ], 83 | ), 84 | ); 85 | 86 | return StreamBuilder( 87 | stream: Firestore.instance 88 | .collection('heroes') 89 | .orderBy('likes', descending: true) 90 | .limit(4) 91 | .snapshots(), 92 | builder: (BuildContext context, AsyncSnapshot snapshot) { 93 | if (snapshot.hasError) return new Text('Error: ${snapshot.error}'); 94 | switch (snapshot.connectionState) { 95 | case ConnectionState.waiting: 96 | return new Text('Loading...'); 97 | default: 98 | var firstElement = snapshot.data.documents[0]; 99 | var secondElement = snapshot.data.documents[1]; 100 | var thirdElement = snapshot.data.documents[2]; 101 | var fourthElement = snapshot.data.documents[3]; 102 | 103 | return ListView( 104 | children: [ 105 | Image.network(firstElement['avatarUrl'], 106 | width: 600.0, height: 240.0, fit: BoxFit.cover), 107 | titleSection, 108 | buttonSection, 109 | textSection, 110 | Image.network(secondElement['avatarUrl'], 111 | width: 600.0, height: 240.0, fit: BoxFit.cover), 112 | titleSection, 113 | buttonSection, 114 | textSection, 115 | Image.network(thirdElement['avatarUrl'], 116 | width: 600.0, height: 240.0, fit: BoxFit.cover), 117 | titleSection, 118 | buttonSection, 119 | textSection, 120 | Image.network(fourthElement['avatarUrl'], 121 | width: 600.0, height: 240.0, fit: BoxFit.cover), 122 | titleSection, 123 | buttonSection, 124 | textSection, 125 | ], 126 | ); 127 | } 128 | }, 129 | ); 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /lib/tabs/third.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:cloud_firestore/cloud_firestore.dart'; 3 | 4 | class MyHomePage extends StatefulWidget { 5 | @override 6 | ThirdTab createState() => new ThirdTab(); 7 | } 8 | 9 | class ThirdTab extends State { 10 | var queryResultSet = []; 11 | var tempSearchStore = []; 12 | 13 | initiateSearch(value) { 14 | if (value.length == 0) { 15 | setState(() { 16 | queryResultSet = []; 17 | tempSearchStore = []; 18 | }); 19 | } 20 | 21 | var capitalizedValue = 22 | value.substring(0, 1).toUpperCase() + value.substring(1); 23 | 24 | if (queryResultSet.length == 0 && value.length == 1) { 25 | SearchService().searchByName(value).then((QuerySnapshot docs) { 26 | for (int i = 0; i < docs.documents.length; ++i) { 27 | queryResultSet.add(docs.documents[i].data); 28 | } 29 | }); 30 | } else { 31 | tempSearchStore = []; 32 | queryResultSet.forEach((element) { 33 | if (element['name'].startsWith(capitalizedValue)) { 34 | setState(() { 35 | tempSearchStore.add(element); 36 | }); 37 | } 38 | }); 39 | } 40 | } 41 | 42 | @override 43 | Widget build(BuildContext context) { 44 | return new Scaffold( 45 | appBar: new AppBar( 46 | title: Text('Firestore search'), 47 | ), 48 | body: ListView(children: [ 49 | Padding( 50 | padding: const EdgeInsets.all(10.0), 51 | child: TextField( 52 | onChanged: (val) { 53 | initiateSearch(val); 54 | }, 55 | decoration: InputDecoration( 56 | prefixIcon: IconButton( 57 | color: Colors.black, 58 | icon: Icon(Icons.arrow_back), 59 | iconSize: 20.0, 60 | onPressed: () {}, 61 | ), 62 | contentPadding: EdgeInsets.only(left: 25.0), 63 | hintText: 'Search by name', 64 | border: OutlineInputBorder( 65 | borderRadius: BorderRadius.circular(4.0))), 66 | ), 67 | ), 68 | SizedBox(height: 10.0), 69 | GridView.count( 70 | padding: EdgeInsets.only(left: 10.0, right: 10.0), 71 | crossAxisCount: 2, 72 | crossAxisSpacing: 4.0, 73 | mainAxisSpacing: 4.0, 74 | primary: false, 75 | shrinkWrap: true, 76 | children: tempSearchStore.map((element) { 77 | return buildResultCard(element); 78 | }).toList()) 79 | ])); 80 | } 81 | } 82 | 83 | Widget buildResultCard(data) { 84 | return Card( 85 | shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)), 86 | elevation: 2.0, 87 | child: Container( 88 | child: Center( 89 | child: Text( 90 | data['name'], 91 | textAlign: TextAlign.center, 92 | style: TextStyle( 93 | color: Colors.black, 94 | fontSize: 20.0, 95 | ), 96 | )))); 97 | } 98 | 99 | class SearchService { 100 | searchByName(String searchField) { 101 | 102 | return Firestore.instance 103 | .collection('heroes') 104 | .getDocuments(); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_example_app 2 | description: An example app using Flutter. 3 | version: 1.0.0+1 4 | 5 | environment: 6 | sdk: ">=2.0.0-dev.68.0 <3.0.0" 7 | 8 | dependencies: 9 | flutter: 10 | sdk: flutter 11 | flutter_localizations: 12 | sdk: flutter 13 | intl: 14 | intl_translation: 15 | cupertino_icons: ^0.1.2 16 | cloud_firestore: ^0.8.2+3 17 | 18 | dev_dependencies: 19 | flutter_test: 20 | sdk: flutter 21 | flutter_launcher_icons: "^0.7.0" 22 | 23 | flutter_icons: 24 | android: true 25 | ios: true 26 | image_path: "assets/images/icon.png" 27 | 28 | flutter: 29 | uses-material-design: true 30 | 31 | fonts: 32 | - family: Roboto 33 | fonts: 34 | - asset: assets/fonts/Roboto-Thin.ttf 35 | - asset: assets/fonts/Roboto-Light.ttf 36 | - asset: assets/fonts/Roboto-Medium.ttf 37 | - asset: assets/fonts/Roboto-Regular.ttf 38 | - asset: assets/fonts/Roboto-Bold.ttf 39 | - asset: assets/fonts/Roboto-Black.ttf 40 | -------------------------------------------------------------------------------- /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 that Flutter provides. 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:flutter_example_app/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Icon button changes the page to Saved suggestions', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | expect(find.byKey(Key('icon-menu')), findsOneWidget); 19 | }); 20 | } 21 | --------------------------------------------------------------------------------