├── .gitignore
├── .idea
├── libraries
│ ├── Dart_Packages.xml
│ ├── Dart_SDK.xml
│ ├── Flutter_Plugins.xml
│ └── Flutter_for_Android.xml
├── misc.xml
├── modules.xml
├── runConfigurations
│ └── main_dart.xml
├── vcs.xml
└── workspace.xml
├── .metadata
├── README.md
├── android
├── .gitignore
├── .idea
│ ├── caches
│ │ └── build_file_checksums.ser
│ ├── codeStyles
│ │ └── Project.xml
│ ├── gradle.xml
│ ├── misc.xml
│ ├── modules.xml
│ └── runConfigurations.xml
├── app
│ ├── build.gradle
│ ├── google-services.json
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ └── com
│ │ │ └── example
│ │ │ └── minesweeper
│ │ │ └── MainActivity.kt
│ │ └── 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.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
├── demo_1.gif
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Podfile.lock
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ └── contents.xcworkspacedata
└── Runner
│ ├── AppDelegate.swift
│ ├── 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
│ ├── Info.plist
│ └── Runner-Bridging-Header.h
├── lib
├── main.dart
├── model
│ └── user_model.dart
├── pages
│ ├── game_page.dart
│ ├── leaderboard_page.dart
│ └── profile_page.dart
└── widget
│ ├── game_board.dart
│ ├── leaderboard_icon.dart
│ ├── profile_icon.dart
│ └── tiles
│ ├── game_board_covered_mine_tile.dart
│ ├── game_board_inner_tile.dart
│ ├── game_board_open_mine_tile.dart
│ └── game_board_tile.dart
├── minesweeper.iml
├── minesweeper_android.iml
├── pubspec.lock
└── pubspec.yaml
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .dart_tool/
3 |
4 | .packages
5 | .pub/
6 |
7 | build/
8 |
9 | .flutter-plugins
10 |
--------------------------------------------------------------------------------
/.idea/libraries/Dart_Packages.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
--------------------------------------------------------------------------------
/.idea/libraries/Dart_SDK.xml:
--------------------------------------------------------------------------------
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 |
--------------------------------------------------------------------------------
/.idea/libraries/Flutter_Plugins.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/libraries/Flutter_for_Android.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/runConfigurations/main_dart.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
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 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 | resetBoard
116 | "F"
117 | "M"
118 | TileState.reveal
119 | ope
120 | 34
121 | stopWatch.stop
122 | s
123 | s"
124 | tapTile
125 | flag(
126 | open(
127 | mineCount
128 | openTile(
129 | minesFound
130 | stopwatch.stop
131 | (false)
132 | > 9
133 | _showGam
134 | TIM
135 | TIME_
136 | .stop()
137 | .stip
138 | .stop
139 | > 999
140 | _stopGameTi
141 | 999
142 | print
143 | resetB
144 | hasUser
145 |
146 |
147 |
148 |
149 |
150 |
153 |
154 |
155 |
156 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 | 1533276098118
306 |
307 |
308 | 1533276098118
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 | Android
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 |
534 |
535 |
536 |
537 |
538 |
539 |
540 |
541 |
542 |
543 |
544 |
545 |
546 |
547 |
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 | minesweeper
560 |
561 |
562 |
563 |
564 |
565 |
566 |
567 |
568 |
569 |
570 |
571 | Dart Packages
572 |
573 |
574 |
575 |
576 |
577 |
578 |
579 |
580 |
581 |
582 |
583 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: c7ea3ca377e909469c68f2ab878a5bc53d3cf66b
8 | channel: beta
9 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Minesweeper
2 |
3 | A basic minesweeper game built using Flutter.
4 |
5 | ### Demo:
6 |
7 | 
8 |
9 | ### To Do:
10 |
11 | 1. Add Facebook Auth
12 | 2. Use Facebook Auth to maintain high-scores with Firebase's Cloud Firestore
13 | 3. Add game levels (which updates mine count)
14 | 4. Add 'How to play' section since the long-press to add flag action isn't intuitive
15 | 5. Show world rankings based on high-scores
16 | 6. Restrict timer time and hardcode the widget size
17 | 7. Get rid of the default Material Theme = Platform independent UI
18 |
19 | ### References:
20 |
21 | - [Tensor Programming's YouTube tutorial](https://www.youtube.com/watch?v=I4onjC9Mbc4&list=PLJbE2Yu2zumDqr_-hqpAN0nIr6m14TAsd&index=27)
22 |
23 | ## Getting Started
24 |
25 | For help getting started with Flutter, view our online
26 | [documentation](https://flutter.io/).
27 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | *.class
3 | .gradle
4 | /local.properties
5 | /.idea/workspace.xml
6 | /.idea/libraries
7 | .DS_Store
8 | /build
9 | /captures
10 | GeneratedPluginRegistrant.java
11 |
--------------------------------------------------------------------------------
/android/.idea/caches/build_file_checksums.ser:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/android/.idea/caches/build_file_checksums.ser
--------------------------------------------------------------------------------
/android/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
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 |
--------------------------------------------------------------------------------
/android/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/android/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/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 | apply plugin: 'com.android.application'
15 | apply plugin: 'kotlin-android'
16 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
17 |
18 | android {
19 | compileSdkVersion 27
20 |
21 | sourceSets {
22 | main.java.srcDirs += 'src/main/kotlin'
23 | }
24 |
25 | lintOptions {
26 | disable 'InvalidPackage'
27 | }
28 |
29 | defaultConfig {
30 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
31 | applicationId "com.example.minesweeper"
32 | minSdkVersion 16
33 | targetSdkVersion 27
34 | versionCode 1
35 | versionName "1.0"
36 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
37 | multiDexEnabled true
38 | }
39 |
40 | buildTypes {
41 | release {
42 | // TODO: Add your own signing config for the release build.
43 | // Signing with the debug keys for now, so `flutter run --release` works.
44 | signingConfig signingConfigs.debug
45 | }
46 | }
47 | }
48 |
49 | flutter {
50 | source '../..'
51 | }
52 |
53 | dependencies {
54 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
55 | implementation 'com.google.firebase:firebase-core:16.0.0'
56 | testImplementation 'junit:junit:4.12'
57 | androidTestImplementation 'com.android.support.test:runner:1.0.1'
58 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
59 | }
60 |
61 | apply plugin: 'com.google.gms.google-services'
--------------------------------------------------------------------------------
/android/app/google-services.json:
--------------------------------------------------------------------------------
1 | {
2 | "project_info": {
3 | "project_number": "603765012931",
4 | "firebase_url": "https://minesweeper-flutter.firebaseio.com",
5 | "project_id": "minesweeper-flutter",
6 | "storage_bucket": "minesweeper-flutter.appspot.com"
7 | },
8 | "client": [
9 | {
10 | "client_info": {
11 | "mobilesdk_app_id": "1:603765012931:android:f782bfdc6cfeb54a",
12 | "android_client_info": {
13 | "package_name": "com.example.minesweeper"
14 | }
15 | },
16 | "oauth_client": [
17 | {
18 | "client_id": "603765012931-m80us1bapcethkek9e5vp8q3tgdqhc1q.apps.googleusercontent.com",
19 | "client_type": 3
20 | }
21 | ],
22 | "api_key": [
23 | {
24 | "current_key": "AIzaSyBZbl5i4c0yKoebHmmuV7ZdoxUESuvScM0"
25 | }
26 | ],
27 | "services": {
28 | "analytics_service": {
29 | "status": 1
30 | },
31 | "appinvite_service": {
32 | "status": 1,
33 | "other_platform_oauth_client": []
34 | },
35 | "ads_service": {
36 | "status": 2
37 | }
38 | }
39 | }
40 | ],
41 | "configuration_version": "1"
42 | }
--------------------------------------------------------------------------------
/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/kotlin/com/example/minesweeper/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.minesweeper
2 |
3 | import android.os.Bundle
4 |
5 | import io.flutter.app.FlutterActivity
6 | import io.flutter.plugins.GeneratedPluginRegistrant
7 |
8 | class MainActivity(): FlutterActivity() {
9 | override fun onCreate(savedInstanceState: Bundle?) {
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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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 | ext.kotlin_version = '1.1.51'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.0.1'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | classpath 'com.google.gms:google-services:4.0.0'
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | google()
18 | jcenter()
19 | }
20 | }
21 |
22 | rootProject.buildDir = '../build'
23 | subprojects {
24 | project.buildDir = "${rootProject.buildDir}/${project.name}"
25 | }
26 | subprojects {
27 | project.evaluationDependsOn(':app')
28 | }
29 |
30 | task clean(type: Delete) {
31 | delete rootProject.buildDir
32 | }
33 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/android/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/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.1-all.zip
7 |
--------------------------------------------------------------------------------
/android/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/android/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/demo_1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/demo_1.gif
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | .vagrant/
3 | .sconsign.dblite
4 | .svn/
5 |
6 | .DS_Store
7 | *.swp
8 | profile
9 |
10 | DerivedData/
11 | build/
12 | GeneratedPluginRegistrant.h
13 | GeneratedPluginRegistrant.m
14 |
15 | .generated/
16 |
17 | *.pbxuser
18 | *.mode1v3
19 | *.mode2v3
20 | *.perspectivev3
21 |
22 | !default.pbxuser
23 | !default.mode1v3
24 | !default.mode2v3
25 | !default.perspectivev3
26 |
27 | xcuserdata
28 |
29 | *.moved-aside
30 |
31 | *.pyc
32 | *sync/
33 | Icon?
34 | .tags*
35 |
36 | /Flutter/app.flx
37 | /Flutter/app.zip
38 | /Flutter/flutter_assets/
39 | /Flutter/App.framework
40 | /Flutter/Flutter.framework
41 | /Flutter/Generated.xcconfig
42 | /ServiceDefinitions.json
43 |
44 | Pods/
45 | .symlinks/
46 |
--------------------------------------------------------------------------------
/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 | def parse_KV_file(file, separator='=')
8 | file_abs_path = File.expand_path(file)
9 | if !File.exists? file_abs_path
10 | return [];
11 | end
12 | pods_ary = []
13 | skip_line_start_symbols = ["#", "/"]
14 | File.foreach(file_abs_path) { |line|
15 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
16 | plugin = line.split(pattern=separator)
17 | if plugin.length == 2
18 | podname = plugin[0].strip()
19 | path = plugin[1].strip()
20 | podpath = File.expand_path("#{path}", file_abs_path)
21 | pods_ary.push({:name => podname, :path => podpath});
22 | else
23 | puts "Invalid plugin specification: #{line}"
24 | end
25 | }
26 | return pods_ary
27 | end
28 |
29 | target 'Runner' do
30 | use_frameworks!
31 |
32 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
33 | # referring to absolute paths on developers' machines.
34 | system('rm -rf .symlinks')
35 | system('mkdir -p .symlinks/plugins')
36 |
37 | # Flutter Pods
38 | generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig')
39 | if generated_xcode_build_settings.empty?
40 | puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first."
41 | end
42 | generated_xcode_build_settings.map { |p|
43 | if p[:name] == 'FLUTTER_FRAMEWORK_DIR'
44 | symlink = File.join('.symlinks', 'flutter')
45 | File.symlink(File.dirname(p[:path]), symlink)
46 | pod 'Flutter', :path => File.join(symlink, File.basename(p[:path]))
47 | end
48 | }
49 |
50 | # Plugin Pods
51 | plugin_pods = parse_KV_file('../.flutter-plugins')
52 | plugin_pods.map { |p|
53 | symlink = File.join('.symlinks', 'plugins', p[:name])
54 | File.symlink(p[:path], symlink)
55 | pod p[:name], :path => File.join(symlink, 'ios')
56 | }
57 | end
58 |
59 | post_install do |installer|
60 | installer.pods_project.targets.each do |target|
61 | target.build_configurations.each do |config|
62 | config.build_settings['ENABLE_BITCODE'] = 'NO'
63 | end
64 | end
65 | end
66 |
--------------------------------------------------------------------------------
/ios/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - BoringSSL (10.0.5):
3 | - BoringSSL/Implementation (= 10.0.5)
4 | - BoringSSL/Interface (= 10.0.5)
5 | - BoringSSL/Implementation (10.0.5):
6 | - BoringSSL/Interface (= 10.0.5)
7 | - BoringSSL/Interface (10.0.5)
8 | - cloud_firestore (0.0.1):
9 | - Firebase/Auth
10 | - Firebase/Core
11 | - Firebase/Database
12 | - Firebase/Firestore
13 | - Flutter
14 | - Firebase/Auth (5.4.1):
15 | - Firebase/CoreOnly
16 | - FirebaseAuth (= 5.0.2)
17 | - Firebase/Core (5.4.1):
18 | - Firebase/CoreOnly
19 | - FirebaseAnalytics (= 5.0.1)
20 | - Firebase/CoreOnly (5.4.1):
21 | - FirebaseCore (= 5.0.6)
22 | - Firebase/Database (5.4.1):
23 | - Firebase/CoreOnly
24 | - FirebaseDatabase (= 5.0.2)
25 | - Firebase/Firestore (5.4.1):
26 | - Firebase/CoreOnly
27 | - FirebaseFirestore (= 0.12.6)
28 | - firebase_core (0.0.1):
29 | - Firebase/Core
30 | - Flutter
31 | - FirebaseAnalytics (5.0.1):
32 | - FirebaseCore (~> 5.0)
33 | - FirebaseInstanceID (~> 3.0)
34 | - "GoogleToolboxForMac/NSData+zlib (~> 2.1)"
35 | - nanopb (~> 0.3)
36 | - FirebaseAuth (5.0.2):
37 | - FirebaseCore (~> 5.0)
38 | - GTMSessionFetcher/Core (~> 1.1)
39 | - FirebaseCore (5.0.6):
40 | - "GoogleToolboxForMac/NSData+zlib (~> 2.1)"
41 | - FirebaseDatabase (5.0.2):
42 | - FirebaseCore (~> 5.0)
43 | - leveldb-library (~> 1.18)
44 | - FirebaseFirestore (0.12.6):
45 | - FirebaseCore (~> 5.0)
46 | - FirebaseFirestore/abseil-cpp (= 0.12.6)
47 | - gRPC-ProtoRPC (~> 1.0)
48 | - leveldb-library (~> 1.18)
49 | - nanopb (~> 0.3.8)
50 | - Protobuf (~> 3.1)
51 | - FirebaseFirestore/abseil-cpp (0.12.6):
52 | - FirebaseCore (~> 5.0)
53 | - gRPC-ProtoRPC (~> 1.0)
54 | - leveldb-library (~> 1.18)
55 | - nanopb (~> 0.3.8)
56 | - Protobuf (~> 3.1)
57 | - FirebaseInstanceID (3.1.1):
58 | - FirebaseCore (~> 5.0)
59 | - Flutter (1.0.0)
60 | - GoogleToolboxForMac/Defines (2.1.4)
61 | - "GoogleToolboxForMac/NSData+zlib (2.1.4)":
62 | - GoogleToolboxForMac/Defines (= 2.1.4)
63 | - gRPC (1.13.0):
64 | - gRPC-RxLibrary (= 1.13.0)
65 | - gRPC/Main (= 1.13.0)
66 | - gRPC-Core (1.13.0):
67 | - gRPC-Core/Implementation (= 1.13.0)
68 | - gRPC-Core/Interface (= 1.13.0)
69 | - gRPC-Core/Implementation (1.13.0):
70 | - BoringSSL (~> 10.0)
71 | - gRPC-Core/Interface (= 1.13.0)
72 | - nanopb (~> 0.3)
73 | - gRPC-Core/Interface (1.13.0)
74 | - gRPC-ProtoRPC (1.13.0):
75 | - gRPC-ProtoRPC/Main (= 1.13.0)
76 | - gRPC-ProtoRPC/Main (1.13.0):
77 | - gRPC (= 1.13.0)
78 | - gRPC-RxLibrary (= 1.13.0)
79 | - Protobuf (~> 3.0)
80 | - gRPC-RxLibrary (1.13.0)
81 | - gRPC/Main (1.13.0):
82 | - gRPC-Core (= 1.13.0)
83 | - gRPC-RxLibrary (= 1.13.0)
84 | - GTMSessionFetcher/Core (1.1.15)
85 | - leveldb-library (1.20)
86 | - nanopb (0.3.8):
87 | - nanopb/decode (= 0.3.8)
88 | - nanopb/encode (= 0.3.8)
89 | - nanopb/decode (0.3.8)
90 | - nanopb/encode (0.3.8)
91 | - Protobuf (3.6.0)
92 |
93 | DEPENDENCIES:
94 | - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)
95 | - firebase_core (from `.symlinks/plugins/firebase_core/ios`)
96 | - Flutter (from `.symlinks/flutter/ios`)
97 |
98 | SPEC REPOS:
99 | https://github.com/cocoapods/specs.git:
100 | - BoringSSL
101 | - Firebase
102 | - FirebaseAnalytics
103 | - FirebaseAuth
104 | - FirebaseCore
105 | - FirebaseDatabase
106 | - FirebaseFirestore
107 | - FirebaseInstanceID
108 | - GoogleToolboxForMac
109 | - gRPC
110 | - gRPC-Core
111 | - gRPC-ProtoRPC
112 | - gRPC-RxLibrary
113 | - GTMSessionFetcher
114 | - leveldb-library
115 | - nanopb
116 | - Protobuf
117 |
118 | EXTERNAL SOURCES:
119 | cloud_firestore:
120 | :path: ".symlinks/plugins/cloud_firestore/ios"
121 | firebase_core:
122 | :path: ".symlinks/plugins/firebase_core/ios"
123 | Flutter:
124 | :path: ".symlinks/flutter/ios"
125 |
126 | SPEC CHECKSUMS:
127 | BoringSSL: cf3f1793eb6e3c445c4d150456341f149c268a35
128 | cloud_firestore: a2d49d9c7219fce31033eb1a2ee953d7733c91d6
129 | Firebase: 355bd535bfdacaa82a7fe8d9784115edefd6fc03
130 | firebase_core: c96aa8b2fcf7f5167d32f22034f502f9304952b8
131 | FirebaseAnalytics: b3628aea54c50464c32c393fb2ea032566e7ecc2
132 | FirebaseAuth: 096e457cdd4274412a66c4a35874787e411f5a03
133 | FirebaseCore: 4c28e3b9708ba48a765e76515f913a71596eb5dd
134 | FirebaseDatabase: 27be5ac5bc75e0b17537b2bbfada8258addcc8cd
135 | FirebaseFirestore: d4a3a7787624e612298a320da95935b8dc036c1d
136 | FirebaseInstanceID: f3f0657372592ecdfdfe2cac604a5a75758376a6
137 | Flutter: 9d0fac939486c9aba2809b7982dfdbb47a7b0296
138 | GoogleToolboxForMac: 91c824d21e85b31c2aae9bb011c5027c9b4e738f
139 | gRPC: 81b990caa01d7c32605d300c2ffd1b5ba0ef9e49
140 | gRPC-Core: a56b086a8ef5ced6f6ba5be5bc0a63fca185015a
141 | gRPC-ProtoRPC: 842797fbe05dfcf891afb4a5048e5ccf5f06ef86
142 | gRPC-RxLibrary: fa6852f98d6ec0b73c0ec2f6406c26943099d501
143 | GTMSessionFetcher: 5fa5b80fd20e439ef5f545fb2cb3ca6c6714caa2
144 | leveldb-library: 08cba283675b7ed2d99629a4bc5fd052cd2bb6a5
145 | nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3
146 | Protobuf: 0fc0ad8bec688b2a3017a139953e01374fedbd5f
147 |
148 | PODFILE CHECKSUM: 7765ea4305eaab0b3dfd384c7de11902aa3195fd
149 |
150 | COCOAPODS: 1.5.3
151 |
--------------------------------------------------------------------------------
/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 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
16 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };
17 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
18 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };
19 | 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; };
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 | ED9995FF12DB05811B7DAC8C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF7B6E6B669C736396C3C0CF /* Pods_Runner.framework */; };
24 | /* End PBXBuildFile section */
25 |
26 | /* Begin PBXCopyFilesBuildPhase section */
27 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
28 | isa = PBXCopyFilesBuildPhase;
29 | buildActionMask = 2147483647;
30 | dstPath = "";
31 | dstSubfolderSpec = 10;
32 | files = (
33 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,
34 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,
35 | );
36 | name = "Embed Frameworks";
37 | runOnlyForDeploymentPostprocessing = 0;
38 | };
39 | /* End PBXCopyFilesBuildPhase section */
40 |
41 | /* Begin PBXFileReference section */
42 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
43 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
44 | 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; };
45 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
46 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; };
47 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
48 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
49 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
50 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
51 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
52 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; };
53 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
54 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
55 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
56 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
57 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
58 | CF7B6E6B669C736396C3C0CF /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
59 | /* End PBXFileReference section */
60 |
61 | /* Begin PBXFrameworksBuildPhase section */
62 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
63 | isa = PBXFrameworksBuildPhase;
64 | buildActionMask = 2147483647;
65 | files = (
66 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,
67 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */,
68 | ED9995FF12DB05811B7DAC8C /* Pods_Runner.framework in Frameworks */,
69 | );
70 | runOnlyForDeploymentPostprocessing = 0;
71 | };
72 | /* End PBXFrameworksBuildPhase section */
73 |
74 | /* Begin PBXGroup section */
75 | 9740EEB11CF90186004384FC /* Flutter */ = {
76 | isa = PBXGroup;
77 | children = (
78 | 2D5378251FAA1A9400D5DBA9 /* flutter_assets */,
79 | 3B80C3931E831B6300D905FE /* App.framework */,
80 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
81 | 9740EEBA1CF902C7004384FC /* Flutter.framework */,
82 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
83 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
84 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
85 | );
86 | name = Flutter;
87 | sourceTree = "";
88 | };
89 | 97C146E51CF9000F007C117D = {
90 | isa = PBXGroup;
91 | children = (
92 | 9740EEB11CF90186004384FC /* Flutter */,
93 | 97C146F01CF9000F007C117D /* Runner */,
94 | 97C146EF1CF9000F007C117D /* Products */,
95 | DDE3F8EDC677B5BEEE7834D9 /* Pods */,
96 | F278AF421DF05CD6C4B5DF5C /* Frameworks */,
97 | );
98 | sourceTree = "";
99 | };
100 | 97C146EF1CF9000F007C117D /* Products */ = {
101 | isa = PBXGroup;
102 | children = (
103 | 97C146EE1CF9000F007C117D /* Runner.app */,
104 | );
105 | name = Products;
106 | sourceTree = "";
107 | };
108 | 97C146F01CF9000F007C117D /* Runner */ = {
109 | isa = PBXGroup;
110 | children = (
111 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
112 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
113 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
114 | 97C147021CF9000F007C117D /* Info.plist */,
115 | 97C146F11CF9000F007C117D /* Supporting Files */,
116 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
117 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
118 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
119 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
120 | );
121 | path = Runner;
122 | sourceTree = "";
123 | };
124 | 97C146F11CF9000F007C117D /* Supporting Files */ = {
125 | isa = PBXGroup;
126 | children = (
127 | );
128 | name = "Supporting Files";
129 | sourceTree = "";
130 | };
131 | DDE3F8EDC677B5BEEE7834D9 /* Pods */ = {
132 | isa = PBXGroup;
133 | children = (
134 | );
135 | name = Pods;
136 | sourceTree = "";
137 | };
138 | F278AF421DF05CD6C4B5DF5C /* Frameworks */ = {
139 | isa = PBXGroup;
140 | children = (
141 | CF7B6E6B669C736396C3C0CF /* Pods_Runner.framework */,
142 | );
143 | name = Frameworks;
144 | sourceTree = "";
145 | };
146 | /* End PBXGroup section */
147 |
148 | /* Begin PBXNativeTarget section */
149 | 97C146ED1CF9000F007C117D /* Runner */ = {
150 | isa = PBXNativeTarget;
151 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
152 | buildPhases = (
153 | 28D81CC5AC37E1CF9B8F5135 /* [CP] Check Pods Manifest.lock */,
154 | 9740EEB61CF901F6004384FC /* Run Script */,
155 | 97C146EA1CF9000F007C117D /* Sources */,
156 | 97C146EB1CF9000F007C117D /* Frameworks */,
157 | 97C146EC1CF9000F007C117D /* Resources */,
158 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
159 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
160 | A2DBB8F34F9184A87F55873D /* [CP] Embed Pods Frameworks */,
161 | );
162 | buildRules = (
163 | );
164 | dependencies = (
165 | );
166 | name = Runner;
167 | productName = Runner;
168 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
169 | productType = "com.apple.product-type.application";
170 | };
171 | /* End PBXNativeTarget section */
172 |
173 | /* Begin PBXProject section */
174 | 97C146E61CF9000F007C117D /* Project object */ = {
175 | isa = PBXProject;
176 | attributes = {
177 | LastUpgradeCheck = 0910;
178 | ORGANIZATIONNAME = "The Chromium Authors";
179 | TargetAttributes = {
180 | 97C146ED1CF9000F007C117D = {
181 | CreatedOnToolsVersion = 7.3.1;
182 | LastSwiftMigration = 0910;
183 | };
184 | };
185 | };
186 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
187 | compatibilityVersion = "Xcode 3.2";
188 | developmentRegion = English;
189 | hasScannedForEncodings = 0;
190 | knownRegions = (
191 | en,
192 | Base,
193 | );
194 | mainGroup = 97C146E51CF9000F007C117D;
195 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
196 | projectDirPath = "";
197 | projectRoot = "";
198 | targets = (
199 | 97C146ED1CF9000F007C117D /* Runner */,
200 | );
201 | };
202 | /* End PBXProject section */
203 |
204 | /* Begin PBXResourcesBuildPhase section */
205 | 97C146EC1CF9000F007C117D /* Resources */ = {
206 | isa = PBXResourcesBuildPhase;
207 | buildActionMask = 2147483647;
208 | files = (
209 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
210 | 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */,
211 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
212 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,
213 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
214 | 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */,
215 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
216 | );
217 | runOnlyForDeploymentPostprocessing = 0;
218 | };
219 | /* End PBXResourcesBuildPhase section */
220 |
221 | /* Begin PBXShellScriptBuildPhase section */
222 | 28D81CC5AC37E1CF9B8F5135 /* [CP] Check Pods Manifest.lock */ = {
223 | isa = PBXShellScriptBuildPhase;
224 | buildActionMask = 2147483647;
225 | files = (
226 | );
227 | inputPaths = (
228 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
229 | "${PODS_ROOT}/Manifest.lock",
230 | );
231 | name = "[CP] Check Pods Manifest.lock";
232 | outputPaths = (
233 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
234 | );
235 | runOnlyForDeploymentPostprocessing = 0;
236 | shellPath = /bin/sh;
237 | 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";
238 | showEnvVarsInLog = 0;
239 | };
240 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
241 | isa = PBXShellScriptBuildPhase;
242 | buildActionMask = 2147483647;
243 | files = (
244 | );
245 | inputPaths = (
246 | );
247 | name = "Thin Binary";
248 | outputPaths = (
249 | );
250 | runOnlyForDeploymentPostprocessing = 0;
251 | shellPath = /bin/sh;
252 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin";
253 | };
254 | 9740EEB61CF901F6004384FC /* Run Script */ = {
255 | isa = PBXShellScriptBuildPhase;
256 | buildActionMask = 2147483647;
257 | files = (
258 | );
259 | inputPaths = (
260 | );
261 | name = "Run Script";
262 | outputPaths = (
263 | );
264 | runOnlyForDeploymentPostprocessing = 0;
265 | shellPath = /bin/sh;
266 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
267 | };
268 | A2DBB8F34F9184A87F55873D /* [CP] Embed Pods Frameworks */ = {
269 | isa = PBXShellScriptBuildPhase;
270 | buildActionMask = 2147483647;
271 | files = (
272 | );
273 | inputPaths = (
274 | "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
275 | "${BUILT_PRODUCTS_DIR}/BoringSSL/openssl.framework",
276 | "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework",
277 | "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework",
278 | "${BUILT_PRODUCTS_DIR}/GoogleToolboxForMac/GoogleToolboxForMac.framework",
279 | "${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework",
280 | "${BUILT_PRODUCTS_DIR}/gRPC/GRPCClient.framework",
281 | "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework",
282 | "${BUILT_PRODUCTS_DIR}/gRPC-ProtoRPC/ProtoRPC.framework",
283 | "${BUILT_PRODUCTS_DIR}/gRPC-RxLibrary/RxLibrary.framework",
284 | "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework",
285 | "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework",
286 | );
287 | name = "[CP] Embed Pods Frameworks";
288 | outputPaths = (
289 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl.framework",
290 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
291 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework",
292 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleToolboxForMac.framework",
293 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework",
294 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GRPCClient.framework",
295 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework",
296 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ProtoRPC.framework",
297 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxLibrary.framework",
298 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework",
299 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework",
300 | );
301 | runOnlyForDeploymentPostprocessing = 0;
302 | shellPath = /bin/sh;
303 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
304 | showEnvVarsInLog = 0;
305 | };
306 | /* End PBXShellScriptBuildPhase section */
307 |
308 | /* Begin PBXSourcesBuildPhase section */
309 | 97C146EA1CF9000F007C117D /* Sources */ = {
310 | isa = PBXSourcesBuildPhase;
311 | buildActionMask = 2147483647;
312 | files = (
313 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
314 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
315 | );
316 | runOnlyForDeploymentPostprocessing = 0;
317 | };
318 | /* End PBXSourcesBuildPhase section */
319 |
320 | /* Begin PBXVariantGroup section */
321 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
322 | isa = PBXVariantGroup;
323 | children = (
324 | 97C146FB1CF9000F007C117D /* Base */,
325 | );
326 | name = Main.storyboard;
327 | sourceTree = "";
328 | };
329 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
330 | isa = PBXVariantGroup;
331 | children = (
332 | 97C147001CF9000F007C117D /* Base */,
333 | );
334 | name = LaunchScreen.storyboard;
335 | sourceTree = "";
336 | };
337 | /* End PBXVariantGroup section */
338 |
339 | /* Begin XCBuildConfiguration section */
340 | 97C147031CF9000F007C117D /* Debug */ = {
341 | isa = XCBuildConfiguration;
342 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
343 | buildSettings = {
344 | ALWAYS_SEARCH_USER_PATHS = NO;
345 | CLANG_ANALYZER_NONNULL = YES;
346 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
347 | CLANG_CXX_LIBRARY = "libc++";
348 | CLANG_ENABLE_MODULES = YES;
349 | CLANG_ENABLE_OBJC_ARC = YES;
350 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
351 | CLANG_WARN_BOOL_CONVERSION = YES;
352 | CLANG_WARN_COMMA = YES;
353 | CLANG_WARN_CONSTANT_CONVERSION = YES;
354 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
355 | CLANG_WARN_EMPTY_BODY = YES;
356 | CLANG_WARN_ENUM_CONVERSION = YES;
357 | CLANG_WARN_INFINITE_RECURSION = YES;
358 | CLANG_WARN_INT_CONVERSION = YES;
359 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
360 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
361 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
362 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
363 | CLANG_WARN_STRICT_PROTOTYPES = YES;
364 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
365 | CLANG_WARN_UNREACHABLE_CODE = YES;
366 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
367 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
368 | COPY_PHASE_STRIP = NO;
369 | DEBUG_INFORMATION_FORMAT = dwarf;
370 | ENABLE_STRICT_OBJC_MSGSEND = YES;
371 | ENABLE_TESTABILITY = YES;
372 | GCC_C_LANGUAGE_STANDARD = gnu99;
373 | GCC_DYNAMIC_NO_PIC = NO;
374 | GCC_NO_COMMON_BLOCKS = YES;
375 | GCC_OPTIMIZATION_LEVEL = 0;
376 | GCC_PREPROCESSOR_DEFINITIONS = (
377 | "DEBUG=1",
378 | "$(inherited)",
379 | );
380 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
381 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
382 | GCC_WARN_UNDECLARED_SELECTOR = YES;
383 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
384 | GCC_WARN_UNUSED_FUNCTION = YES;
385 | GCC_WARN_UNUSED_VARIABLE = YES;
386 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
387 | MTL_ENABLE_DEBUG_INFO = YES;
388 | ONLY_ACTIVE_ARCH = YES;
389 | SDKROOT = iphoneos;
390 | TARGETED_DEVICE_FAMILY = "1,2";
391 | };
392 | name = Debug;
393 | };
394 | 97C147041CF9000F007C117D /* Release */ = {
395 | isa = XCBuildConfiguration;
396 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
397 | buildSettings = {
398 | ALWAYS_SEARCH_USER_PATHS = NO;
399 | CLANG_ANALYZER_NONNULL = YES;
400 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
401 | CLANG_CXX_LIBRARY = "libc++";
402 | CLANG_ENABLE_MODULES = YES;
403 | CLANG_ENABLE_OBJC_ARC = YES;
404 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
405 | CLANG_WARN_BOOL_CONVERSION = YES;
406 | CLANG_WARN_COMMA = YES;
407 | CLANG_WARN_CONSTANT_CONVERSION = YES;
408 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
409 | CLANG_WARN_EMPTY_BODY = YES;
410 | CLANG_WARN_ENUM_CONVERSION = YES;
411 | CLANG_WARN_INFINITE_RECURSION = YES;
412 | CLANG_WARN_INT_CONVERSION = YES;
413 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
414 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
415 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
416 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
417 | CLANG_WARN_STRICT_PROTOTYPES = YES;
418 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
419 | CLANG_WARN_UNREACHABLE_CODE = YES;
420 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
421 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
422 | COPY_PHASE_STRIP = NO;
423 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
424 | ENABLE_NS_ASSERTIONS = NO;
425 | ENABLE_STRICT_OBJC_MSGSEND = YES;
426 | GCC_C_LANGUAGE_STANDARD = gnu99;
427 | GCC_NO_COMMON_BLOCKS = YES;
428 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
429 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
430 | GCC_WARN_UNDECLARED_SELECTOR = YES;
431 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
432 | GCC_WARN_UNUSED_FUNCTION = YES;
433 | GCC_WARN_UNUSED_VARIABLE = YES;
434 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
435 | MTL_ENABLE_DEBUG_INFO = NO;
436 | SDKROOT = iphoneos;
437 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
438 | TARGETED_DEVICE_FAMILY = "1,2";
439 | VALIDATE_PRODUCT = YES;
440 | };
441 | name = Release;
442 | };
443 | 97C147061CF9000F007C117D /* Debug */ = {
444 | isa = XCBuildConfiguration;
445 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
446 | buildSettings = {
447 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
448 | CLANG_ENABLE_MODULES = YES;
449 | CURRENT_PROJECT_VERSION = 1;
450 | ENABLE_BITCODE = NO;
451 | FRAMEWORK_SEARCH_PATHS = (
452 | "$(inherited)",
453 | "$(PROJECT_DIR)/Flutter",
454 | );
455 | INFOPLIST_FILE = Runner/Info.plist;
456 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
457 | LIBRARY_SEARCH_PATHS = (
458 | "$(inherited)",
459 | "$(PROJECT_DIR)/Flutter",
460 | );
461 | PRODUCT_BUNDLE_IDENTIFIER = com.example.minesweeper;
462 | PRODUCT_NAME = "$(TARGET_NAME)";
463 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
464 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
465 | SWIFT_SWIFT3_OBJC_INFERENCE = On;
466 | SWIFT_VERSION = 4.0;
467 | VERSIONING_SYSTEM = "apple-generic";
468 | };
469 | name = Debug;
470 | };
471 | 97C147071CF9000F007C117D /* Release */ = {
472 | isa = XCBuildConfiguration;
473 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
474 | buildSettings = {
475 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
476 | CLANG_ENABLE_MODULES = YES;
477 | CURRENT_PROJECT_VERSION = 1;
478 | ENABLE_BITCODE = NO;
479 | FRAMEWORK_SEARCH_PATHS = (
480 | "$(inherited)",
481 | "$(PROJECT_DIR)/Flutter",
482 | );
483 | INFOPLIST_FILE = Runner/Info.plist;
484 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
485 | LIBRARY_SEARCH_PATHS = (
486 | "$(inherited)",
487 | "$(PROJECT_DIR)/Flutter",
488 | );
489 | PRODUCT_BUNDLE_IDENTIFIER = com.example.minesweeper;
490 | PRODUCT_NAME = "$(TARGET_NAME)";
491 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
492 | SWIFT_SWIFT3_OBJC_INFERENCE = On;
493 | SWIFT_VERSION = 4.0;
494 | VERSIONING_SYSTEM = "apple-generic";
495 | };
496 | name = Release;
497 | };
498 | /* End XCBuildConfiguration section */
499 |
500 | /* Begin XCConfigurationList section */
501 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
502 | isa = XCConfigurationList;
503 | buildConfigurations = (
504 | 97C147031CF9000F007C117D /* Debug */,
505 | 97C147041CF9000F007C117D /* Release */,
506 | );
507 | defaultConfigurationIsVisible = 0;
508 | defaultConfigurationName = Release;
509 | };
510 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
511 | isa = XCConfigurationList;
512 | buildConfigurations = (
513 | 97C147061CF9000F007C117D /* Debug */,
514 | 97C147071CF9000F007C117D /* Release */,
515 | );
516 | defaultConfigurationIsVisible = 0;
517 | defaultConfigurationName = Release;
518 | };
519 | /* End XCConfigurationList section */
520 | };
521 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
522 | }
523 |
--------------------------------------------------------------------------------
/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/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/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/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rohan20/flutter-minesweeper/2b832d5642b025aad0af1c836b5f394573f61d04/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | minesweeper
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
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/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:minesweeper/pages/game_page.dart';
3 |
4 | void main() {
5 | runApp(GamePage());
6 | }
7 |
--------------------------------------------------------------------------------
/lib/model/user_model.dart:
--------------------------------------------------------------------------------
1 | class User {
2 | final int id;
3 | final String name;
4 | final String email;
5 | final String imageUrl;
6 | final int score;
7 |
8 | User({this.id, this.name, this.email, this.imageUrl, this.score});
9 | }
10 |
--------------------------------------------------------------------------------
/lib/pages/game_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:minesweeper/pages/profile_page.dart';
3 | import 'package:minesweeper/widget/game_board.dart';
4 | import 'package:minesweeper/widget/leaderboard_icon.dart';
5 | import 'package:minesweeper/widget/profile_icon.dart';
6 |
7 | //covered tile = un-opened tile
8 | enum TileState { covered, blown, open, flagged, revealed }
9 |
10 | class GamePage extends StatelessWidget {
11 | @override
12 | Widget build(BuildContext context) {
13 | return MaterialApp(
14 | home: Scaffold(
15 | appBar: AppBar(
16 | centerTitle: true,
17 | title: Text("Minesweeper"),
18 | actions: [
19 | LeaderboardIcon(),
20 | ProfileIcon(),
21 | ],
22 | ),
23 | body: GameBoard(),
24 | ),
25 | );
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/lib/pages/leaderboard_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:cloud_firestore/cloud_firestore.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:minesweeper/model/user_model.dart';
4 |
5 | class LeaderboardPage extends StatefulWidget {
6 | @override
7 | _ProfilePageState createState() => _ProfilePageState();
8 | }
9 |
10 | class _ProfilePageState extends State {
11 | @override
12 | Widget build(BuildContext context) {
13 | return Scaffold(
14 | appBar: AppBar(
15 | title: Text("Leaderboard"),
16 | centerTitle: true,
17 | ),
18 | body: Container(
19 | child: Center(
20 | child: StreamBuilder(
21 | stream: Firestore.instance.collection("users").snapshots(),
22 | builder: (context, snapshot) {
23 | if (snapshot.hasData) {
24 | List documentSnapshotsList =
25 | snapshot.data.documents;
26 |
27 | List usersList = [];
28 |
29 | documentSnapshotsList.forEach((documentSnapshot) {
30 | User user = User(
31 | id: documentSnapshot["user_id"],
32 | name: documentSnapshot["name"],
33 | email: documentSnapshot["email"],
34 | imageUrl: documentSnapshot["image_url"],
35 | score: documentSnapshot["score"],
36 | );
37 |
38 | usersList.add(user);
39 | });
40 |
41 | //sort users on the basis of their time score
42 | usersList
43 | .sort((user1, user2) => user1.score.compareTo(user2.score));
44 |
45 | return _buildLeaderboardList(usersList);
46 | } else if (snapshot.hasError)
47 | return Text("false");
48 | else {
49 | return CircularProgressIndicator();
50 | }
51 | },
52 | ),
53 | ),
54 | ),
55 | );
56 | }
57 |
58 | Widget _buildLeaderboardList(List usersList) {
59 | return ListView.builder(
60 | itemCount: usersList.length,
61 | itemBuilder: (context, index) {
62 | User user = usersList[index];
63 |
64 | return Padding(
65 | padding: const EdgeInsets.fromLTRB(20.0, 8.0, 12.0, 8.0),
66 | child: Row(
67 | children: [
68 | _buildUserImage(user, index),
69 | _buildUserName(user),
70 | _buildUserScore(user),
71 | ],
72 | ),
73 | );
74 | },
75 | );
76 | }
77 |
78 | _buildUserImage(User user, int index) {
79 | return Container(
80 | width: 70.0,
81 | height: 70.0,
82 | decoration: BoxDecoration(
83 | shape: BoxShape.circle,
84 | image: DecorationImage(
85 | fit: BoxFit.cover,
86 | image: NetworkImage(user.imageUrl),
87 | ),
88 | ),
89 | child: Container(
90 | alignment: Alignment.bottomRight,
91 | child: CircleAvatar(
92 | radius: 12.0,
93 | foregroundColor: Colors.black,
94 | backgroundColor: Colors.yellow,
95 | child: Center(
96 | child: Text(
97 | "${index + 1}",
98 | style: TextStyle(
99 | fontSize: 12.0,
100 | fontWeight: FontWeight.bold,
101 | ),
102 | ),
103 | ),
104 | ),
105 | ),
106 | );
107 | }
108 |
109 | _buildUserName(User user) {
110 | return Expanded(
111 | child: Center(child: Text(user.name, style: TextStyle(fontSize: 20.0))),
112 | flex: 3,
113 | );
114 | }
115 |
116 | _buildUserScore(User user) {
117 | return Expanded(
118 | child: Container(
119 | height: 50.0,
120 | width: 50.0,
121 | child: CircleAvatar(
122 | backgroundColor: Colors.blue,
123 | foregroundColor: Colors.white,
124 | child: Text(user.score.toString(), style: TextStyle(fontSize: 24.0)),
125 | ),
126 | ),
127 | flex: 1,
128 | );
129 | }
130 | }
131 |
--------------------------------------------------------------------------------
/lib/pages/profile_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:cloud_firestore/cloud_firestore.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:minesweeper/model/user_model.dart';
4 |
5 | class ProfilePage extends StatefulWidget {
6 | @override
7 | _ProfilePageState createState() => _ProfilePageState();
8 | }
9 |
10 | class _ProfilePageState extends State {
11 | @override
12 | Widget build(BuildContext context) {
13 | return Scaffold(
14 | appBar: AppBar(
15 | title: Text("Profile"),
16 | centerTitle: true,
17 | ),
18 | body: Container(
19 | child: Center(
20 | child: StreamBuilder(
21 | stream: Firestore.instance.collection("users").snapshots(),
22 | builder: (context, snapshot) {
23 | if (snapshot.hasData) {
24 | DocumentSnapshot documentSnapshot = snapshot.data.documents[0];
25 |
26 | User user = User(
27 | id: documentSnapshot["user_id"],
28 | name: documentSnapshot["name"],
29 | email: documentSnapshot["email"],
30 | imageUrl: documentSnapshot["image_url"],
31 | score: documentSnapshot["score"],
32 | );
33 |
34 | return _buildUserProfile(user);
35 | } else if (snapshot.hasError)
36 | return Text("false");
37 | else {
38 | return CircularProgressIndicator();
39 | }
40 | },
41 | ),
42 | ),
43 | ),
44 | );
45 | }
46 |
47 | Widget _buildUserProfile(User user) {
48 | return Padding(
49 | padding: const EdgeInsets.symmetric(vertical: 28.0),
50 | child: Column(
51 | children: [
52 | Container(
53 | width: 150.0,
54 | height: 150.0,
55 | decoration: BoxDecoration(
56 | shape: BoxShape.circle,
57 | image: DecorationImage(
58 | image: NetworkImage(user.imageUrl),
59 | ),
60 | ),
61 | ),
62 | SizedBox(height: 20.0),
63 | Text(user.name, style: TextStyle(fontSize: 24.0)),
64 | SizedBox(height: 12.0),
65 | Text("Highscore: ${user.score}", style: TextStyle(fontSize: 20.0)),
66 | SizedBox(height: 12.0),
67 | Text(user.email),
68 | ],
69 | ),
70 | );
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/lib/widget/game_board.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:cloud_firestore/cloud_firestore.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:minesweeper/pages/game_page.dart';
6 | import 'package:minesweeper/widget/tiles/game_board_covered_mine_tile.dart';
7 | import 'package:minesweeper/widget/tiles/game_board_open_mine_tile.dart';
8 | import 'package:minesweeper/widget/tiles/game_board_tile.dart';
9 | import 'dart:math';
10 |
11 | enum GameResult { WON, LOST, TIME_LIMIT_EXCEEDED }
12 |
13 | class GameBoard extends StatefulWidget {
14 | @override
15 | _GameBoardState createState() => _GameBoardState();
16 | }
17 |
18 | class _GameBoardState extends State {
19 | final int timeLimit = 999;
20 |
21 | final int numOfRows = 9;
22 | final int numOfColumns = 9;
23 | final int numOfMines = 11;
24 |
25 | List> gameTilesState;
26 | List> gameTilesMineStatus;
27 |
28 | bool isUserAlive;
29 | bool hasUserWonGame;
30 | int minesFound;
31 | Timer timer;
32 | Stopwatch stopwatch = Stopwatch();
33 |
34 | @override
35 | void dispose() {
36 | timer?.cancel();
37 | super.dispose();
38 | }
39 |
40 | void resetBoard() {
41 | isUserAlive = true;
42 | hasUserWonGame = false;
43 | minesFound = 0;
44 |
45 | stopwatch.reset();
46 | _stopGameTimer();
47 | //the callback method just invokes setState() because we want the time to update
48 | //every second
49 |
50 | timer = Timer.periodic(
51 | Duration(seconds: 1),
52 | (timer) {
53 | setState(() {});
54 | },
55 | );
56 |
57 | //2D list for tile status (covered/blown/open/flagged/revealed)
58 | gameTilesState = List>.generate(numOfRows, (row) {
59 | return List.filled(numOfColumns, TileState.covered);
60 | });
61 |
62 | //2D list for tile mine status (true for mine, false for normal)
63 | gameTilesMineStatus = List>.generate(numOfRows, (row) {
64 | return List.filled(numOfColumns, false);
65 | });
66 |
67 | //logic to place mines on the game board
68 | Random random = Random();
69 | int remainingNumOfMines = numOfMines;
70 |
71 | while (remainingNumOfMines > 0) {
72 | int positionOfMine = random.nextInt(numOfRows * numOfColumns);
73 | int rowIndexOfMine = positionOfMine ~/ numOfRows;
74 | int columnIndexOfMine = positionOfMine % numOfColumns;
75 |
76 | //check if new position doesn't have a mine already
77 | if (!gameTilesMineStatus[rowIndexOfMine][columnIndexOfMine]) {
78 | gameTilesMineStatus[rowIndexOfMine][columnIndexOfMine] = true;
79 | remainingNumOfMines--;
80 | }
81 | }
82 | }
83 |
84 | @override
85 | void initState() {
86 | resetBoard();
87 | super.initState();
88 | }
89 |
90 | Widget _buildBoard() {
91 | //covered tile = un-opened tile
92 | bool doesBoardHaveACoveredTile = false;
93 |
94 | List gameBoardRow = [];
95 |
96 | for (int y = 0; y < numOfRows; y++) {
97 | List rowChildren = [];
98 |
99 | for (int x = 0; x < numOfColumns; x++) {
100 | TileState tileState = gameTilesState[y][x];
101 | int minesNearMeCount = surroundingMinesCount(x, y);
102 |
103 | //reveal all mines if user has clicked on a mine
104 | if (!isUserAlive) {
105 | if (tileState != TileState.blown)
106 | //if the current tile has a mine, reveal it, else let it be
107 | tileState =
108 | gameTilesMineStatus[y][x] ? TileState.revealed : tileState;
109 | }
110 |
111 | if (tileState == TileState.covered || tileState == TileState.flagged) {
112 | rowChildren.add(
113 | GestureDetector(
114 | onTap: () {
115 | //allow user to click a tile only if it is covered (so that
116 | //we can't click on flagged tiles)
117 | if (tileState == TileState.covered) tapTile(x, y);
118 | },
119 | onLongPress: () {
120 | flag(x, y);
121 | },
122 | child: Tile(
123 | child: CoveredMineTile(
124 | flagged: tileState == TileState.flagged,
125 | posX: y,
126 | posY: x,
127 | ),
128 | ),
129 | ),
130 | );
131 |
132 | //if there are any tiles that are covered (haven't been opened or
133 | //revealed yet), then doesBoardHaveACoveredTile is true
134 | if (tileState == TileState.covered) {
135 | doesBoardHaveACoveredTile = true;
136 | }
137 | } else {
138 | rowChildren.add(
139 | OpenMineTile(
140 | state: tileState,
141 | surroundingMinesCount: minesNearMeCount,
142 | ),
143 | );
144 | }
145 | }
146 |
147 | gameBoardRow.add(Row(
148 | children: rowChildren,
149 | mainAxisAlignment: MainAxisAlignment.center,
150 | key: ValueKey(y),
151 | ));
152 | }
153 |
154 | //the user can win the game only when you've opened all the tiles and
155 | //marked all mine tiles as flagged
156 | if (!doesBoardHaveACoveredTile) {
157 | if ((minesFound == numOfMines) && isUserAlive) {
158 | DocumentReference currentUserDocumentReference = Firestore.instance
159 | .collection("users")
160 | .document("1y7lOozokrP1T19GaBYk");
161 |
162 | //update highscore
163 | //TODO Update only if new time < highscore
164 | Map map = Map();
165 | map.putIfAbsent("score", () => stopwatch.elapsed.inSeconds);
166 |
167 | currentUserDocumentReference.setData(map, merge: true);
168 |
169 | hasUserWonGame = true;
170 | isUserAlive = false;
171 | _stopGameTimer();
172 | _showGameStatusDialog(GameResult.WON);
173 | }
174 | }
175 |
176 | return Container(
177 | padding: const EdgeInsets.all(10.0),
178 | child: Column(
179 | mainAxisSize: MainAxisSize.min,
180 | children: gameBoardRow,
181 | ),
182 | );
183 | }
184 |
185 | /*
186 | Check if the tile tapped lies inside the board or not. This is needed so that
187 | you don't have to do extra handling in the surroundingMinesCount() method when
188 | x or y become < 0 or greater than numOfColumns/numOfRows.
189 | */
190 | bool isInBoard(int x, int y) =>
191 | x >= 0 && x < numOfColumns && y >= 0 && y < numOfRows;
192 |
193 | /*
194 | Check if the current tile has a mine or not. If it is, return 1 else return 0.
195 | Return 1 so that this can help with the surroundingMinesCount() method.
196 | */
197 | int isAMine(int x, int y) =>
198 | isInBoard(x, y) && gameTilesMineStatus[y][x] ? 1 : 0;
199 |
200 | /*
201 | Calculate the number of mines around a tile. The count would act as the number
202 | to be displayed on the tile
203 | */
204 | int surroundingMinesCount(int x, int y) {
205 | int count = 0;
206 |
207 | //check left column
208 | count += isAMine(x - 1, y - 1);
209 | count += isAMine(x - 1, y);
210 | count += isAMine(x - 1, y + 1);
211 |
212 | //check same column
213 | count += isAMine(x, y - 1);
214 | count += isAMine(x, y + 1);
215 |
216 | //check right column
217 | count += isAMine(x + 1, y - 1);
218 | count += isAMine(x + 1, y);
219 | count += isAMine(x + 1, y + 1);
220 |
221 | return count;
222 | }
223 |
224 | void flag(int x, int y) {
225 | if (!isUserAlive) {
226 | return;
227 | }
228 |
229 | setState(() {
230 | if (gameTilesState[y][x] == TileState.flagged) {
231 | gameTilesState[y][x] = TileState.covered;
232 | minesFound--;
233 | } else {
234 | gameTilesState[y][x] = TileState.flagged;
235 | minesFound++;
236 | }
237 | });
238 | }
239 |
240 | void openTile(int x, int y) {
241 | //if the user clicks outside the board
242 | if (!isInBoard(x, y)) {
243 | return;
244 | }
245 |
246 | //if the user clicks an already opened tile
247 | if (gameTilesState[y][x] == TileState.open) {
248 | return;
249 | }
250 |
251 | //if the user had flagged this tile previously, reduce the flagged count
252 | if (gameTilesState[y][x] == TileState.flagged) minesFound--;
253 |
254 | gameTilesState[y][x] = TileState.open;
255 |
256 | //if you click a tile that has a number, the game would only open that tile.
257 | //But if you click an empty tile, then we want to open all tiles nearby
258 | // until we hit a tile that has a number
259 | if (surroundingMinesCount(x, y) > 0) {
260 | return;
261 | }
262 |
263 | //left column
264 | openTile(x - 1, y + 1);
265 | openTile(x - 1, y);
266 | openTile(x - 1, y - 1);
267 |
268 | //same column
269 | openTile(x, y + 1);
270 | openTile(x, y - 1);
271 |
272 | //right column
273 | openTile(x + 1, y + 1);
274 | openTile(x + 1, y);
275 | openTile(x + 1, y - 1);
276 | }
277 |
278 | void tapTile(int x, int y) {
279 | if (!isUserAlive) {
280 | return;
281 | }
282 |
283 | if (gameTilesState[y][x] == TileState.flagged) {
284 | return;
285 | }
286 |
287 | setState(() {
288 | if (gameTilesMineStatus[y][x]) {
289 | gameTilesState[y][x] = TileState.blown;
290 | isUserAlive = false;
291 | _stopGameTimer();
292 | _showGameStatusDialog(GameResult.LOST);
293 | } else {
294 | openTile(x, y);
295 | if (!stopwatch.isRunning) {
296 | stopwatch.start();
297 | }
298 | }
299 | });
300 | }
301 |
302 | @override
303 | Widget build(BuildContext context) {
304 | int timeElapsed = stopwatch.elapsedMilliseconds ~/ 1000;
305 |
306 | return Container(
307 | color: Colors.white,
308 | child: Column(
309 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
310 | children: [
311 | Row(
312 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
313 | children: [
314 | Row(
315 | children: [
316 | _buildMinesFoundCountWidget(),
317 | SizedBox(width: 12.0),
318 | _buildTotalMineCountWidget(),
319 | ],
320 | ),
321 | _buildTimerWidget(timeElapsed),
322 | ],
323 | ),
324 | _buildBoard(),
325 | _buildResetWidget(),
326 | ],
327 | ),
328 | );
329 | }
330 |
331 | _buildTimerWidget(int timeElapsed) {
332 | int unitsDigit = timeElapsed % 10;
333 | int hundredsDigit = timeElapsed ~/ 100;
334 | int tensDigit = (timeElapsed - (hundredsDigit * 100)) ~/ 10;
335 |
336 | if (timeElapsed > timeLimit) {
337 | _stopGameTimer();
338 | isUserAlive = false;
339 | _showGameStatusDialog(GameResult.TIME_LIMIT_EXCEEDED);
340 | }
341 |
342 | return Container(
343 | padding: const EdgeInsets.all(30.0),
344 | decoration: BoxDecoration(
345 | color: Colors.yellow,
346 | shape: BoxShape.circle,
347 | ),
348 | child: timeElapsed > timeLimit
349 | ? Text(
350 | "∞",
351 | style: TextStyle(
352 | fontWeight: FontWeight.bold,
353 | fontSize: 24.0,
354 | ),
355 | )
356 | : Row(
357 | children: [
358 | _buildDigitContainer(hundredsDigit),
359 | _buildDigitContainer(tensDigit),
360 | _buildDigitContainer(unitsDigit),
361 | ],
362 | ),
363 | );
364 | }
365 |
366 | _buildResetWidget() {
367 | return RaisedButton(
368 | onPressed: () => resetBoard(),
369 | child: Container(
370 | padding: const EdgeInsets.all(12.0),
371 | child: Text("RESET"),
372 | ),
373 | );
374 | }
375 |
376 | _buildTotalMineCountWidget() {
377 | return Container(
378 | height: 70.0,
379 | width: 70.0,
380 | decoration: BoxDecoration(
381 | color: Colors.red,
382 | shape: BoxShape.circle,
383 | ),
384 | child: Center(
385 | child: Text(
386 | "$numOfMines",
387 | style: TextStyle(
388 | color: Colors.white,
389 | fontWeight: FontWeight.bold,
390 | fontSize: 28.0,
391 | ),
392 | ),
393 | ),
394 | );
395 | }
396 |
397 | _buildMinesFoundCountWidget() {
398 | return Container(
399 | height: 70.0,
400 | width: 70.0,
401 | decoration: BoxDecoration(
402 | color: Colors.green,
403 | shape: BoxShape.circle,
404 | ),
405 | child: Center(
406 | child: Text(
407 | "$minesFound",
408 | style: TextStyle(
409 | color: Colors.white,
410 | fontWeight: FontWeight.bold,
411 | fontSize: 28.0,
412 | ),
413 | ),
414 | ),
415 | );
416 | }
417 |
418 | Future _showGameStatusDialog(gameResult) async {
419 | await showDialog(
420 | context: context,
421 | builder: (context) {
422 | return _gameStatusDialog(gameResult);
423 | });
424 | }
425 |
426 | _gameStatusDialog(gameResult) {
427 | String resultText = "You lose.";
428 |
429 | switch (gameResult) {
430 | case GameResult.WON:
431 | resultText = "You win.";
432 | break;
433 | case GameResult.TIME_LIMIT_EXCEEDED:
434 | resultText = "Time up. You lose.";
435 | break;
436 | default:
437 | }
438 |
439 | return AlertDialog(
440 | contentPadding: const EdgeInsets.all(12.0),
441 | content: Text(
442 | resultText,
443 | textAlign: TextAlign.center,
444 | ),
445 | );
446 | }
447 |
448 | _buildDigitContainer(int digit) {
449 | return Container(
450 | width: 25.0,
451 | child: Center(
452 | child: Text(
453 | "$digit",
454 | style: TextStyle(
455 | fontWeight: FontWeight.bold,
456 | fontSize: 28.0,
457 | ),
458 | ),
459 | ),
460 | );
461 | }
462 |
463 | _stopGameTimer() {
464 | stopwatch.stop();
465 | timer?.cancel();
466 | }
467 | }
468 |
--------------------------------------------------------------------------------
/lib/widget/leaderboard_icon.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:minesweeper/pages/leaderboard_page.dart';
3 | import 'package:minesweeper/pages/profile_page.dart';
4 |
5 | class LeaderboardIcon extends StatelessWidget {
6 | @override
7 | Widget build(BuildContext context) {
8 | return IconButton(
9 | icon: Icon(
10 | Icons.poll,
11 | color: Colors.white,
12 | ),
13 | onPressed: () {
14 | return Navigator.of(context).push(
15 | MaterialPageRoute(
16 | builder: (context) => LeaderboardPage(),
17 | ),
18 | );
19 | },
20 | );
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/lib/widget/profile_icon.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:minesweeper/pages/profile_page.dart';
3 |
4 | class ProfileIcon extends StatelessWidget {
5 | @override
6 | Widget build(BuildContext context) {
7 | return IconButton(
8 | icon: Icon(
9 | Icons.account_circle,
10 | color: Colors.white,
11 | ),
12 | onPressed: () {
13 | return Navigator.of(context).push(
14 | MaterialPageRoute(
15 | builder: (context) => ProfilePage(),
16 | ),
17 | );
18 | },
19 | );
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/lib/widget/tiles/game_board_covered_mine_tile.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:minesweeper/widget/tiles/game_board_inner_tile.dart';
3 | import 'package:minesweeper/widget/tiles/game_board_tile.dart';
4 |
5 | /*
6 | CoveredMineTile = Flagged Tile or Un-flagged tile, both un-opened
7 | */
8 | class CoveredMineTile extends StatelessWidget {
9 | final bool flagged;
10 | final int posX;
11 | final int posY;
12 |
13 | CoveredMineTile({this.flagged, this.posX, this.posY});
14 |
15 | @override
16 | Widget build(BuildContext context) {
17 | return Tile(
18 | child: InnerTile(
19 | child: flagged
20 | ? Center(
21 | child: RichText(
22 | textAlign: TextAlign.center,
23 | text: TextSpan(
24 | text: "\u2690",
25 | style: TextStyle(
26 | color: Colors.black,
27 | fontWeight: FontWeight.bold,
28 | ),
29 | ),
30 | ),
31 | )
32 | : InnerTile(),
33 | ),
34 | );
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/lib/widget/tiles/game_board_inner_tile.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class InnerTile extends StatelessWidget {
4 | final Widget child;
5 | final Color color;
6 |
7 | InnerTile({this.child, this.color});
8 |
9 | @override
10 | Widget build(BuildContext context) {
11 | return Container(
12 | margin: const EdgeInsets.all(1.0),
13 | height: 30.0,
14 | width: 30.0,
15 | child: child,
16 | color: color == null ? Colors.grey[100] : color,
17 | );
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/lib/widget/tiles/game_board_open_mine_tile.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:minesweeper/pages/game_page.dart';
3 | import 'package:minesweeper/widget/tiles/game_board_inner_tile.dart';
4 | import 'package:minesweeper/widget/tiles/game_board_tile.dart';
5 |
6 | /*
7 | OpenMineTile = Open (Shows surroundingMinesCount), Blown or Revealed
8 | */
9 | class OpenMineTile extends StatelessWidget {
10 | final TileState state;
11 | final int surroundingMinesCount;
12 |
13 | OpenMineTile({this.state, this.surroundingMinesCount});
14 |
15 | final List textColorsList = [
16 | Colors.blue,
17 | Colors.green,
18 | Colors.red,
19 | Colors.purple,
20 | Colors.cyan,
21 | Colors.amber,
22 | Colors.brown,
23 | Colors.black,
24 | ];
25 |
26 | @override
27 | Widget build(BuildContext context) {
28 | Widget text;
29 |
30 | if (state == TileState.open) {
31 | if (surroundingMinesCount != 0) {
32 | text = Text(
33 | "$surroundingMinesCount",
34 | style: TextStyle(
35 | color: textColorsList[surroundingMinesCount - 1],
36 | fontWeight: FontWeight.bold,
37 | fontSize: 20.0,
38 | ),
39 | );
40 | }
41 | } else {
42 | text = RichText(
43 | textAlign: TextAlign.center,
44 | text: TextSpan(
45 | text: "\u2620",
46 | style: TextStyle(
47 | color: Colors.black,
48 | fontWeight: FontWeight.bold,
49 | ),
50 | ),
51 | );
52 | }
53 |
54 | return Tile(
55 | child: Center(child: text),
56 | );
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/lib/widget/tiles/game_board_tile.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class Tile extends StatefulWidget {
4 | final Widget child;
5 |
6 | Tile({this.child});
7 |
8 | @override
9 | _GameBoardTileState createState() => _GameBoardTileState();
10 | }
11 |
12 | class _GameBoardTileState extends State {
13 | @override
14 | Widget build(BuildContext context) {
15 | double dimen = (MediaQuery.of(context).size.width - 50.0) / 9;
16 |
17 | return GestureDetector(
18 | child: Container(
19 | child: widget.child,
20 | margin: const EdgeInsets.all(1.0),
21 | padding: const EdgeInsets.all(0.5),
22 | width: dimen,
23 | height: dimen,
24 | color: Colors.grey[400],
25 | ),
26 | );
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/minesweeper.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/minesweeper_android.iml:
--------------------------------------------------------------------------------
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 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://www.dartlang.org/tools/pub/glossary#lockfile
3 | packages:
4 | analyzer:
5 | dependency: transitive
6 | description:
7 | name: analyzer
8 | url: "https://pub.dartlang.org"
9 | source: hosted
10 | version: "0.31.2-alpha.2"
11 | args:
12 | dependency: transitive
13 | description:
14 | name: args
15 | url: "https://pub.dartlang.org"
16 | source: hosted
17 | version: "1.4.3"
18 | async:
19 | dependency: transitive
20 | description:
21 | name: async
22 | url: "https://pub.dartlang.org"
23 | source: hosted
24 | version: "2.0.7"
25 | boolean_selector:
26 | dependency: transitive
27 | description:
28 | name: boolean_selector
29 | url: "https://pub.dartlang.org"
30 | source: hosted
31 | version: "1.0.3"
32 | charcode:
33 | dependency: transitive
34 | description:
35 | name: charcode
36 | url: "https://pub.dartlang.org"
37 | source: hosted
38 | version: "1.1.1"
39 | cloud_firestore:
40 | dependency: "direct main"
41 | description:
42 | name: cloud_firestore
43 | url: "https://pub.dartlang.org"
44 | source: hosted
45 | version: "0.7.4"
46 | collection:
47 | dependency: transitive
48 | description:
49 | name: collection
50 | url: "https://pub.dartlang.org"
51 | source: hosted
52 | version: "1.14.6"
53 | convert:
54 | dependency: transitive
55 | description:
56 | name: convert
57 | url: "https://pub.dartlang.org"
58 | source: hosted
59 | version: "2.0.1"
60 | crypto:
61 | dependency: transitive
62 | description:
63 | name: crypto
64 | url: "https://pub.dartlang.org"
65 | source: hosted
66 | version: "2.0.3"
67 | csslib:
68 | dependency: transitive
69 | description:
70 | name: csslib
71 | url: "https://pub.dartlang.org"
72 | source: hosted
73 | version: "0.14.4"
74 | cupertino_icons:
75 | dependency: "direct main"
76 | description:
77 | name: cupertino_icons
78 | url: "https://pub.dartlang.org"
79 | source: hosted
80 | version: "0.1.2"
81 | firebase_core:
82 | dependency: transitive
83 | description:
84 | name: firebase_core
85 | url: "https://pub.dartlang.org"
86 | source: hosted
87 | version: "0.2.5"
88 | flutter:
89 | dependency: "direct main"
90 | description: flutter
91 | source: sdk
92 | version: "0.0.0"
93 | flutter_test:
94 | dependency: "direct dev"
95 | description: flutter
96 | source: sdk
97 | version: "0.0.0"
98 | front_end:
99 | dependency: transitive
100 | description:
101 | name: front_end
102 | url: "https://pub.dartlang.org"
103 | source: hosted
104 | version: "0.1.0-alpha.12"
105 | glob:
106 | dependency: transitive
107 | description:
108 | name: glob
109 | url: "https://pub.dartlang.org"
110 | source: hosted
111 | version: "1.1.5"
112 | html:
113 | dependency: transitive
114 | description:
115 | name: html
116 | url: "https://pub.dartlang.org"
117 | source: hosted
118 | version: "0.13.3"
119 | http:
120 | dependency: transitive
121 | description:
122 | name: http
123 | url: "https://pub.dartlang.org"
124 | source: hosted
125 | version: "0.11.3+16"
126 | http_multi_server:
127 | dependency: transitive
128 | description:
129 | name: http_multi_server
130 | url: "https://pub.dartlang.org"
131 | source: hosted
132 | version: "2.0.4"
133 | http_parser:
134 | dependency: transitive
135 | description:
136 | name: http_parser
137 | url: "https://pub.dartlang.org"
138 | source: hosted
139 | version: "3.1.2"
140 | io:
141 | dependency: transitive
142 | description:
143 | name: io
144 | url: "https://pub.dartlang.org"
145 | source: hosted
146 | version: "0.3.2+1"
147 | js:
148 | dependency: transitive
149 | description:
150 | name: js
151 | url: "https://pub.dartlang.org"
152 | source: hosted
153 | version: "0.6.1"
154 | kernel:
155 | dependency: transitive
156 | description:
157 | name: kernel
158 | url: "https://pub.dartlang.org"
159 | source: hosted
160 | version: "0.3.0-alpha.12"
161 | logging:
162 | dependency: transitive
163 | description:
164 | name: logging
165 | url: "https://pub.dartlang.org"
166 | source: hosted
167 | version: "0.11.3+1"
168 | matcher:
169 | dependency: transitive
170 | description:
171 | name: matcher
172 | url: "https://pub.dartlang.org"
173 | source: hosted
174 | version: "0.12.2+1"
175 | meta:
176 | dependency: transitive
177 | description:
178 | name: meta
179 | url: "https://pub.dartlang.org"
180 | source: hosted
181 | version: "1.1.5"
182 | mime:
183 | dependency: transitive
184 | description:
185 | name: mime
186 | url: "https://pub.dartlang.org"
187 | source: hosted
188 | version: "0.9.6"
189 | multi_server_socket:
190 | dependency: transitive
191 | description:
192 | name: multi_server_socket
193 | url: "https://pub.dartlang.org"
194 | source: hosted
195 | version: "1.0.1"
196 | node_preamble:
197 | dependency: transitive
198 | description:
199 | name: node_preamble
200 | url: "https://pub.dartlang.org"
201 | source: hosted
202 | version: "1.4.1"
203 | package_config:
204 | dependency: transitive
205 | description:
206 | name: package_config
207 | url: "https://pub.dartlang.org"
208 | source: hosted
209 | version: "1.0.3"
210 | package_resolver:
211 | dependency: transitive
212 | description:
213 | name: package_resolver
214 | url: "https://pub.dartlang.org"
215 | source: hosted
216 | version: "1.0.2"
217 | path:
218 | dependency: transitive
219 | description:
220 | name: path
221 | url: "https://pub.dartlang.org"
222 | source: hosted
223 | version: "1.5.1"
224 | plugin:
225 | dependency: transitive
226 | description:
227 | name: plugin
228 | url: "https://pub.dartlang.org"
229 | source: hosted
230 | version: "0.2.0+2"
231 | pool:
232 | dependency: transitive
233 | description:
234 | name: pool
235 | url: "https://pub.dartlang.org"
236 | source: hosted
237 | version: "1.3.4"
238 | pub_semver:
239 | dependency: transitive
240 | description:
241 | name: pub_semver
242 | url: "https://pub.dartlang.org"
243 | source: hosted
244 | version: "1.4.1"
245 | quiver:
246 | dependency: transitive
247 | description:
248 | name: quiver
249 | url: "https://pub.dartlang.org"
250 | source: hosted
251 | version: "0.29.0+1"
252 | shelf:
253 | dependency: transitive
254 | description:
255 | name: shelf
256 | url: "https://pub.dartlang.org"
257 | source: hosted
258 | version: "0.7.3"
259 | shelf_packages_handler:
260 | dependency: transitive
261 | description:
262 | name: shelf_packages_handler
263 | url: "https://pub.dartlang.org"
264 | source: hosted
265 | version: "1.0.3"
266 | shelf_static:
267 | dependency: transitive
268 | description:
269 | name: shelf_static
270 | url: "https://pub.dartlang.org"
271 | source: hosted
272 | version: "0.2.7"
273 | shelf_web_socket:
274 | dependency: transitive
275 | description:
276 | name: shelf_web_socket
277 | url: "https://pub.dartlang.org"
278 | source: hosted
279 | version: "0.2.2"
280 | sky_engine:
281 | dependency: transitive
282 | description: flutter
283 | source: sdk
284 | version: "0.0.99"
285 | source_map_stack_trace:
286 | dependency: transitive
287 | description:
288 | name: source_map_stack_trace
289 | url: "https://pub.dartlang.org"
290 | source: hosted
291 | version: "1.1.4"
292 | source_maps:
293 | dependency: transitive
294 | description:
295 | name: source_maps
296 | url: "https://pub.dartlang.org"
297 | source: hosted
298 | version: "0.10.5"
299 | source_span:
300 | dependency: transitive
301 | description:
302 | name: source_span
303 | url: "https://pub.dartlang.org"
304 | source: hosted
305 | version: "1.4.0"
306 | stack_trace:
307 | dependency: transitive
308 | description:
309 | name: stack_trace
310 | url: "https://pub.dartlang.org"
311 | source: hosted
312 | version: "1.9.2"
313 | stream_channel:
314 | dependency: transitive
315 | description:
316 | name: stream_channel
317 | url: "https://pub.dartlang.org"
318 | source: hosted
319 | version: "1.6.6"
320 | string_scanner:
321 | dependency: transitive
322 | description:
323 | name: string_scanner
324 | url: "https://pub.dartlang.org"
325 | source: hosted
326 | version: "1.0.2"
327 | term_glyph:
328 | dependency: transitive
329 | description:
330 | name: term_glyph
331 | url: "https://pub.dartlang.org"
332 | source: hosted
333 | version: "1.0.0"
334 | test:
335 | dependency: transitive
336 | description:
337 | name: test
338 | url: "https://pub.dartlang.org"
339 | source: hosted
340 | version: "0.12.37"
341 | typed_data:
342 | dependency: transitive
343 | description:
344 | name: typed_data
345 | url: "https://pub.dartlang.org"
346 | source: hosted
347 | version: "1.1.5"
348 | utf:
349 | dependency: transitive
350 | description:
351 | name: utf
352 | url: "https://pub.dartlang.org"
353 | source: hosted
354 | version: "0.9.0+4"
355 | vector_math:
356 | dependency: transitive
357 | description:
358 | name: vector_math
359 | url: "https://pub.dartlang.org"
360 | source: hosted
361 | version: "2.0.6"
362 | watcher:
363 | dependency: transitive
364 | description:
365 | name: watcher
366 | url: "https://pub.dartlang.org"
367 | source: hosted
368 | version: "0.9.7+7"
369 | web_socket_channel:
370 | dependency: transitive
371 | description:
372 | name: web_socket_channel
373 | url: "https://pub.dartlang.org"
374 | source: hosted
375 | version: "1.0.7"
376 | yaml:
377 | dependency: transitive
378 | description:
379 | name: yaml
380 | url: "https://pub.dartlang.org"
381 | source: hosted
382 | version: "2.1.13"
383 | sdks:
384 | dart: ">=2.0.0-dev.52.0 <=2.0.0-dev.58.0.flutter-f981f09760"
385 | flutter: ">=0.2.4 <2.0.0"
386 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: minesweeper
2 | description: A new Flutter project.
3 |
4 | dependencies:
5 | flutter:
6 | sdk: flutter
7 |
8 | # The following adds the Cupertino Icons font to your application.
9 | # Use with the CupertinoIcons class for iOS style icons.
10 | cupertino_icons: ^0.1.2
11 | cloud_firestore: ^0.7.4
12 |
13 | dev_dependencies:
14 | flutter_test:
15 | sdk: flutter
16 |
17 |
18 | # For information on the generic Dart part of this file, see the
19 | # following page: https://www.dartlang.org/tools/pub/pubspec
20 |
21 | # The following section is specific to Flutter.
22 | flutter:
23 |
24 | # The following line ensures that the Material Icons font is
25 | # included with your application, so that you can use the icons in
26 | # the material Icons class.
27 | uses-material-design: true
28 |
29 | # To add assets to your application, add an assets section, like this:
30 | # assets:
31 | # - images/a_dot_burr.jpeg
32 | # - images/a_dot_ham.jpeg
33 |
34 | # An image asset can refer to one or more resolution-specific "variants", see
35 | # https://flutter.io/assets-and-images/#resolution-aware.
36 |
37 | # For details regarding adding assets from package dependencies, see
38 | # https://flutter.io/assets-and-images/#from-packages
39 |
40 | # To add custom fonts to your application, add a fonts section here,
41 | # in this "flutter" section. Each entry in this list should have a
42 | # "family" key with the font family name, and a "fonts" key with a
43 | # list giving the asset and other descriptors for the font. For
44 | # example:
45 | # fonts:
46 | # - family: Schyler
47 | # fonts:
48 | # - asset: fonts/Schyler-Regular.ttf
49 | # - asset: fonts/Schyler-Italic.ttf
50 | # style: italic
51 | # - family: Trajan Pro
52 | # fonts:
53 | # - asset: fonts/TrajanPro.ttf
54 | # - asset: fonts/TrajanPro_Bold.ttf
55 | # weight: 700
56 | #
57 | # For details regarding fonts from package dependencies,
58 | # see https://flutter.io/custom-fonts/#from-packages
59 |
--------------------------------------------------------------------------------