├── .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 |
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 |
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 |
--------------------------------------------------------------------------------