completedArt = new List();
11 | static bool darkKnightMode;
12 | static bool hemisphere = true;
13 |
14 | static SharedPreferences prefs;
15 |
16 | static void removeTask(String taskDesc, int tab) {
17 | for (int i = 0; i < completedTasks.length; i++) {
18 | if (completedTasks[i].description == taskDesc) completedTasks.removeAt(i);
19 | }
20 |
21 | if (tab == 0) {
22 | return null;
23 | } else if (tab == 1) {
24 | for (int i = 0; i < completedFish.length; i++) {
25 | if (completedFish[i].description == taskDesc)
26 | completedFish.removeAt(i);
27 | }
28 | } else if (tab == 2) {
29 | for (int i = 0; i < completedBugs.length; i++) {
30 | if (completedBugs[i].description == taskDesc)
31 | completedBugs.removeAt(i);
32 | }
33 | } else if (tab == 3) {
34 | for (int i = 0; i < completedFossils.length; i++) {
35 | if (completedFossils[i].description == taskDesc)
36 | completedFossils.removeAt(i);
37 | }
38 | } else if (tab == 4) {
39 | for (int i = 0; i < completedArt.length; i++) {
40 | if (completedArt[i].description == taskDesc)
41 | completedArt.removeAt(i);
42 | }
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
8 |
12 |
19 |
20 |
21 |
22 |
23 |
24 |
26 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | animal_crossing_completion
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/ios/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Flutter (1.0.0)
3 | - path_provider (0.0.1):
4 | - Flutter
5 | - path_provider_macos (0.0.1):
6 | - Flutter
7 | - share (0.5.2):
8 | - Flutter
9 | - shared_preferences (0.0.1):
10 | - Flutter
11 | - shared_preferences_macos (0.0.1):
12 | - Flutter
13 | - shared_preferences_web (0.0.1):
14 | - Flutter
15 |
16 | DEPENDENCIES:
17 | - Flutter (from `Flutter`)
18 | - path_provider (from `.symlinks/plugins/path_provider/ios`)
19 | - path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`)
20 | - share (from `.symlinks/plugins/share/ios`)
21 | - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
22 | - shared_preferences_macos (from `.symlinks/plugins/shared_preferences_macos/ios`)
23 | - shared_preferences_web (from `.symlinks/plugins/shared_preferences_web/ios`)
24 |
25 | EXTERNAL SOURCES:
26 | Flutter:
27 | :path: Flutter
28 | path_provider:
29 | :path: ".symlinks/plugins/path_provider/ios"
30 | path_provider_macos:
31 | :path: ".symlinks/plugins/path_provider_macos/ios"
32 | share:
33 | :path: ".symlinks/plugins/share/ios"
34 | shared_preferences:
35 | :path: ".symlinks/plugins/shared_preferences/ios"
36 | shared_preferences_macos:
37 | :path: ".symlinks/plugins/shared_preferences_macos/ios"
38 | shared_preferences_web:
39 | :path: ".symlinks/plugins/shared_preferences_web/ios"
40 |
41 | SPEC CHECKSUMS:
42 | Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
43 | path_provider: fb74bd0465e96b594bb3b5088ee4a4e7bb1f2a9d
44 | path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0
45 | share: bae0a282aab4483288913fc4dc0b935d4b491f2e
46 | shared_preferences: 430726339841afefe5142b9c1f50cb6bd7793e01
47 | shared_preferences_macos: f3f29b71ccbb56bf40c9dd6396c9acf15e214087
48 | shared_preferences_web: 141cce0c3ed1a1c5bf2a0e44f52d31eeb66e5ea9
49 |
50 | PODFILE CHECKSUM: 1b66dae606f75376c5f2135a8290850eeb09ae83
51 |
52 | COCOAPODS: 1.9.0.beta.3
53 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:animal_crossing_completion/pages/board_pages/first_board.dart';
2 | import 'package:animal_crossing_completion/pages/board_pages/hemisphere.dart';
3 | import 'package:animal_crossing_completion/pages/board_pages/name.dart';
4 | import 'package:animal_crossing_completion/pages/board_pages/tutorial.dart';
5 | import 'package:animal_crossing_completion/pages/more/balloon/balloon_screen.dart';
6 | import 'package:animal_crossing_completion/pages/more/flowers/flowers_guide_screen.dart';
7 | import 'package:animal_crossing_completion/pages/more/guide_screen.dart';
8 | import 'package:animal_crossing_completion/pages/more/tools/tools_guide_screen.dart';
9 | import 'package:flutter/material.dart';
10 | import 'pages/todo_list_page/todo_list_page.dart';
11 | import 'user.dart';
12 | import 'package:flare_splash_screen/flare_splash_screen.dart';
13 | import 'package:shared_preferences/shared_preferences.dart';
14 |
15 | void main() async {
16 | WidgetsFlutterBinding.ensureInitialized();
17 | SharedPreferences prefs = await SharedPreferences.getInstance();
18 | if (prefs.getString('userName') != null)
19 | User.name = prefs.getString('userName');
20 | if (prefs.getBool('darkNightMode') != null) {
21 | User.darkKnightMode = prefs.getBool('darkNightMode');
22 | } else {
23 | prefs.setBool('darkNightMode', false);
24 | User.darkKnightMode = prefs.getBool('darkNightMode');
25 | }
26 |
27 | User.prefs = prefs;
28 |
29 | runApp(new MyApp());
30 | }
31 |
32 | class MyApp extends StatelessWidget {
33 | @override
34 | Widget build(BuildContext context) {
35 | return new MaterialApp(
36 | debugShowCheckedModeBanner: false,
37 | title: 'AC Completionist',
38 | theme: new ThemeData(
39 | primarySwatch: Colors.blue,
40 | ),
41 | home: SplashScreen(
42 | 'res/splash.flr',
43 | User.name != null ? new TodoListPage() : new FirstBoard(),
44 | startAnimation: 'splash',
45 | ),
46 | routes: {
47 | BoardTutorial.routeName: (BuildContext ctx) => BoardTutorial(),
48 | BoardHemisphere.routeName: (BuildContext ctx) => BoardHemisphere(),
49 | NameInput.routeName: (BuildContext ctx) => NameInput(),
50 | TodoListPage.routeName: (BuildContext ctx) => TodoListPage(),
51 | MoreGuides.routeName: (BuildContext ctx) => MoreGuides(),
52 | BalloonScreen.routeName: (BuildContext ctx) => BalloonScreen(),
53 | ToolsGuide.routeName: (BuildContext ctx) => ToolsGuide(),
54 | FlowerGuide.routeName: (BuildContext ctx) => FlowerGuide(),
55 | },
56 | );
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | def keystoreProperties = new Properties()
29 | def keystorePropertiesFile = rootProject.file('key.properties')
30 | if (keystorePropertiesFile.exists()) {
31 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
32 | }
33 |
34 |
35 |
36 | android {
37 | compileSdkVersion 28
38 |
39 | sourceSets {
40 | main.java.srcDirs += 'src/main/kotlin'
41 | }
42 |
43 | lintOptions {
44 | disable 'InvalidPackage'
45 | }
46 |
47 | defaultConfig {
48 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
49 | applicationId "dev.enzoconty.animal_crossing_completion"
50 | minSdkVersion 16
51 | targetSdkVersion 28
52 | versionCode flutterVersionCode.toInteger()
53 | versionName flutterVersionName
54 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
55 | }
56 |
57 | signingConfigs {
58 | release {
59 | keyAlias keystoreProperties['keyAlias']
60 | keyPassword keystoreProperties['keyPassword']
61 | storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
62 | storePassword keystoreProperties['storePassword']
63 | }
64 | }
65 | buildTypes {
66 | release {
67 | signingConfig signingConfigs.release
68 | }
69 | }
70 | }
71 |
72 | flutter {
73 | source '../..'
74 | }
75 |
76 | dependencies {
77 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
78 | testImplementation 'junit:junit:4.12'
79 | androidTestImplementation 'androidx.test:runner:1.1.1'
80 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
81 | }
82 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://gitter.im/AnimalCrossingCompletionist/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
2 | [](https://flutter.dev/)
3 | [](https://codemagic.io/apps/5eb81e53a6d15e519e709c44/5eb81e53a6d15e519e709c43/latest_build)
4 |
5 |
6 |
7 |

8 |
9 | # Animal Crossing Completionist
10 |
11 | A Flutter project to complete & recolt all collectibles species of fishes, bugs & fossils from Animal Crossing: New Horizons.
12 |
13 | ## TODO:
14 |
15 | - Make better code, some part of the code are wacky and im not proud of it.
16 |
17 | - Search bar to filter tiles
18 |
19 | - Find a way to provide artwork information, not a switch case for ~40 elems.
20 |
21 | ## PREVIEW:
22 |
23 |
24 | 
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 | ## RELEASES:
35 |
36 | On the [PlayStore](https://play.google.com/store/apps/details?id=dev.enzoconty.animal_crossing_completion)
37 |
38 |
--------------------------------------------------------------------------------
/lib/pages/todo_list_page/month_bug.dart:
--------------------------------------------------------------------------------
1 | import 'package:animal_crossing_completion/misc/colors.dart';
2 | import 'package:animal_crossing_completion/pages/todo_list_page/tasks_section.dart';
3 | import 'package:animal_crossing_completion/user.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:intl/intl.dart';
6 |
7 | class BugMonth extends StatefulWidget {
8 | State state;
9 |
10 | BugMonth(this.state);
11 |
12 | @override
13 | _BugMonthState createState() => _BugMonthState();
14 | }
15 |
16 | class _BugMonthState extends State {
17 | String dropdownValue = getMonthTitle();
18 |
19 | @override
20 | Widget build(BuildContext context) {
21 | return Scaffold(
22 | appBar: AppBar(
23 | backgroundColor: User.darkKnightMode ? veryDarkTheme : acTheme,
24 | title: DropdownButton(
25 | value: dropdownValue,
26 | items: [
27 | 'January',
28 | 'February',
29 | 'March',
30 | 'April',
31 | 'May',
32 | 'June',
33 | 'July',
34 | 'August',
35 | 'September',
36 | 'October',
37 | 'November',
38 | 'December'
39 | ].map((String value) {
40 | return new DropdownMenuItem(
41 | value: value,
42 | child: new Text(
43 | value,
44 | ),
45 | );
46 | }).toList(),
47 | onChanged: (String newValue) {
48 | setState(() {
49 | dropdownValue = newValue;
50 | });
51 | },
52 | ),
53 | ),
54 | body: Container(
55 | child: new Builder(
56 | builder: (BuildContext context) {
57 | return new CustomScrollView(
58 | scrollDirection: Axis.vertical,
59 | slivers: [
60 | new SliverList(
61 | delegate: new SliverChildListDelegate([
62 | DecoratedBox(
63 | decoration: BoxDecoration(
64 | color: User.darkKnightMode ? menuDarkTheme : acTheme),
65 | child: new SizedBox(
66 | height: 20,
67 | )),
68 | new BuilderTaskType(this, 5, dropdownValue),
69 | DecoratedBox(
70 | decoration: BoxDecoration(
71 | color: User.darkKnightMode ? menuDarkTheme : acTheme),
72 | child: new SizedBox(
73 | height: 60,
74 | ))
75 | ]))
76 | ],
77 | );
78 | },
79 | ),
80 | ),
81 | );
82 | }
83 |
84 | static String getMonthTitle() {
85 | var now = new DateTime.now();
86 | final monthName = DateFormat.MMMM().format(now);
87 |
88 | return monthName;
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/lib/pages/todo_list_page/month_fish.dart:
--------------------------------------------------------------------------------
1 | import 'package:animal_crossing_completion/misc/colors.dart';
2 | import 'package:animal_crossing_completion/pages/todo_list_page/tasks_section.dart';
3 | import 'package:animal_crossing_completion/user.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:intl/intl.dart';
6 |
7 | class FishMonth extends StatefulWidget {
8 | State state;
9 |
10 | FishMonth(this.state);
11 |
12 | @override
13 | _FishMonthState createState() => _FishMonthState();
14 | }
15 |
16 | class _FishMonthState extends State {
17 | String dropdownValue = getMonthTitle();
18 |
19 | @override
20 | Widget build(BuildContext context) {
21 | return Scaffold(
22 | appBar: AppBar(
23 | backgroundColor: User.darkKnightMode ? veryDarkTheme : acTheme,
24 | title: DropdownButton(
25 | value: dropdownValue,
26 | items: [
27 | 'January',
28 | 'February',
29 | 'March',
30 | 'April',
31 | 'May',
32 | 'June',
33 | 'July',
34 | 'August',
35 | 'September',
36 | 'October',
37 | 'November',
38 | 'December'
39 | ].map((String value) {
40 | return new DropdownMenuItem(
41 | value: value,
42 | child: new Text(
43 | value,
44 | ),
45 | );
46 | }).toList(),
47 | onChanged: (String newValue) {
48 | setState(() {
49 | dropdownValue = newValue;
50 | });
51 | },
52 | ),
53 | ),
54 | body: Container(
55 | child: new Builder(
56 | builder: (BuildContext context) {
57 | return new CustomScrollView(
58 | scrollDirection: Axis.vertical,
59 | slivers: [
60 | new SliverList(
61 | delegate: new SliverChildListDelegate([
62 | DecoratedBox(
63 | decoration: BoxDecoration(
64 | color: User.darkKnightMode ? menuDarkTheme : acTheme),
65 | child: new SizedBox(
66 | height: 20,
67 | )),
68 | new BuilderTaskType(this, 4, dropdownValue),
69 | DecoratedBox(
70 | decoration: BoxDecoration(
71 | color: User.darkKnightMode ? menuDarkTheme : acTheme),
72 | child: new SizedBox(
73 | height: 60,
74 | ))
75 | ]))
76 | ],
77 | );
78 | },
79 | ),
80 | ),
81 | );
82 | }
83 |
84 | static String getMonthTitle() {
85 | var now = new DateTime.now();
86 | final monthName = DateFormat.MMMM().format(now);
87 |
88 | return monthName;
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/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.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def parse_KV_file(file, separator='=')
14 | file_abs_path = File.expand_path(file)
15 | if !File.exists? file_abs_path
16 | return [];
17 | end
18 | generated_key_values = {}
19 | skip_line_start_symbols = ["#", "/"]
20 | File.foreach(file_abs_path) do |line|
21 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
22 | plugin = line.split(pattern=separator)
23 | if plugin.length == 2
24 | podname = plugin[0].strip()
25 | path = plugin[1].strip()
26 | podpath = File.expand_path("#{path}", file_abs_path)
27 | generated_key_values[podname] = podpath
28 | else
29 | puts "Invalid plugin specification: #{line}"
30 | end
31 | end
32 | generated_key_values
33 | end
34 |
35 | target 'Runner' do
36 | use_frameworks!
37 | use_modular_headers!
38 |
39 | # Flutter Pod
40 |
41 | copied_flutter_dir = File.join(__dir__, 'Flutter')
42 | copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
43 | copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
44 | unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
45 | # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
46 | # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
47 | # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.
48 |
49 | generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
50 | unless File.exist?(generated_xcode_build_settings_path)
51 | raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
52 | end
53 | generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
54 | cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];
55 |
56 | unless File.exist?(copied_framework_path)
57 | FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
58 | end
59 | unless File.exist?(copied_podspec_path)
60 | FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
61 | end
62 | end
63 |
64 | # Keep pod path relative so it can be checked into Podfile.lock.
65 | pod 'Flutter', :path => 'Flutter'
66 |
67 | # Plugin Pods
68 |
69 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
70 | # referring to absolute paths on developers' machines.
71 | system('rm -rf .symlinks')
72 | system('mkdir -p .symlinks/plugins')
73 | plugin_pods = parse_KV_file('../.flutter-plugins')
74 | plugin_pods.each do |name, path|
75 | symlink = File.join('.symlinks', 'plugins', name)
76 | File.symlink(path, symlink)
77 | pod name, :path => File.join(symlink, 'ios')
78 | end
79 | end
80 |
81 | # Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system.
82 | install! 'cocoapods', :disable_input_output_paths => true
83 |
84 | post_install do |installer|
85 | installer.pods_project.targets.each do |target|
86 | target.build_configurations.each do |config|
87 | config.build_settings['ENABLE_BITCODE'] = 'NO'
88 | end
89 | end
90 | end
91 |
--------------------------------------------------------------------------------
/lib/pages/board_pages/first_board.dart:
--------------------------------------------------------------------------------
1 | import 'package:animal_crossing_completion/pages/board_pages/name.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | class FirstBoard extends StatelessWidget {
5 | @override
6 | Widget build(BuildContext context) {
7 | return Scaffold(
8 | body: Column(
9 | mainAxisAlignment: MainAxisAlignment.start,
10 | crossAxisAlignment: CrossAxisAlignment.start,
11 | children: [
12 | Image.asset('res/fishtuto.png'),
13 | new Flexible(
14 | flex: 1,
15 | child: new Container(
16 | height: MediaQuery.of(context).size.height,
17 | decoration: BoxDecoration(
18 | image: DecorationImage(
19 | fit: BoxFit.cover,
20 | image: new AssetImage('res/fond.png')),
21 | ),
22 | child: SingleChildScrollView(
23 | child: new Column(
24 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
25 | crossAxisAlignment: CrossAxisAlignment.start,
26 | children: [
27 | FittedBox(
28 | child: Container(
29 | padding: EdgeInsets.all(16.0),
30 | child: Column(
31 | mainAxisAlignment: MainAxisAlignment.center,
32 | crossAxisAlignment: CrossAxisAlignment.center,
33 | children: [
34 | Image.asset("res/logo.png"),
35 | ],
36 | ),
37 | ),
38 | ),
39 | Padding(
40 | padding: const EdgeInsets.all(20.0),
41 | child: new Row(
42 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
43 | crossAxisAlignment: CrossAxisAlignment.center,
44 | children: [
45 | new Text(''),
46 | new Expanded(
47 | child: Align(
48 | alignment: FractionalOffset.bottomRight,
49 | child: new Container(
50 | margin: new EdgeInsets.only(
51 | left: 16.0, right: 16.0, top: 24.0),
52 | child: new RaisedButton(
53 | onPressed: () {
54 | Navigator.of(context)
55 | .pushNamed(NameInput.routeName);
56 | },
57 | color: Colors.black,
58 | child: new ListTile(
59 | title: new Text('Next',
60 | style: new TextStyle(
61 | color: Colors.white,
62 | fontWeight: FontWeight.w600)),
63 | trailing: new Icon(
64 | Icons.arrow_forward,
65 | color: Colors.white),
66 | ),
67 | ))),
68 | )
69 | ],
70 | ),
71 | )
72 | ],
73 | ),
74 | )))
75 | ],
76 | ),
77 | );
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: animal_crossing_completion
2 | description: AC:NH Completionist guide & track.
3 |
4 | # The following defines the version and build number for your application.
5 | # A version number is three numbers separated by dots, like 1.2.43
6 | # followed by an optional build number separated by a +.
7 | # Both the version and the builder number may be overridden in flutter
8 | # build by specifying --build-name and --build-number, respectively.
9 | # In Android, build-name is used as versionName while build-number used as versionCode.
10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning
11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
12 | # Read more about iOS versioning at
13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
14 | version: 2.3.2+8
15 |
16 | environment:
17 | sdk: ">=2.1.0 <3.0.0"
18 |
19 | dependencies:
20 | flutter:
21 | sdk: flutter
22 | path_provider: ^1.6.5
23 | shared_preferences: ^0.5.6+3
24 | share: ^0.6.3+6
25 | flutter_snake_navigationbar: ^0.4.0+1
26 | floating_search_bar: ^0.3.0
27 | flutter_launcher_icons: ^0.7.4
28 | flare_splash_screen: ^2.0.1+2
29 | intl: ^0.16.0
30 | flappy_search_bar: ^1.7.2
31 |
32 | # The following adds the Cupertino Icons font to your application.
33 | # Use with the CupertinoIcons class for iOS style icons.
34 | cupertino_icons: ^0.1.2
35 |
36 | dev_dependencies:
37 | flutter_test:
38 | sdk: flutter
39 |
40 | flutter_icons:
41 | android: true
42 | ios: true
43 | image_path_android: "res/icon.png"
44 | image_path_ios: "res/icon.png"
45 | adaptive_icon_background: "res/fond.png"
46 | adaptive_icon_foreground: "res/foreground.png"
47 |
48 |
49 | # For information on the generic Dart part of this file, see the
50 | # following page: https://dart.dev/tools/pub/pubspec
51 |
52 | # The following section is specific to Flutter.
53 | flutter:
54 |
55 | # The following line ensures that the Material Icons font is
56 | # included with your application, so that you can use the icons in
57 | # the material Icons class.
58 | uses-material-design: true
59 |
60 | # To add assets to your application, add an assets section, like this:
61 | # assets:
62 | # - images/a_dot_burr.jpeg
63 | # - images/a_dot_ham.jpeg
64 |
65 | assets:
66 | - res/
67 | - res/paintings/
68 | - res/fishs/
69 | - res/bugs/
70 | - res/icons/
71 | - res/fossils/
72 | - res/balloons/
73 | - res/tools/
74 | - res/flowers/
75 |
76 | # An image asset can refer to one or more resolution-specific "variants", see
77 | # https://flutter.dev/assets-and-images/#resolution-aware.
78 |
79 | # For details regarding adding assets from package dependencies, see
80 | # https://flutter.dev/assets-and-images/#from-packages
81 |
82 | # To add custom fonts to your application, add a fonts section here,
83 | # in this "flutter" section. Each entry in this list should have a
84 | # "family" key with the font family name, and a "fonts" key with a
85 | # list giving the asset and other descriptors for the font. For
86 | # example:
87 | fonts:
88 | - family: Custom
89 | fonts:
90 | - asset: res/icons/Custom.ttf
91 | - family: Fink
92 | fonts:
93 | - asset: res/FinkHeavy.ttf
94 | #fonts:
95 | # - family: Schyler
96 | # fonts:
97 | # - asset: fonts/Schyler-Regular.ttf
98 | # - asset: fonts/Schyler-Italic.ttf
99 | # style: italic
100 | # - family: Trajan Pro
101 | # fonts:
102 | # - asset: fonts/TrajanPro.ttf
103 | # - asset: fonts/TrajanPro_Bold.ttf
104 | # weight: 700
105 | #
106 | # For details regarding fonts from package dependencies,
107 | # see https://flutter.dev/custom-fonts/#from-packages
108 |
--------------------------------------------------------------------------------
/lib/pages/todo_list_page/progress_bar.dart:
--------------------------------------------------------------------------------
1 | import 'package:animal_crossing_completion/misc/colors.dart';
2 | import 'package:flutter/material.dart';
3 | import '../../misc/tasks_list.dart';
4 | import 'todo_list_page.dart';
5 | import '../../user.dart';
6 |
7 | class ProgressBar extends StatefulWidget
8 | {
9 | final TodoListPage listPage;
10 | ProgressBar(this.listPage);
11 |
12 | @override
13 | _ProgressBarState createState() => new _ProgressBarState();
14 | }
15 |
16 | class _ProgressBarState extends State
17 | {
18 | @override
19 | void dispose()
20 | {
21 | widget.listPage.showSmallProgressBar = true;
22 | widget.listPage.resetState = true;
23 | super.dispose();
24 | }
25 |
26 | @override
27 | Widget build(BuildContext context)
28 | {
29 | widget.listPage.showSmallProgressBar = false;
30 | widget.listPage.resetState = true;
31 |
32 | return new Container
33 | (
34 | color: User.darkKnightMode ? menuDarkTheme : acTheme,
35 | padding: new EdgeInsets.only(left: 18.0, right: 18.0, bottom: 20.0),
36 | child: new Column
37 | (
38 | children:
39 | [
40 | new Row
41 | (
42 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
43 | crossAxisAlignment: CrossAxisAlignment.center,
44 | children:
45 | [
46 | new Text('PROGRESS', style: new TextStyle(fontWeight: FontWeight.w500, color: User.darkKnightMode ? textDarkTheme : Colors.black)),
47 | new Row
48 | (
49 | mainAxisAlignment: MainAxisAlignment.end,
50 | children:
51 | [
52 | new Text((User.completedFish.length + User.completedBugs.length + User.completedFossils.length + User.completedArt.length).toString(), style: new TextStyle(color: Colors.blue, fontWeight: FontWeight.w700)),
53 | new Text('/', style: TextStyle(color: User.darkKnightMode ? textDarkTheme : Colors.black),),
54 | new Text(calculateListsLenght(), style: new TextStyle(fontWeight: FontWeight.w500, color: User.darkKnightMode ? textDarkTheme : Colors.black)),
55 | ],
56 | )
57 | ],
58 | ),
59 | new Padding(padding: new EdgeInsets.only(bottom: 8.0)),
60 | new Stack
61 | (
62 | alignment: FractionalOffset.centerLeft,
63 | children:
64 | [
65 | new SizedBox.fromSize
66 | (
67 | size: new Size.fromHeight(10.0),
68 | child: new Material
69 | (
70 | color: Colors.white,
71 | ),
72 | ),
73 | new SizedBox.fromSize
74 | (
75 | size: new Size(((User.completedFish.length + User.completedBugs.length + User.completedFossils.length + User.completedArt.length+ 1) / (TasksList.taskde.length + TasksList.tasks.length + TasksList.tasktr.length + TasksList.taskArt.length)) * MediaQuery.of(context).size.width -
76 | (((User.completedTasks.length / (TasksList.taskde.length + TasksList.tasks.length + TasksList.tasktr.length + TasksList.taskArt.length)) * MediaQuery.of(context).size.width) * 0.7), 10.0),
77 | child: new Material
78 | (
79 | color: Colors.blue,
80 | ),
81 | ),
82 | ],
83 | )
84 | ],
85 | ),
86 | );
87 | }
88 |
89 | String calculateListsLenght() {
90 | final res = TasksList.tasks.length + TasksList.taskde.length + TasksList.tasktr.length + TasksList.taskArt.length;
91 | return res.toString();
92 | }
93 | }
--------------------------------------------------------------------------------
/lib/pages/more/balloon/balloon_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:animal_crossing_completion/misc/colors.dart';
2 | import 'package:animal_crossing_completion/user.dart';
3 | import 'package:flutter/material.dart';
4 |
5 | class BalloonScreen extends StatelessWidget {
6 | static const routeName = '/balloon';
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return Scaffold(
11 | appBar: AppBar(
12 | title: Text(
13 | "Balloon Guide",
14 | style: TextStyle(
15 | fontFamily: 'Fink',
16 | ),
17 | ),
18 | backgroundColor: User.darkKnightMode ? veryDarkTheme : menuAcTheme),
19 | body: Container(
20 | color: User.darkKnightMode ? menuDarkTheme : acTheme,
21 | child: SingleChildScrollView(
22 | child: Column(
23 | children: [
24 | Container(
25 | child: RichText(
26 | text: TextSpan(
27 | children: [
28 | TextSpan(
29 | text:
30 | "Balloons seem to float randomly over the town, but they actually originate on the edges of the map at specific times.\n\nEvery time the player is outside and the time's final digit is a '4', a balloon has a chance to appear; for example, a balloon could appear at 3:14, 5:54, 12:34 or 1:04, but they will not appear at times like 4:33, 7:28.",
31 | style: TextStyle(
32 | fontSize: 18,
33 | fontFamily: "Fink",
34 | color: User.darkKnightMode
35 | ? textDarkTheme
36 | : Colors.black)),
37 | ],
38 | ),
39 | ),
40 | margin: EdgeInsets.symmetric(horizontal: 20, vertical: 40),
41 | ),
42 | Container(
43 | margin: EdgeInsets.symmetric(horizontal: 40),
44 | child: Table(
45 | defaultVerticalAlignment: TableCellVerticalAlignment.middle,
46 | children: [
47 | TableRow(children: [
48 | Padding(
49 | padding: const EdgeInsets.all(30.0),
50 | child: Image.asset(
51 | "res/balloons/redballoon.png",
52 | height: 100,
53 | ),
54 | ),
55 | Center(
56 | child: Text(
57 | "When a red balloon pop,\n you'll get a recipe.",
58 | style: TextStyle(
59 | color: User.darkKnightMode
60 | ? textDarkTheme
61 | : Colors.black,
62 | fontFamily: "Fink"))),
63 | ]),
64 | TableRow(children: [
65 | Padding(
66 | padding: const EdgeInsets.all(30.0),
67 | child: Image.asset(
68 | "res/balloons/blueballoon.png",
69 | height: 100,
70 | ),
71 | ),
72 | Center(
73 | child: Text(
74 | "When a blue balloon pop,\n you'll get crafting materials.",
75 | style: TextStyle(
76 | color: User.darkKnightMode
77 | ? textDarkTheme
78 | : Colors.black,
79 | fontFamily: "Fink"))),
80 | ]),
81 | TableRow(children: [
82 | Padding(
83 | padding: const EdgeInsets.all(30.0),
84 | child: Image.asset(
85 | "res/balloons/greenballoon.png",
86 | height: 100,
87 | ),
88 | ),
89 | Center(
90 | child: Text(
91 | "When a green balloon pop,\n you'll get a piece of furniture.",
92 | style: TextStyle(
93 | color: User.darkKnightMode
94 | ? textDarkTheme
95 | : Colors.black,
96 | fontFamily: "Fink"))),
97 | ]),
98 | TableRow(children: [
99 | Padding(
100 | padding: const EdgeInsets.all(30.0),
101 | child: Image.asset(
102 | "res/balloons/yellowballoon.png",
103 | height: 100,
104 | ),
105 | ),
106 | Center(
107 | child: Text(
108 | "When a yellow balloon pop,\n you'll get bells.",
109 | style: TextStyle(
110 | color: User.darkKnightMode
111 | ? textDarkTheme
112 | : Colors.black,
113 | fontFamily: "Fink"))),
114 | ]),
115 | ],
116 | ),
117 | )
118 | ],
119 | ),
120 | ),
121 | ),
122 | );
123 | }
124 | }
125 |
--------------------------------------------------------------------------------
/lib/pages/more/guide_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:animal_crossing_completion/misc/colors.dart';
2 | import 'package:animal_crossing_completion/pages/more/balloon/balloon_screen.dart';
3 | import 'package:animal_crossing_completion/pages/more/flowers/flowers_guide_screen.dart';
4 | import 'package:animal_crossing_completion/pages/more/tools/tools_guide_screen.dart';
5 | import 'package:animal_crossing_completion/user.dart';
6 | import 'package:flutter/material.dart';
7 |
8 | class MoreGuides extends StatelessWidget {
9 | static const String routeName = '/guides';
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | return Scaffold(
14 | appBar: AppBar(
15 | backgroundColor: User.darkKnightMode ? veryDarkTheme : menuAcTheme,
16 | title: Text("More guides",
17 | style: TextStyle(
18 | fontFamily: 'Fink',
19 | )),
20 | ),
21 | body: Container(
22 | color: User.darkKnightMode ? menuDarkTheme : acTheme,
23 | child: GridView.count(
24 | primary: false,
25 | padding: const EdgeInsets.all(20),
26 | crossAxisSpacing: 10,
27 | mainAxisSpacing: 10,
28 | crossAxisCount: 3,
29 | children: [
30 | InkWell(
31 | onTap: () => {
32 | Navigator.of(context).pushNamed(BalloonScreen.routeName),
33 | },
34 | child: Container(
35 | padding: const EdgeInsets.all(8),
36 | child: Column(
37 | children: [
38 | Image.asset(
39 | 'res/balloons/redballoon.png',
40 | height: 60,
41 | ),
42 | SizedBox(
43 | height: 10,
44 | ),
45 | Flexible(
46 | child: Text(
47 | "Balloon guide",
48 | style: TextStyle(
49 | fontFamily: 'Fink',
50 | color: User.darkKnightMode
51 | ? textDarkTheme
52 | : Colors.black),
53 | ),
54 | ),
55 | ],
56 | ),
57 | decoration: BoxDecoration(
58 | borderRadius: BorderRadius.all(Radius.circular(15)),
59 | color: User.darkKnightMode
60 | ? secondaryDarkTheme
61 | : Colors.white,
62 | image: User.darkKnightMode
63 | ? null
64 | : new DecorationImage(
65 | fit: BoxFit.cover,
66 | image: new AssetImage('res/fond.png'))),
67 | ),
68 | ),
69 | InkWell(
70 | onTap: () => {
71 | Navigator.of(context).pushNamed(ToolsGuide.routeName),
72 | },
73 | child: Container(
74 | padding: const EdgeInsets.all(8),
75 | child: Column(
76 | children: [
77 | Image.asset(
78 | 'res/tools/NH-Axe.png',
79 | height: 60,
80 | ),
81 | SizedBox(
82 | height: 10,
83 | ),
84 | Flexible(
85 | child: Text(
86 | "Tool durability",
87 | style: TextStyle(
88 | fontFamily: 'Fink',
89 | color: User.darkKnightMode
90 | ? textDarkTheme
91 | : Colors.black),
92 | ),
93 | ),
94 | ],
95 | ),
96 | decoration: BoxDecoration(
97 | borderRadius: BorderRadius.all(Radius.circular(15)),
98 | color: User.darkKnightMode
99 | ? secondaryDarkTheme
100 | : Colors.white,
101 | image: User.darkKnightMode
102 | ? null
103 | : new DecorationImage(
104 | fit: BoxFit.cover,
105 | image: new AssetImage('res/fond.png'))),
106 | ),
107 | ),
108 | InkWell(
109 | onTap: () => {
110 | Navigator.of(context).pushNamed(FlowerGuide.routeName),
111 | },
112 | child: Container(
113 | padding: const EdgeInsets.all(8),
114 | child: Column(
115 | children: [
116 | Image.asset(
117 | 'res/flowers/NH-orange_lily_icon.png',
118 | height: 60,
119 | ),
120 | SizedBox(
121 | height: 10,
122 | ),
123 | Flexible(
124 | child: Text(
125 | "Flowers guide",
126 | style: TextStyle(
127 | fontFamily: 'Fink',
128 | color: User.darkKnightMode
129 | ? textDarkTheme
130 | : Colors.black),
131 | ),
132 | ),
133 | ],
134 | ),
135 | decoration: BoxDecoration(
136 | borderRadius: BorderRadius.all(Radius.circular(15)),
137 | color: User.darkKnightMode
138 | ? secondaryDarkTheme
139 | : Colors.white,
140 | image: User.darkKnightMode
141 | ? null
142 | : new DecorationImage(
143 | fit: BoxFit.cover,
144 | image: new AssetImage('res/fond.png'))),
145 | ),
146 | ),
147 | ],
148 | )),
149 | );
150 | }
151 | }
152 |
--------------------------------------------------------------------------------
/lib/misc/io_manager.dart:
--------------------------------------------------------------------------------
1 | import 'package:path_provider/path_provider.dart';
2 | import 'dart:io';
3 | import 'dart:async';
4 | import 'tasks_list.dart';
5 | import '../logic/task.dart';
6 | import '../user.dart';
7 |
8 | class IOManager
9 | {
10 | static Future get _localPath async
11 | {
12 | final directory = await getApplicationDocumentsDirectory();
13 | return directory.path;
14 | }
15 |
16 | static Future get _getSaveFile async
17 | {
18 | final path = await _localPath;
19 | return new File('$path/completed_tasks.txt');
20 | }
21 |
22 | static Future get _getSaveFileFish async
23 | {
24 | final path = await _localPath;
25 | return new File('$path/completedfishs_tasks.txt');
26 | }
27 |
28 | static Future get _getSaveFileBug async
29 | {
30 | final path = await _localPath;
31 | return new File('$path/completedbugs_tasks.txt');
32 | }
33 |
34 | static Future get _getSaveFileFossil async
35 | {
36 | final path = await _localPath;
37 | return new File('$path/completedfossils_tasks.txt');
38 | }
39 |
40 | static Future get _getSaveFileArts async
41 | {
42 | final path = await _localPath;
43 | return new File('$path/completedarts_tasks.txt');
44 | }
45 |
46 |
47 |
48 |
49 | static Future deleteAllSave() async {
50 | File file = await _getSaveFile;
51 | file.delete();
52 | file = await _getSaveFileFish;
53 | file.delete();
54 | file = await _getSaveFileBug;
55 | file.delete();
56 | file = await _getSaveFileFossil;
57 | file.delete();
58 | file = await _getSaveFileArts;
59 | file.delete();
60 | }
61 |
62 | static Future getCompletedTasks() async
63 | {
64 | List completedTasks = new List();
65 |
66 | try
67 | {
68 | File file = await _getSaveFile;
69 | List contents = await file.readAsLines();
70 |
71 | for (int i = 0; i < contents.length; i++)
72 | {
73 | for (int j = 0; j < TasksList.tasks.length; j++)
74 | {
75 | if(contents[i] == TasksList.tasks[j].description)
76 | {
77 | completedTasks.add(TasksList.tasks[j]);
78 | }
79 | }
80 | }
81 | User.completedTasks = completedTasks;
82 |
83 |
84 | file = await _getSaveFileFish;
85 | contents = await file.readAsLines();
86 | completedTasks = new List();
87 |
88 | for (int i = 0; i < contents.length; i++)
89 | {
90 | for (int j = 0; j < TasksList.tasks.length; j++)
91 | {
92 | if(contents[i] == TasksList.tasks[j].description)
93 | {
94 | completedTasks.add(TasksList.tasks[j]);
95 | }
96 | }
97 | }
98 | User.completedFish = completedTasks;
99 |
100 |
101 |
102 | file = await _getSaveFileBug;
103 | contents = await file.readAsLines();
104 | completedTasks = new List();
105 |
106 | for (int i = 0; i < contents.length; i++)
107 | {
108 | for (int j = 0; j < TasksList.taskde.length; j++)
109 | {
110 | if(contents[i] == TasksList.taskde[j].description)
111 | {
112 | completedTasks.add(TasksList.taskde[j]);
113 | }
114 | }
115 | }
116 | User.completedBugs = completedTasks;
117 |
118 |
119 | file = await _getSaveFileFossil;
120 | contents = await file.readAsLines();
121 | completedTasks = new List();
122 |
123 | for (int i = 0; i < contents.length; i++)
124 | {
125 | for (int j = 0; j < TasksList.tasktr.length; j++)
126 | {
127 | if(contents[i] == TasksList.tasktr[j].description)
128 | {
129 | completedTasks.add(TasksList.tasktr[j]);
130 | }
131 | }
132 | }
133 | User.completedFossils = completedTasks;
134 |
135 | file = await _getSaveFileArts;
136 | contents = await file.readAsLines();
137 | completedTasks = new List();
138 |
139 | for (int i = 0; i < contents.length; i++)
140 | {
141 | for (int j = 0; j < TasksList.taskArt.length; j++)
142 | {
143 | if(contents[i] == TasksList.taskArt[j].description)
144 | {
145 | completedTasks.add(TasksList.taskArt[j]);
146 | }
147 | }
148 | }
149 | User.completedArt = completedTasks;
150 | }
151 | catch (e)
152 | {
153 | print(e);
154 | return completedTasks;
155 | }
156 | }
157 |
158 | static void saveCompletedTasks() async
159 | {
160 | File file = await _getSaveFile;
161 | File filefish = await _getSaveFileFish;
162 | File filebug = await _getSaveFileBug;
163 | File filefossil = await _getSaveFileFossil;
164 | File filearts = await _getSaveFileArts;
165 |
166 | String tasksToWrite = '';
167 |
168 | List tasks = User.completedTasks;
169 |
170 | for (int i = 0; i < tasks.length; i++)
171 | {
172 | tasksToWrite += tasks[i].description;
173 | if(i != tasks.length - 1) tasksToWrite += '\n';
174 | }
175 |
176 | //print(tasksToWrite);
177 | file.writeAsString(tasksToWrite, mode: FileMode.writeOnly);
178 |
179 | tasks = User.completedFish;
180 | tasksToWrite = '';
181 |
182 | for (int i = 0; i < tasks.length; i++)
183 | {
184 | tasksToWrite += tasks[i].description;
185 | if(i != tasks.length - 1) tasksToWrite += '\n';
186 | }
187 |
188 | filefish.writeAsString(tasksToWrite, mode: FileMode.writeOnly);
189 |
190 | tasks = User.completedBugs;
191 | tasksToWrite = '';
192 |
193 | for (int i = 0; i < tasks.length; i++)
194 | {
195 | tasksToWrite += tasks[i].description;
196 | if(i != tasks.length - 1) tasksToWrite += '\n';
197 | }
198 | filebug.writeAsString(tasksToWrite, mode: FileMode.writeOnly);
199 |
200 | tasks = User.completedFossils;
201 | tasksToWrite = '';
202 |
203 | for (int i = 0; i < tasks.length; i++)
204 | {
205 | tasksToWrite += tasks[i].description;
206 | if(i != tasks.length - 1) tasksToWrite += '\n';
207 | }
208 |
209 | filefossil.writeAsString(tasksToWrite, mode: FileMode.writeOnly);
210 |
211 |
212 | tasks = User.completedArt;
213 | tasksToWrite = '';
214 |
215 | for (int i = 0; i < tasks.length; i++)
216 | {
217 | tasksToWrite += tasks[i].description;
218 | if(i != tasks.length - 1) tasksToWrite += '\n';
219 | }
220 |
221 | filearts.writeAsString(tasksToWrite, mode: FileMode.writeOnly);
222 | }
223 | }
--------------------------------------------------------------------------------
/lib/pages/board_pages/name.dart:
--------------------------------------------------------------------------------
1 | import 'package:animal_crossing_completion/pages/board_pages/hemisphere.dart';
2 | import 'package:animal_crossing_completion/user.dart';
3 | import 'package:flutter/material.dart';
4 |
5 | bool validName = false;
6 |
7 | class NameInput extends StatefulWidget {
8 | static const routeName = "/nameInput";
9 |
10 | @override
11 | _NameInputState createState() => _NameInputState();
12 | }
13 |
14 | class _NameInputState extends State {
15 | final TextEditingController controller = TextEditingController();
16 |
17 | changesOnField() {
18 | setState(() {}); // Will re-Trigger Build Method
19 | }
20 |
21 | @override
22 | void initState() {
23 | super.initState();
24 | controller.addListener(changesOnField);
25 | }
26 |
27 | @override
28 | Widget build(BuildContext context) {
29 | return Scaffold(
30 | body: Container(
31 | decoration: BoxDecoration(
32 | image: DecorationImage(
33 | fit: BoxFit.cover, image: new AssetImage('res/fond.png')),
34 | ),
35 | child: Column(
36 | children: [
37 | Flexible(
38 | child: new Stack(children: [
39 | new ListView(
40 | children: [
41 | /// Logo
42 | new Align(
43 | alignment: FractionalOffset.topCenter,
44 | child: new Container(
45 | margin: new EdgeInsets.only(
46 | left: 32.0, top: 48.0, right: 16.0),
47 | child: new Column(
48 | mainAxisAlignment: MainAxisAlignment.center,
49 | crossAxisAlignment: CrossAxisAlignment.center,
50 | children: [
51 | new Image.asset("res/logo.png"),
52 | new Text('AC Completionist: New Horizon',
53 | style: new TextStyle(
54 | fontWeight: FontWeight.w700,
55 | fontSize: 38.0,
56 | color: Colors.black)),
57 | new Padding(
58 | padding: new EdgeInsets.only(bottom: 4.0)),
59 | ],
60 | ))),
61 |
62 | /// Image and name card
63 | new Padding(padding: new EdgeInsets.only(bottom: 32.0)),
64 | new SizedBox(
65 | height: MediaQuery.of(context).size.height * 0.05,
66 | ),
67 | new Column(
68 | mainAxisSize: MainAxisSize.min,
69 | mainAxisAlignment: MainAxisAlignment.center,
70 | crossAxisAlignment: CrossAxisAlignment.center,
71 | children: [
72 | new Text("3 characters minimum."),
73 | new Container(
74 | decoration: BoxDecoration(
75 | color: Colors.white,
76 | borderRadius:
77 | BorderRadius.all(Radius.circular(30))),
78 | padding:
79 | EdgeInsets.symmetric(horizontal: 10, vertical: 5),
80 | margin: new EdgeInsets.symmetric(
81 | horizontal: 66.0, vertical: 24.0),
82 | child: new TextField(
83 | controller: controller,
84 | maxLength: 10,
85 | decoration: new InputDecoration.collapsed(
86 | hintText: 'What\'s your name?'),
87 | onChanged: verifValidityName(controller.text),
88 | style: new TextStyle(
89 | fontSize: 18.0, color: Colors.black),
90 | ),
91 | ),
92 | Padding(
93 | padding: const EdgeInsets.all(20.0),
94 | child: new Row(
95 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
96 | crossAxisAlignment: CrossAxisAlignment.center,
97 | children: [
98 | new Expanded(
99 | child: Align(
100 | alignment: FractionalOffset.bottomRight,
101 | child: new Container(
102 | margin: new EdgeInsets.only(
103 | left: 16.0, right: 16.0, top: 24.0),
104 | child: new RaisedButton(
105 | onPressed: () =>
106 | controller.text.length >= 3 &&
107 | controller.text.length <=
108 | 10
109 | ? saveName(controller.text)
110 | : null,
111 | color: validName
112 | ? Colors.black
113 | : Colors.grey,
114 | child: new ListTile(
115 | title: new Text('Next',
116 | style: new TextStyle(
117 | color: Colors.white,
118 | fontWeight:
119 | FontWeight.w600)),
120 | trailing: new Icon(
121 | Icons.arrow_forward,
122 | color: Colors.white),
123 | ),
124 | ))),
125 | )
126 | ],
127 | ),
128 | ),
129 | ],
130 | ),
131 | ].reversed.toList(),
132 | shrinkWrap: true,
133 | reverse: true,
134 | ),
135 | ]),
136 | ),
137 | ],
138 | ),
139 | ),
140 | );
141 | }
142 |
143 | verifValidityName(String inputName) {
144 | if (inputName.trim().length > 10 || inputName.trim().length < 3) {
145 | setState(() => validName = false);
146 | return;
147 | }
148 | setState(() => validName = true);
149 | }
150 |
151 | saveName(String userName) async {
152 | FocusScope.of(context).unfocus();
153 |
154 | User.prefs.setString('userName', userName.trim());
155 | await User.prefs.commit();
156 |
157 | setState(() => User.name = userName.trim());
158 |
159 | Navigator.of(context).pushReplacementNamed(BoardHemisphere.routeName);
160 | }
161 | }
162 |
--------------------------------------------------------------------------------
/lib/pages/todo_list_page/todo_list_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:animal_crossing_completion/logic/task.dart';
2 | import 'package:animal_crossing_completion/misc/colors.dart';
3 | import 'package:animal_crossing_completion/misc/custom_icons.dart';
4 | import 'package:animal_crossing_completion/pages/todo_list_page/todo_card.dart';
5 | import 'package:flappy_search_bar/flappy_search_bar.dart';
6 | import 'package:flutter/material.dart';
7 | import 'package:flutter_snake_navigationbar/flutter_snake_navigationbar.dart';
8 | import '../../misc/io_manager.dart';
9 | import '../../misc/tasks_list.dart';
10 | import '../../user.dart';
11 | import 'progress_bar.dart';
12 | import 'tasks_section.dart';
13 | import '../menu_page.dart';
14 |
15 | class TodoListPage extends StatefulWidget {
16 | bool showSmallProgressBar = false;
17 | bool resetState = false;
18 | static const String routeName = '/todolist';
19 |
20 | @override
21 | TodoListPageState createState() => new TodoListPageState();
22 | }
23 |
24 | class TodoListPageState extends State {
25 | SnakeShape customSnakeShape = SnakeShape(
26 | shape: BeveledRectangleBorder(
27 | borderRadius: BorderRadius.all(Radius.circular(12))),
28 | centered: true);
29 | ShapeBorder customBottomBarShape = RoundedRectangleBorder(
30 | borderRadius: BorderRadius.only(
31 | topLeft: Radius.circular(25), topRight: Radius.circular(25)),
32 | );
33 | ShapeBorder customBottomBarShape1 = BeveledRectangleBorder(
34 | borderRadius: BorderRadius.only(
35 | topLeft: Radius.circular(25), topRight: Radius.circular(25)),
36 | );
37 |
38 | int _selectedItemPosition = 1;
39 | SnakeBarStyle snakeBarStyle = SnakeBarStyle.floating;
40 | SnakeShape snakeShape = SnakeShape.circle;
41 | ShapeBorder bottomBarShape = RoundedRectangleBorder(
42 | borderRadius: BorderRadius.all(Radius.circular(25)));
43 | double elevation = 0;
44 | bool showSelectedLabels = false;
45 | bool showUnselectedLabels = false;
46 |
47 | ScrollController controller = new ScrollController();
48 |
49 | @override
50 | void initState() {
51 | super.initState();
52 |
53 | IOManager.getCompletedTasks().then((_) => setState(() {}));
54 |
55 | controller.addListener(() {
56 | if (controller.offset == 0.0)
57 | setState(() {
58 | widget.showSmallProgressBar = false;
59 | });
60 |
61 | // The ProgressBar has been updated
62 | if (widget.resetState) {
63 | setState(() {});
64 | widget.resetState = false;
65 | }
66 | });
67 | }
68 |
69 | @override
70 | Widget build(BuildContext context) {
71 | final List navBar = [
72 | /* *************************
73 | * FISHING SECTION *
74 | ************************** */
75 | _buildTabs(Colors.blue, TasksList.tasks, "fishes"),
76 | _buildTabs(Colors.green, TasksList.taskde, "bugs"),
77 | _buildTabs(Colors.yellow, TasksList.tasktr, "fossils"),
78 | _buildTabs(Colors.grey, TasksList.taskArt, "Art"),
79 | /* ************************
80 | * Bug section
81 | *
82 | *************************** */
83 |
84 | /* ******************
85 | * Fossils
86 | *
87 | ********************** */
88 | ];
89 | return new Scaffold(
90 | extendBodyBehindAppBar: true,
91 | resizeToAvoidBottomInset: true,
92 | extendBody: true,
93 | backgroundColor: User.darkKnightMode ? menuDarkTheme : acTheme,
94 | bottomNavigationBar: SnakeNavigationBar(
95 | style: snakeBarStyle,
96 | snakeShape: snakeShape,
97 | snakeColor: acTheme, //comment if you want to see colors
98 | backgroundColor: User.darkKnightMode
99 | ? veryDarkTheme
100 | : Colors.brown, //comment if you want to see colors
101 | // snakeGradient:
102 | // selectionGradient, //uncomment if you want to see gradients
103 | // backgroundGradient:
104 | // backgroundGradient, //uncomment if you want to see gradients
105 | showUnselectedLabels: showUnselectedLabels,
106 | showSelectedLabels: showSelectedLabels,
107 | selectedItemColor: Colors.white,
108 | // selectedItemGradient: LinearGradient(colors: [Colors.red,Colors.amber]),
109 | shape: bottomBarShape,
110 | padding: EdgeInsets.all(5),
111 | currentIndex: _selectedItemPosition,
112 | onPositionChanged: (index) =>
113 | setState(() => _selectedItemPosition = index),
114 | items: [
115 | BottomNavigationBarItem(icon: Icon(Custom.fish)),
116 | BottomNavigationBarItem(
117 | icon: Icon(Custom.ladybug),
118 | ),
119 | BottomNavigationBarItem(
120 | icon: Icon(Custom.fossil),
121 | ),
122 | BottomNavigationBarItem(icon: Icon(Icons.aspect_ratio)),
123 | ],
124 | ),
125 | appBar: AppBar(
126 | backgroundColor: User.darkKnightMode ? veryDarkTheme : menuAcTheme,
127 | title: Text('ACCompletionist',
128 | style: new TextStyle(
129 | fontFamily: "Fink",
130 | color: User.darkKnightMode ? textDarkTheme : Colors.black,
131 | fontSize: 36.0,
132 | fontWeight: FontWeight.w400)),
133 | ),
134 | body: Stack(
135 | children: [
136 | navBar[_selectedItemPosition],
137 | ],
138 | ),
139 | drawer: new Drawer(
140 | child: Container(
141 | child: new MenuPage(this),
142 | color: User.darkKnightMode ? menuDarkTheme : Colors.white,
143 | )),
144 | );
145 | }
146 |
147 | /* Future> search(String search) async {
148 | await Future.delayed(Duration(seconds: 2));
149 | return TasksList.tasks.where((item) {return item.description.contains(search);});
150 | } */
151 |
152 | Widget _buildTabs(
153 | Color smallProgressBarColor, List tasksList, String type) {
154 | return Container(
155 | child: new Builder(
156 | builder: (BuildContext context) {
157 | return new CustomScrollView(
158 | controller: controller,
159 | scrollDirection: Axis.vertical,
160 | slivers: [
161 | new SliverList(
162 | delegate: new SliverChildListDelegate([
163 | SizedBox(
164 | height: AppBar().preferredSize.height + 40,
165 | ),
166 | ProgressBar(widget),
167 | /* Container(
168 | height: 280,
169 | child: Padding(
170 | padding: const EdgeInsets.symmetric(horizontal: 20),
171 | child: SearchBar(
172 | onSearch: search,
173 | onItemFound: (Task task, int index) {
174 | return ListTile(
175 | title: Text(task.description),
176 | subtitle: Text(task.price),
177 | );
178 | },
179 | ),
180 | ),
181 | ), */
182 | new BuilderTaskType(this, _selectedItemPosition),
183 | DecoratedBox(
184 | decoration: BoxDecoration(
185 | color: User.darkKnightMode ? menuDarkTheme : acTheme),
186 | child: new SizedBox(
187 | height: 60,
188 | ))
189 | ]))
190 | ],
191 | );
192 | },
193 | ),
194 | );
195 | }
196 | }
197 |
--------------------------------------------------------------------------------
/lib/pages/todo_list_page/tasks_section.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import '../../logic/task.dart';
3 | import '../../misc/tasks_list.dart';
4 | import '../../user.dart';
5 | import 'todo_card.dart';
6 |
7 |
8 | class BuilderTaskType extends StatefulWidget {
9 |
10 | State state;
11 | int position;
12 | String listMonthName;
13 |
14 | BuilderTaskType(this.state, this.position, [this.listMonthName]);
15 |
16 | @override
17 | _BuilderTaskTypeState createState() => _BuilderTaskTypeState();
18 | }
19 |
20 | class _BuilderTaskTypeState extends State {
21 | @override
22 | Widget build(BuildContext context) {
23 | //print(widget.position);
24 | return new Column
25 | (
26 | mainAxisAlignment: MainAxisAlignment.start,
27 | crossAxisAlignment: CrossAxisAlignment.start,
28 | children: returnRightList(widget.position, listMonthName: widget.listMonthName)
29 | );
30 | }
31 |
32 | List returnRightList(int position, {listMonthName}) {
33 | switch (position) {
34 | case 0: {
35 | if (User.hemisphere) {
36 | return TasksList.tasks.map((Task task) => new TodoCard(checkIfDone(task, User.completedFish), widget.state, 1)).toList();
37 | } else {
38 | return TasksList.tasks_south.map((Task task) => new TodoCard(checkIfDone(task, User.completedFish), widget.state, 1)).toList();
39 | }
40 | } break;
41 | case 1: {
42 | if (User.hemisphere) {
43 | return TasksList.taskde.map((Task task) => new TodoCard(checkIfDone(task, User.completedBugs), widget.state, 2)).toList();
44 | } else {
45 | return TasksList.taskde_south.map((Task task) => new TodoCard(checkIfDone(task, User.completedBugs), widget.state, 2)).toList();
46 | }
47 | } break;
48 | case 2: {
49 | return TasksList.tasktr.map((Task task) => new TodoCard(checkIfDone(task, User.completedFossils), widget.state, 3)).toList();
50 | } break;
51 | case 3: {
52 | return TasksList.taskArt.map((Task task) => new TodoCard(checkIfDone(task, User.completedFossils), widget.state, 4)).toList();
53 | } break;
54 | case 4: {
55 | if (User.hemisphere) {
56 | return TasksList.tasks.where((task) {
57 | final monthName = listMonthName;
58 |
59 | var returnValue = false;
60 | if (task.jan == true && monthName == 'January') {
61 | returnValue = true;
62 | } else if (task.fev == true && monthName == 'February') {
63 | returnValue = true;
64 | } else if (task.mar == true && monthName == 'March') {
65 | returnValue = true;
66 | } else if (task.apr == true && monthName == 'April') {
67 | returnValue = true;
68 | } else if (task.may == true && monthName == 'May') {
69 | returnValue = true;
70 | } else if (task.jun == true && monthName == 'June') {
71 | returnValue = true;
72 | } else if (task.jul == true && monthName == 'July') {
73 | returnValue = true;
74 | } else if (task.aug == true && monthName == 'August') {
75 | returnValue = true;
76 | } else if (task.sep == true && monthName == 'September') {
77 | returnValue = true;
78 | } else if (task.oct == true && monthName == 'October') {
79 | returnValue = true;
80 | } else if (task.nov == true && monthName == 'November') {
81 | returnValue = true;
82 | } else if (task.dec == true && monthName == 'December') {
83 | returnValue = true;
84 | }
85 |
86 | return returnValue;
87 | }
88 | ).map((Task task) => new TodoCard(checkIfDone(task, User.completedFish), widget.state, 1)).toList();
89 | } else {
90 | return TasksList.tasks_south.where((task) {
91 | final monthName = listMonthName;
92 |
93 | var returnValue = false;
94 | if (task.jan == true && monthName == 'January') {
95 | returnValue = true;
96 | } else if (task.fev == true && monthName == 'February') {
97 | returnValue = true;
98 | } else if (task.mar == true && monthName == 'March') {
99 | returnValue = true;
100 | } else if (task.apr == true && monthName == 'April') {
101 | returnValue = true;
102 | } else if (task.may == true && monthName == 'May') {
103 | returnValue = true;
104 | } else if (task.jun == true && monthName == 'June') {
105 | returnValue = true;
106 | } else if (task.jul == true && monthName == 'July') {
107 | returnValue = true;
108 | } else if (task.aug == true && monthName == 'August') {
109 | returnValue = true;
110 | } else if (task.sep == true && monthName == 'September') {
111 | returnValue = true;
112 | } else if (task.oct == true && monthName == 'October') {
113 | returnValue = true;
114 | } else if (task.nov == true && monthName == 'November') {
115 | returnValue = true;
116 | } else if (task.dec == true && monthName == 'December') {
117 | returnValue = true;
118 | }
119 |
120 | return returnValue;
121 | }
122 | ).map((Task task) => new TodoCard(checkIfDone(task, User.completedFish), widget.state, 1)).toList();
123 | }
124 | break;
125 | }
126 | case 5: {
127 | if (User.hemisphere) {
128 | return TasksList.taskde.where((task) {
129 | final monthName = listMonthName;
130 |
131 | var returnValue = false;
132 | if (task.jan == true && monthName == 'January') {
133 | returnValue = true;
134 | } else if (task.fev == true && monthName == 'February') {
135 | returnValue = true;
136 | } else if (task.mar == true && monthName == 'March') {
137 | returnValue = true;
138 | } else if (task.apr == true && monthName == 'April') {
139 | returnValue = true;
140 | } else if (task.may == true && monthName == 'May') {
141 | returnValue = true;
142 | } else if (task.jun == true && monthName == 'June') {
143 | returnValue = true;
144 | } else if (task.jul == true && monthName == 'July') {
145 | returnValue = true;
146 | } else if (task.aug == true && monthName == 'August') {
147 | returnValue = true;
148 | } else if (task.sep == true && monthName == 'September') {
149 | returnValue = true;
150 | } else if (task.oct == true && monthName == 'October') {
151 | returnValue = true;
152 | } else if (task.nov == true && monthName == 'November') {
153 | returnValue = true;
154 | } else if (task.dec == true && monthName == 'December') {
155 | returnValue = true;
156 | }
157 |
158 | return returnValue;
159 | }
160 | ).map((Task task) => new TodoCard(checkIfDone(task, User.completedBugs), widget.state, 2)).toList();
161 | } else {
162 | return TasksList.taskde_south.where((task) {
163 | final monthName = listMonthName;
164 |
165 | var returnValue = false;
166 | if (task.jan == true && monthName == 'January') {
167 | returnValue = true;
168 | } else if (task.fev == true && monthName == 'February') {
169 | returnValue = true;
170 | } else if (task.mar == true && monthName == 'March') {
171 | returnValue = true;
172 | } else if (task.apr == true && monthName == 'April') {
173 | returnValue = true;
174 | } else if (task.may == true && monthName == 'May') {
175 | returnValue = true;
176 | } else if (task.jun == true && monthName == 'June') {
177 | returnValue = true;
178 | } else if (task.jul == true && monthName == 'July') {
179 | returnValue = true;
180 | } else if (task.aug == true && monthName == 'August') {
181 | returnValue = true;
182 | } else if (task.sep == true && monthName == 'September') {
183 | returnValue = true;
184 | } else if (task.oct == true && monthName == 'October') {
185 | returnValue = true;
186 | } else if (task.nov == true && monthName == 'November') {
187 | returnValue = true;
188 | } else if (task.dec == true && monthName == 'December') {
189 | returnValue = true;
190 | }
191 |
192 | return returnValue;
193 | }
194 | ).map((Task task) => new TodoCard(checkIfDone(task, User.completedBugs), widget.state, 2)).toList();
195 | }
196 | }
197 | }
198 | }
199 |
200 | Task checkIfDone(Task task, List checkList)
201 | {
202 | for (var i = 0; i < checkList.length; i++)
203 | {
204 | if(checkList[i].description == task.description)
205 | {
206 | task.done = true;
207 | break;
208 | }
209 | }
210 |
211 | return task;
212 | }
213 | }
214 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://dart.dev/tools/pub/glossary#lockfile
3 | packages:
4 | archive:
5 | dependency: transitive
6 | description:
7 | name: archive
8 | url: "https://pub.dartlang.org"
9 | source: hosted
10 | version: "2.0.11"
11 | args:
12 | dependency: transitive
13 | description:
14 | name: args
15 | url: "https://pub.dartlang.org"
16 | source: hosted
17 | version: "1.5.2"
18 | async:
19 | dependency: transitive
20 | description:
21 | name: async
22 | url: "https://pub.dartlang.org"
23 | source: hosted
24 | version: "2.4.1"
25 | boolean_selector:
26 | dependency: transitive
27 | description:
28 | name: boolean_selector
29 | url: "https://pub.dartlang.org"
30 | source: hosted
31 | version: "2.0.0"
32 | charcode:
33 | dependency: transitive
34 | description:
35 | name: charcode
36 | url: "https://pub.dartlang.org"
37 | source: hosted
38 | version: "1.1.3"
39 | clock:
40 | dependency: transitive
41 | description:
42 | name: clock
43 | url: "https://pub.dartlang.org"
44 | source: hosted
45 | version: "1.0.1"
46 | collection:
47 | dependency: transitive
48 | description:
49 | name: collection
50 | url: "https://pub.dartlang.org"
51 | source: hosted
52 | version: "1.14.12"
53 | convert:
54 | dependency: transitive
55 | description:
56 | name: convert
57 | url: "https://pub.dartlang.org"
58 | source: hosted
59 | version: "2.1.1"
60 | crypto:
61 | dependency: transitive
62 | description:
63 | name: crypto
64 | url: "https://pub.dartlang.org"
65 | source: hosted
66 | version: "2.1.3"
67 | cupertino_icons:
68 | dependency: "direct main"
69 | description:
70 | name: cupertino_icons
71 | url: "https://pub.dartlang.org"
72 | source: hosted
73 | version: "0.1.3"
74 | fake_async:
75 | dependency: transitive
76 | description:
77 | name: fake_async
78 | url: "https://pub.dartlang.org"
79 | source: hosted
80 | version: "1.1.0"
81 | flappy_search_bar:
82 | dependency: "direct main"
83 | description:
84 | name: flappy_search_bar
85 | url: "https://pub.dartlang.org"
86 | source: hosted
87 | version: "1.7.2"
88 | flare_dart:
89 | dependency: transitive
90 | description:
91 | name: flare_dart
92 | url: "https://pub.dartlang.org"
93 | source: hosted
94 | version: "2.3.4"
95 | flare_flutter:
96 | dependency: transitive
97 | description:
98 | name: flare_flutter
99 | url: "https://pub.dartlang.org"
100 | source: hosted
101 | version: "2.0.3"
102 | flare_loading:
103 | dependency: transitive
104 | description:
105 | name: flare_loading
106 | url: "https://pub.dartlang.org"
107 | source: hosted
108 | version: "2.1.1"
109 | flare_splash_screen:
110 | dependency: "direct main"
111 | description:
112 | name: flare_splash_screen
113 | url: "https://pub.dartlang.org"
114 | source: hosted
115 | version: "2.1.4"
116 | floating_search_bar:
117 | dependency: "direct main"
118 | description:
119 | name: floating_search_bar
120 | url: "https://pub.dartlang.org"
121 | source: hosted
122 | version: "0.3.0"
123 | flutter:
124 | dependency: "direct main"
125 | description: flutter
126 | source: sdk
127 | version: "0.0.0"
128 | flutter_launcher_icons:
129 | dependency: "direct main"
130 | description:
131 | name: flutter_launcher_icons
132 | url: "https://pub.dartlang.org"
133 | source: hosted
134 | version: "0.7.4"
135 | flutter_snake_navigationbar:
136 | dependency: "direct main"
137 | description:
138 | name: flutter_snake_navigationbar
139 | url: "https://pub.dartlang.org"
140 | source: hosted
141 | version: "0.4.0+1"
142 | flutter_staggered_grid_view:
143 | dependency: transitive
144 | description:
145 | name: flutter_staggered_grid_view
146 | url: "https://pub.dartlang.org"
147 | source: hosted
148 | version: "0.3.0"
149 | flutter_test:
150 | dependency: "direct dev"
151 | description: flutter
152 | source: sdk
153 | version: "0.0.0"
154 | flutter_web_plugins:
155 | dependency: transitive
156 | description: flutter
157 | source: sdk
158 | version: "0.0.0"
159 | image:
160 | dependency: transitive
161 | description:
162 | name: image
163 | url: "https://pub.dartlang.org"
164 | source: hosted
165 | version: "2.1.4"
166 | intl:
167 | dependency: "direct main"
168 | description:
169 | name: intl
170 | url: "https://pub.dartlang.org"
171 | source: hosted
172 | version: "0.16.1"
173 | matcher:
174 | dependency: transitive
175 | description:
176 | name: matcher
177 | url: "https://pub.dartlang.org"
178 | source: hosted
179 | version: "0.12.6"
180 | meta:
181 | dependency: transitive
182 | description:
183 | name: meta
184 | url: "https://pub.dartlang.org"
185 | source: hosted
186 | version: "1.1.8"
187 | path:
188 | dependency: transitive
189 | description:
190 | name: path
191 | url: "https://pub.dartlang.org"
192 | source: hosted
193 | version: "1.7.0"
194 | path_provider:
195 | dependency: "direct main"
196 | description:
197 | name: path_provider
198 | url: "https://pub.dartlang.org"
199 | source: hosted
200 | version: "1.6.5"
201 | path_provider_macos:
202 | dependency: transitive
203 | description:
204 | name: path_provider_macos
205 | url: "https://pub.dartlang.org"
206 | source: hosted
207 | version: "0.0.4"
208 | path_provider_platform_interface:
209 | dependency: transitive
210 | description:
211 | name: path_provider_platform_interface
212 | url: "https://pub.dartlang.org"
213 | source: hosted
214 | version: "1.0.1"
215 | petitparser:
216 | dependency: transitive
217 | description:
218 | name: petitparser
219 | url: "https://pub.dartlang.org"
220 | source: hosted
221 | version: "2.4.0"
222 | platform:
223 | dependency: transitive
224 | description:
225 | name: platform
226 | url: "https://pub.dartlang.org"
227 | source: hosted
228 | version: "2.2.1"
229 | plugin_platform_interface:
230 | dependency: transitive
231 | description:
232 | name: plugin_platform_interface
233 | url: "https://pub.dartlang.org"
234 | source: hosted
235 | version: "1.0.2"
236 | share:
237 | dependency: "direct main"
238 | description:
239 | name: share
240 | url: "https://pub.dartlang.org"
241 | source: hosted
242 | version: "0.6.3+6"
243 | shared_preferences:
244 | dependency: "direct main"
245 | description:
246 | name: shared_preferences
247 | url: "https://pub.dartlang.org"
248 | source: hosted
249 | version: "0.5.6+3"
250 | shared_preferences_macos:
251 | dependency: transitive
252 | description:
253 | name: shared_preferences_macos
254 | url: "https://pub.dartlang.org"
255 | source: hosted
256 | version: "0.0.1+6"
257 | shared_preferences_platform_interface:
258 | dependency: transitive
259 | description:
260 | name: shared_preferences_platform_interface
261 | url: "https://pub.dartlang.org"
262 | source: hosted
263 | version: "1.0.3"
264 | shared_preferences_web:
265 | dependency: transitive
266 | description:
267 | name: shared_preferences_web
268 | url: "https://pub.dartlang.org"
269 | source: hosted
270 | version: "0.1.2+4"
271 | sky_engine:
272 | dependency: transitive
273 | description: flutter
274 | source: sdk
275 | version: "0.0.99"
276 | source_span:
277 | dependency: transitive
278 | description:
279 | name: source_span
280 | url: "https://pub.dartlang.org"
281 | source: hosted
282 | version: "1.7.0"
283 | stack_trace:
284 | dependency: transitive
285 | description:
286 | name: stack_trace
287 | url: "https://pub.dartlang.org"
288 | source: hosted
289 | version: "1.9.3"
290 | stream_channel:
291 | dependency: transitive
292 | description:
293 | name: stream_channel
294 | url: "https://pub.dartlang.org"
295 | source: hosted
296 | version: "2.0.0"
297 | string_scanner:
298 | dependency: transitive
299 | description:
300 | name: string_scanner
301 | url: "https://pub.dartlang.org"
302 | source: hosted
303 | version: "1.0.5"
304 | term_glyph:
305 | dependency: transitive
306 | description:
307 | name: term_glyph
308 | url: "https://pub.dartlang.org"
309 | source: hosted
310 | version: "1.1.0"
311 | test_api:
312 | dependency: transitive
313 | description:
314 | name: test_api
315 | url: "https://pub.dartlang.org"
316 | source: hosted
317 | version: "0.2.15"
318 | typed_data:
319 | dependency: transitive
320 | description:
321 | name: typed_data
322 | url: "https://pub.dartlang.org"
323 | source: hosted
324 | version: "1.1.6"
325 | vector_math:
326 | dependency: transitive
327 | description:
328 | name: vector_math
329 | url: "https://pub.dartlang.org"
330 | source: hosted
331 | version: "2.0.8"
332 | xml:
333 | dependency: transitive
334 | description:
335 | name: xml
336 | url: "https://pub.dartlang.org"
337 | source: hosted
338 | version: "3.5.0"
339 | yaml:
340 | dependency: transitive
341 | description:
342 | name: yaml
343 | url: "https://pub.dartlang.org"
344 | source: hosted
345 | version: "2.2.0"
346 | sdks:
347 | dart: ">=2.6.0 <3.0.0"
348 | flutter: ">=1.12.13+hotfix.4 <2.0.0"
349 |
--------------------------------------------------------------------------------