├── .github
└── workflows
│ └── build.yml
├── .gitignore
├── .metadata
├── LICENSE
├── README.md
├── analysis_options.yaml
├── android
├── .gitignore
├── app
│ ├── build.gradle.kts
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── github
│ │ │ │ └── raoxwup
│ │ │ │ └── haka_comic
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable-v21
│ │ │ └── launch_background.xml
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── values-night
│ │ │ └── styles.xml
│ │ │ ├── values
│ │ │ └── styles.xml
│ │ │ └── xml
│ │ │ └── network_security_config.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle.kts
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle.kts
├── assets
├── fonts
│ ├── LXGWWenKaiLite-Medium.ttf
│ └── LXGWWenKaiLite-Regular.ttf
├── icons
│ ├── android
│ │ └── icon.png
│ ├── ios
│ │ ├── Dark.png
│ │ ├── Light.png
│ │ └── Tinted.png
│ ├── macos
│ │ ├── Icon-1024.png
│ │ ├── Icon-128.png
│ │ ├── Icon-256.png
│ │ ├── Icon-32.png
│ │ ├── Icon-512.png
│ │ └── Icon-64.png
│ ├── pc
│ │ ├── macos_icon.png
│ │ ├── windows_icon.ico
│ │ └── windows_icon.png
│ └── splash
│ │ ├── splash-icon-dark.png
│ │ └── splash-icon-light.png
└── images
│ ├── forum.jpg
│ ├── icon_empty.png
│ ├── icon_exclamation_error.png
│ ├── icon_leave.png
│ ├── icon_no_comment.png
│ ├── icon_success.png
│ ├── icon_unknown_error.png
│ ├── latest.jpg
│ ├── leaderboard.jpg
│ ├── loading-zip.gif
│ ├── loading.gif
│ ├── login.png
│ ├── profile_bg.png
│ ├── random.jpg
│ └── user.png
├── devtools_options.yaml
├── flutter_launcher_icons.yaml
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Podfile.lock
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
├── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── 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-38x38@2x.png
│ │ │ ├── Icon-App-38x38@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-64x64@2x.png
│ │ │ ├── Icon-App-64x64@3x.png
│ │ │ ├── Icon-App-68x68@2x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ ├── Icon-App-83.5x83.5@2x.png
│ │ │ ├── Icon-App-Dark-1024x1024@1x.png
│ │ │ ├── Icon-App-Dark-20x20@2x.png
│ │ │ ├── Icon-App-Dark-20x20@3x.png
│ │ │ ├── Icon-App-Dark-29x29@2x.png
│ │ │ ├── Icon-App-Dark-29x29@3x.png
│ │ │ ├── Icon-App-Dark-38x38@2x.png
│ │ │ ├── Icon-App-Dark-38x38@3x.png
│ │ │ ├── Icon-App-Dark-40x40@2x.png
│ │ │ ├── Icon-App-Dark-40x40@3x.png
│ │ │ ├── Icon-App-Dark-60x60@2x.png
│ │ │ ├── Icon-App-Dark-60x60@3x.png
│ │ │ ├── Icon-App-Dark-64x64@2x.png
│ │ │ ├── Icon-App-Dark-64x64@3x.png
│ │ │ ├── Icon-App-Dark-68x68@2x.png
│ │ │ ├── Icon-App-Dark-76x76@2x.png
│ │ │ ├── Icon-App-Dark-83.5x83.5@2x.png
│ │ │ ├── Icon-App-Tinted-1024x1024@1x.png
│ │ │ ├── Icon-App-Tinted-20x20@2x.png
│ │ │ ├── Icon-App-Tinted-20x20@3x.png
│ │ │ ├── Icon-App-Tinted-29x29@2x.png
│ │ │ ├── Icon-App-Tinted-29x29@3x.png
│ │ │ ├── Icon-App-Tinted-38x38@2x.png
│ │ │ ├── Icon-App-Tinted-38x38@3x.png
│ │ │ ├── Icon-App-Tinted-40x40@2x.png
│ │ │ ├── Icon-App-Tinted-40x40@3x.png
│ │ │ ├── Icon-App-Tinted-60x60@2x.png
│ │ │ ├── Icon-App-Tinted-60x60@3x.png
│ │ │ ├── Icon-App-Tinted-64x64@2x.png
│ │ │ ├── Icon-App-Tinted-64x64@3x.png
│ │ │ ├── Icon-App-Tinted-68x68@2x.png
│ │ │ ├── Icon-App-Tinted-76x76@2x.png
│ │ │ └── Icon-App-Tinted-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
└── RunnerTests
│ └── RunnerTests.swift
├── lib
├── config
│ ├── app_config.dart
│ └── setup_config.dart
├── database
│ ├── download_task_helper.dart
│ ├── history_helper.dart
│ ├── images_helper.dart
│ ├── read_record_helper.dart
│ ├── tag_block_helper.dart
│ └── word_block_helper.dart
├── main.dart
├── mixin
│ ├── auto_register_handler.dart
│ ├── blocked_words.dart
│ └── pagination_handler.dart
├── model
│ ├── reader_provider.dart
│ ├── search_provider.dart
│ ├── theme_provider.dart
│ └── user_provider.dart
├── network
│ ├── cache.dart
│ ├── client.dart
│ ├── http.dart
│ ├── http_client.dart
│ ├── models.dart
│ ├── models.g.dart
│ └── utils.dart
├── router
│ ├── app_router.dart
│ └── aware_page_wrapper.dart
├── startup_prepare.dart
├── utils
│ ├── common.dart
│ ├── download_manager.dart
│ ├── extension.dart
│ ├── loader.dart
│ ├── log.dart
│ ├── shared_preferences_util.dart
│ ├── ui.dart
│ └── version.dart
├── views
│ ├── about
│ │ └── about.dart
│ ├── categories
│ │ └── categories.dart
│ ├── comic_details
│ │ ├── chapters_list.dart
│ │ ├── collect_action.dart
│ │ ├── comic_details.dart
│ │ ├── comic_share_id.dart
│ │ ├── creator.dart
│ │ ├── downloader.dart
│ │ ├── icon_text.dart
│ │ ├── liked_action.dart
│ │ └── recommendation.dart
│ ├── comics
│ │ ├── comics.dart
│ │ ├── common_tmi_list.dart
│ │ ├── list_item.dart
│ │ ├── page_selector.dart
│ │ ├── simple_list_item.dart
│ │ ├── sort_type_selector.dart
│ │ └── tmi_list.dart
│ ├── comments
│ │ ├── comment_input.dart
│ │ ├── comments.dart
│ │ ├── sub_comments.dart
│ │ └── thumb_up.dart
│ ├── home
│ │ ├── home.dart
│ │ ├── navigation.dart
│ │ └── share_dialog.dart
│ ├── login
│ │ ├── login.dart
│ │ └── register.dart
│ ├── mine
│ │ ├── comments
│ │ │ ├── comments.dart
│ │ │ └── sub_comments.dart
│ │ ├── downloads.dart
│ │ ├── editor.dart
│ │ ├── favorites.dart
│ │ ├── history.dart
│ │ └── mine.dart
│ ├── notifications
│ │ └── notifications.dart
│ ├── random
│ │ └── random.dart
│ ├── rank
│ │ └── rank.dart
│ ├── reader
│ │ ├── app_bar.dart
│ │ ├── bottom.dart
│ │ ├── comic_list_mixin.dart
│ │ ├── next_chapter.dart
│ │ ├── page_no_tag.dart
│ │ ├── reader.dart
│ │ └── widget
│ │ │ ├── comic_image.dart
│ │ │ ├── horizontal_list
│ │ │ └── horizontal_list.dart
│ │ │ └── vertical_list
│ │ │ ├── gesture.dart
│ │ │ └── vertical_list.dart
│ ├── search
│ │ ├── hot_search_words.dart
│ │ ├── item.dart
│ │ ├── search.dart
│ │ ├── search_comics.dart
│ │ ├── search_history.dart
│ │ ├── search_list_item.dart
│ │ └── simple_search_list_item.dart
│ └── settings
│ │ ├── blacklist.dart
│ │ ├── browse_mode.dart
│ │ ├── change_image_quality.dart
│ │ ├── change_password.dart
│ │ ├── change_server.dart
│ │ ├── clear_cache.dart
│ │ ├── comic_block_scale.dart
│ │ ├── logout.dart
│ │ ├── network.dart
│ │ ├── pager.dart
│ │ ├── read_mode.dart
│ │ ├── settings.dart
│ │ ├── tag_block.dart
│ │ ├── theme.dart
│ │ ├── theme_color.dart
│ │ ├── theme_icon.dart
│ │ ├── theme_switch.dart
│ │ ├── visible_categories.dart
│ │ ├── webdav.dart
│ │ ├── widgets
│ │ ├── block.dart
│ │ └── menu_list_tile.dart
│ │ └── word_block.dart
└── widgets
│ ├── base_image.dart
│ ├── base_page.dart
│ ├── button.dart
│ ├── empty.dart
│ ├── error_page.dart
│ ├── shadow_text.dart
│ ├── slide_transition_x.dart
│ ├── tag.dart
│ ├── toast.dart
│ └── with_blur.dart
├── macos
├── .gitignore
├── Flutter
│ ├── Flutter-Debug.xcconfig
│ ├── Flutter-Release.xcconfig
│ └── GeneratedPluginRegistrant.swift
├── Podfile
├── Podfile.lock
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── app_icon_1024.png
│ │ │ ├── app_icon_128.png
│ │ │ ├── app_icon_16.png
│ │ │ ├── app_icon_256.png
│ │ │ ├── app_icon_32.png
│ │ │ ├── app_icon_512.png
│ │ │ └── app_icon_64.png
│ ├── Base.lproj
│ │ └── MainMenu.xib
│ ├── Configs
│ │ ├── AppInfo.xcconfig
│ │ ├── Debug.xcconfig
│ │ ├── Release.xcconfig
│ │ └── Warnings.xcconfig
│ ├── DebugProfile.entitlements
│ ├── Info.plist
│ ├── MainFlutterWindow.swift
│ └── Release.entitlements
└── RunnerTests
│ └── RunnerTests.swift
├── package_rename_config.yaml
├── pubspec.lock
├── pubspec.yaml
├── screenshots
├── pc-分类.png
├── pc-漫画列表.png
├── pc-漫画详情.png
├── pc-阅读.png
├── 分类.png
├── 漫画列表.png
├── 漫画详情.png
└── 阅读.png
├── test
└── widget_test.dart
└── windows
├── .gitignore
├── CMakeLists.txt
├── flutter
├── CMakeLists.txt
├── generated_plugin_registrant.cc
├── generated_plugin_registrant.h
└── generated_plugins.cmake
└── runner
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── resources
└── app_icon.ico
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .build/
9 | .buildlog/
10 | .history
11 | .svn/
12 | .swiftpm/
13 | migrate_working_dir/
14 |
15 | # IntelliJ related
16 | *.iml
17 | *.ipr
18 | *.iws
19 | .idea/
20 |
21 | # The .vscode folder contains launch configuration and tasks you configure in
22 | # VS Code which you may wish to be included in version control, so this line
23 | # is commented out by default.
24 | .vscode/
25 |
26 | # Flutter/Dart/Pub related
27 | **/doc/api/
28 | **/ios/Flutter/.last_build_id
29 | .dart_tool/
30 | .flutter-plugins
31 | .flutter-plugins-dependencies
32 | .pub-cache/
33 | .pub/
34 | /build/
35 |
36 | # Symbolication related
37 | app.*.symbols
38 |
39 | # Obfuscation related
40 | app.*.map.json
41 |
42 | # Android Studio will place build artifacts here
43 | /android/app/debug
44 | /android/app/profile
45 | /android/app/release
46 |
47 | *.jks
48 |
--------------------------------------------------------------------------------
/.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: "35c388afb57ef061d06a39b537336c87e0e3d1b1"
8 | channel: "stable"
9 |
10 | project_type: app
11 |
12 | # Tracks metadata for the flutter migrate command
13 | migration:
14 | platforms:
15 | - platform: root
16 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
17 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
18 | - platform: android
19 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
20 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
21 | - platform: ios
22 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
23 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
24 | - platform: linux
25 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
26 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
27 | - platform: macos
28 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
29 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
30 | - platform: web
31 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
32 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
33 | - platform: windows
34 | create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
35 | base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
36 |
37 | # User provided section
38 |
39 | # List of Local paths (relative to this file) that should be
40 | # ignored by the migrate tool.
41 | #
42 | # Files that are not part of the templates will be ignored by default.
43 | unmanaged_files:
44 | - 'lib/main.dart'
45 | - 'ios/Runner.xcodeproj/project.pbxproj'
46 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # HaKa Comic
2 |
3 | [](https://opensource.org/licenses/GPL-3.0)
4 |
5 | ## 📖 项目简介
6 |
7 | 第三方哗咔漫画跨平台客户端。**练习项目**,支持 Android、IOS、Mac 和 Windows 四个平台,目前仍在持续完善中。欢迎给个 star⭐️ 支持一下。IOS 的 ipa 安装需要自签,有很多工具支持,具体需要自行搜索一下。
8 |
9 | ---
10 |
11 | ## ✨ 核心功能
12 |
13 | - 🆔 **漫画 ID 分享**
14 | 支持官方最新分享漫画 ID 功能,详情页可直接复制漫画 ID(使用 ID 见截图红圈标注)
15 | - 🌐 **多平台适配**
16 | 兼容移动端与桌面端设备(Android/IOS/Mac/Windows)
17 |
18 | ---
19 |
20 | ## 🖼️ 项目截图
21 |
22 | | 分类浏览 | 漫画列表 | 漫画详情 | 阅读界面 |
23 | | ------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------- |
24 | |
|
|
|
|
25 | |
|
|
|
|
26 |
27 | **截图可能过时,以实际项目界面为主**
28 |
29 | ## ⚠️ 免责声明
30 |
31 | 1. 本项目为**非官方第三方应用**,与哔咔漫画官方无任何关联
32 | 2. 仅用于**技术交流与学习**目的,禁止用于商业用途
33 | 3. 使用本软件产生的一切后果由使用者自行承担
34 | 4. 资源内容版权归原作者及平台所有,请于下载后 24 小时内删除
35 |
36 | ---
37 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | # This file configures the analyzer, which statically analyzes Dart code to
2 | # check for errors, warnings, and lints.
3 | #
4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled
5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
6 | # invoked from the command line by running `flutter analyze`.
7 |
8 | # The following line activates a set of recommended lints for Flutter apps,
9 | # packages, and plugins designed to encourage good coding practices.
10 | include: package:flutter_lints/flutter.yaml
11 |
12 | linter:
13 | # The lint rules applied to this project can be customized in the
14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml`
15 | # included above or to enable additional rules. A list of all available lints
16 | # and their documentation is published at https://dart.dev/lints.
17 | #
18 | # Instead of disabling a lint rule for the entire project in the
19 | # section below, it can also be suppressed for a single line of code
20 | # or a specific dart file by using the `// ignore: name_of_lint` and
21 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file
22 | # producing the lint.
23 | rules:
24 | # avoid_print: false # Uncomment to disable the `avoid_print` rule
25 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
26 | prefer_const_constructors: true
27 | use_null_aware_elements: true
28 | # Additional information about this file can be found at
29 | # https://dart.dev/guides/language/analysis-options
30 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 | .cxx/
9 |
10 | # Remember to never publicly share your keystore.
11 | # See https://flutter.dev/to/reference-keystore
12 | key.properties
13 | **/*.keystore
14 | **/*.jks
15 |
--------------------------------------------------------------------------------
/android/app/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import java.util.Properties
2 | import java.io.FileInputStream
3 |
4 | plugins {
5 | id("com.android.application")
6 | id("kotlin-android")
7 | // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
8 | id("dev.flutter.flutter-gradle-plugin")
9 | }
10 |
11 | val keystoreProperties = Properties()
12 | val keystorePropertiesFile = rootProject.file("key.properties")
13 | if (keystorePropertiesFile.exists()) {
14 | keystoreProperties.load(FileInputStream(keystorePropertiesFile))
15 | }
16 |
17 | android {
18 | namespace = "com.github.raoxwup.haka_comic"
19 | compileSdk = flutter.compileSdkVersion
20 | ndkVersion = "27.0.12077973"
21 |
22 | compileOptions {
23 | sourceCompatibility = JavaVersion.VERSION_11
24 | targetCompatibility = JavaVersion.VERSION_11
25 | }
26 |
27 | kotlinOptions {
28 | jvmTarget = JavaVersion.VERSION_11.toString()
29 | }
30 |
31 | defaultConfig {
32 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
33 | applicationId = "com.github.raoxwup.haka_comic"
34 | // You can update the following values to match your application needs.
35 | // For more information, see: https://flutter.dev/to/review-gradle-config.
36 | minSdk = flutter.minSdkVersion
37 | targetSdk = flutter.targetSdkVersion
38 | versionCode = flutter.versionCode
39 | versionName = flutter.versionName
40 | }
41 |
42 | signingConfigs {
43 | create("release") {
44 | keyAlias = keystoreProperties["keyAlias"] as String
45 | keyPassword = keystoreProperties["keyPassword"] as String
46 | storeFile = keystoreProperties["storeFile"]?.let { file(it) }
47 | storePassword = keystoreProperties["storePassword"] as String
48 | }
49 | }
50 |
51 | buildTypes {
52 | release {
53 | // TODO: Add your own signing config for the release build.
54 | // Signing with the debug keys for now, so `flutter run --release` works.
55 | signingConfig = signingConfigs.getByName("release")
56 | }
57 | }
58 | }
59 |
60 | flutter {
61 | source = "../.."
62 | }
63 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
21 |
25 |
29 |
30 |
31 |
32 |
33 |
34 |
36 |
39 |
41 |
42 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/github/raoxwup/haka_comic/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.github.raoxwup.haka_comic
2 |
3 | import android.os.Bundle
4 | import io.flutter.embedding.android.FlutterActivity
5 | import io.flutter.embedding.engine.FlutterEngine
6 | import io.flutter.plugin.common.MethodChannel
7 |
8 | class MainActivity : FlutterActivity() {
9 | private val CHANNEL = "back_to_home"
10 |
11 | override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
12 | super.configureFlutterEngine(flutterEngine)
13 |
14 | // 设置 MethodChannel
15 | MethodChannel(
16 | flutterEngine.dartExecutor.binaryMessenger,
17 | CHANNEL
18 | ).setMethodCallHandler { call, result ->
19 | when (call.method) {
20 | "moveToBackground" -> {
21 | // 将应用退至后台
22 | moveTaskToBack(true)
23 | result.success(null)
24 | }
25 | else -> result.notImplemented()
26 | }
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
20 |
21 |
--------------------------------------------------------------------------------
/android/app/src/main/res/xml/network_security_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle.kts:
--------------------------------------------------------------------------------
1 | allprojects {
2 | repositories {
3 | google()
4 | mavenCentral()
5 | }
6 | }
7 |
8 | val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
9 | rootProject.layout.buildDirectory.value(newBuildDir)
10 |
11 | subprojects {
12 | val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
13 | project.layout.buildDirectory.value(newSubprojectBuildDir)
14 | }
15 | subprojects {
16 | project.evaluationDependsOn(":app")
17 | }
18 |
19 | tasks.register("clean") {
20 | delete(rootProject.layout.buildDirectory)
21 | }
22 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | zipStoreBase=GRADLE_USER_HOME
4 | zipStorePath=wrapper/dists
5 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
6 |
--------------------------------------------------------------------------------
/android/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | val flutterSdkPath = run {
3 | val properties = java.util.Properties()
4 | file("local.properties").inputStream().use { properties.load(it) }
5 | val flutterSdkPath = properties.getProperty("flutter.sdk")
6 | require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
7 | flutterSdkPath
8 | }
9 |
10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
11 |
12 | repositories {
13 | google()
14 | mavenCentral()
15 | gradlePluginPortal()
16 | }
17 | }
18 |
19 | plugins {
20 | id("dev.flutter.flutter-plugin-loader") version "1.0.0"
21 | id("com.android.application") version "8.7.0" apply false
22 | id("org.jetbrains.kotlin.android") version "1.8.22" apply false
23 | }
24 |
25 | include(":app")
26 |
--------------------------------------------------------------------------------
/assets/fonts/LXGWWenKaiLite-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/fonts/LXGWWenKaiLite-Medium.ttf
--------------------------------------------------------------------------------
/assets/fonts/LXGWWenKaiLite-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/fonts/LXGWWenKaiLite-Regular.ttf
--------------------------------------------------------------------------------
/assets/icons/android/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/android/icon.png
--------------------------------------------------------------------------------
/assets/icons/ios/Dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/ios/Dark.png
--------------------------------------------------------------------------------
/assets/icons/ios/Light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/ios/Light.png
--------------------------------------------------------------------------------
/assets/icons/ios/Tinted.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/ios/Tinted.png
--------------------------------------------------------------------------------
/assets/icons/macos/Icon-1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/macos/Icon-1024.png
--------------------------------------------------------------------------------
/assets/icons/macos/Icon-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/macos/Icon-128.png
--------------------------------------------------------------------------------
/assets/icons/macos/Icon-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/macos/Icon-256.png
--------------------------------------------------------------------------------
/assets/icons/macos/Icon-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/macos/Icon-32.png
--------------------------------------------------------------------------------
/assets/icons/macos/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/macos/Icon-512.png
--------------------------------------------------------------------------------
/assets/icons/macos/Icon-64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/macos/Icon-64.png
--------------------------------------------------------------------------------
/assets/icons/pc/macos_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/pc/macos_icon.png
--------------------------------------------------------------------------------
/assets/icons/pc/windows_icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/pc/windows_icon.ico
--------------------------------------------------------------------------------
/assets/icons/pc/windows_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/pc/windows_icon.png
--------------------------------------------------------------------------------
/assets/icons/splash/splash-icon-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/splash/splash-icon-dark.png
--------------------------------------------------------------------------------
/assets/icons/splash/splash-icon-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/icons/splash/splash-icon-light.png
--------------------------------------------------------------------------------
/assets/images/forum.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/forum.jpg
--------------------------------------------------------------------------------
/assets/images/icon_empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/icon_empty.png
--------------------------------------------------------------------------------
/assets/images/icon_exclamation_error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/icon_exclamation_error.png
--------------------------------------------------------------------------------
/assets/images/icon_leave.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/icon_leave.png
--------------------------------------------------------------------------------
/assets/images/icon_no_comment.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/icon_no_comment.png
--------------------------------------------------------------------------------
/assets/images/icon_success.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/icon_success.png
--------------------------------------------------------------------------------
/assets/images/icon_unknown_error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/icon_unknown_error.png
--------------------------------------------------------------------------------
/assets/images/latest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/latest.jpg
--------------------------------------------------------------------------------
/assets/images/leaderboard.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/leaderboard.jpg
--------------------------------------------------------------------------------
/assets/images/loading-zip.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/loading-zip.gif
--------------------------------------------------------------------------------
/assets/images/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/loading.gif
--------------------------------------------------------------------------------
/assets/images/login.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/login.png
--------------------------------------------------------------------------------
/assets/images/profile_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/profile_bg.png
--------------------------------------------------------------------------------
/assets/images/random.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/random.jpg
--------------------------------------------------------------------------------
/assets/images/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/assets/images/user.png
--------------------------------------------------------------------------------
/devtools_options.yaml:
--------------------------------------------------------------------------------
1 | description: This file stores settings for Dart & Flutter DevTools.
2 | documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
3 | extensions:
4 | - shared_preferences: true
--------------------------------------------------------------------------------
/flutter_launcher_icons.yaml:
--------------------------------------------------------------------------------
1 | # flutter pub run flutter_launcher_icons
2 | flutter_launcher_icons:
3 | image_path: "assets/icons/android/icon.png"
4 |
5 | android: true
6 | image_path_android: "assets/icons/android/icon.png"
7 | min_sdk_android: 21 # android min sdk min:16, default 21
8 | # adaptive_icon_background: "assets/icon/background.png"
9 | # adaptive_icon_foreground: "assets/icon/foreground.png"
10 | # adaptive_icon_monochrome: "assets/icon/monochrome.png"
11 |
12 | ios: true
13 | image_path_ios: "assets/icons/ios/light.png"
14 | # remove_alpha_channel_ios: true
15 | image_path_ios_dark_transparent: "assets/icons/ios/dark.png"
16 | image_path_ios_tinted_grayscale: "assets/icons/ios/tinted.png"
17 | # desaturate_tinted_to_grayscale_ios: true
18 |
19 | windows:
20 | generate: true
21 | image_path: "assets/icons/pc/windows_icon.png"
22 | icon_size: 96 # min:48, max:256, default: 48
23 |
24 | macos:
25 | generate: true
26 | image_path: "assets/icons/pc/macos_icon.png"
27 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | **/dgph
2 | *.mode1v3
3 | *.mode2v3
4 | *.moved-aside
5 | *.pbxuser
6 | *.perspectivev3
7 | **/*sync/
8 | .sconsign.dblite
9 | .tags*
10 | **/.vagrant/
11 | **/DerivedData/
12 | Icon?
13 | **/Pods/
14 | **/.symlinks/
15 | profile
16 | xcuserdata
17 | **/.generated/
18 | Flutter/App.framework
19 | Flutter/Flutter.framework
20 | Flutter/Flutter.podspec
21 | Flutter/Generated.xcconfig
22 | Flutter/ephemeral/
23 | Flutter/app.flx
24 | Flutter/app.zip
25 | Flutter/flutter_assets/
26 | Flutter/flutter_export_environment.sh
27 | ServiceDefinitions.json
28 | Runner/GeneratedPluginRegistrant.*
29 |
30 | # Exceptions to above rules.
31 | !default.mode1v3
32 | !default.mode2v3
33 | !default.pbxuser
34 | !default.perspectivev3
35 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 13.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, '13.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def flutter_root
14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
15 | unless File.exist?(generated_xcode_build_settings_path)
16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
17 | end
18 |
19 | File.foreach(generated_xcode_build_settings_path) do |line|
20 | matches = line.match(/FLUTTER_ROOT\=(.*)/)
21 | return matches[1].strip if matches
22 | end
23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
24 | end
25 |
26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
27 |
28 | flutter_ios_podfile_setup
29 |
30 | target 'Runner' do
31 | use_frameworks!
32 |
33 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
34 | target 'RunnerTests' do
35 | inherit! :search_paths
36 | end
37 | end
38 |
39 | post_install do |installer|
40 | installer.pods_project.targets.each do |target|
41 | flutter_additional_ios_build_settings(target)
42 | end
43 | end
44 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import Flutter
2 | import UIKit
3 |
4 | @main
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-38x38@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-64x64@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-68x68@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-68x68@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-38x38@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-64x64@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-68x68@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-68x68@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Dark-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-38x38@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-64x64@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-68x68@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-68x68@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-Tinted-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/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raoxwup/haka_comic/2a19dca470454eab8ea32a9dfce7ba58a88a86e3/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 | LSApplicationQueriesSchemes
6 |
7 | https
8 | http
9 |
10 | CADisableMinimumFrameDurationOnPhone
11 |
12 | CFBundleDevelopmentRegion
13 | $(DEVELOPMENT_LANGUAGE)
14 | CFBundleDisplayName
15 | HaKa Comic
16 | CFBundleExecutable
17 | $(EXECUTABLE_NAME)
18 | CFBundleIdentifier
19 | $(PRODUCT_BUNDLE_IDENTIFIER)
20 | CFBundleInfoDictionaryVersion
21 | 6.0
22 | CFBundleName
23 | HaKaComic
24 | CFBundlePackageType
25 | APPL
26 | CFBundleShortVersionString
27 | $(FLUTTER_BUILD_NAME)
28 | CFBundleSignature
29 | ????
30 | CFBundleVersion
31 | $(FLUTTER_BUILD_NUMBER)
32 | LSRequiresIPhoneOS
33 |
34 | NSAppTransportSecurity
35 |
36 | NSAllowsArbitraryLoads
37 |
38 |
39 | NSPhotoLibraryUsageDescription
40 | Allow $(PRODUCT_NAME) to access your photos.
41 | UIApplicationSupportsIndirectInputEvents
42 |
43 | UIBackgroundModes
44 |
45 | fetch
46 | processing
47 |
48 | UILaunchStoryboardName
49 | LaunchScreen
50 | UIMainStoryboardFile
51 | Main
52 | UISupportedInterfaceOrientations
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationLandscapeLeft
56 | UIInterfaceOrientationLandscapeRight
57 |
58 | UISupportedInterfaceOrientations~ipad
59 |
60 | UIInterfaceOrientationPortrait
61 | UIInterfaceOrientationPortraitUpsideDown
62 | UIInterfaceOrientationLandscapeLeft
63 | UIInterfaceOrientationLandscapeRight
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/ios/RunnerTests/RunnerTests.swift:
--------------------------------------------------------------------------------
1 | import Flutter
2 | import UIKit
3 | import XCTest
4 |
5 | class RunnerTests: XCTestCase {
6 |
7 | func testExample() {
8 | // If you add code to the Runner application, consider adding tests here.
9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/lib/config/setup_config.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:path_provider/path_provider.dart';
3 |
4 | final scaffoldMessengerKey = GlobalKey();
5 | // 全局导航键
6 | final GlobalKey navigatorKey = GlobalKey();
7 |
8 | class SetupConf {
9 | static late String dataPath;
10 | static String appVersion = "1.0.1";
11 |
12 | static Future initialize() async {
13 | await Future.wait([initPath()]);
14 | }
15 |
16 | static Future initPath() async {
17 | final dir = await getApplicationSupportDirectory();
18 | dataPath = dir.path;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/lib/database/tag_block_helper.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:flutter/material.dart';
3 | import 'package:haka_comic/config/setup_config.dart';
4 | import 'package:path_provider/path_provider.dart';
5 | import 'package:sqlite_async/sqlite_async.dart';
6 | import 'package:path/path.dart' as p;
7 |
8 | final migrations =
9 | SqliteMigrations()..add(
10 | SqliteMigration(1, (tx) async {
11 | await tx.execute('''
12 | CREATE TABLE IF NOT EXISTS tag_block (
13 | id INTEGER PRIMARY KEY,
14 | tag TEXT UNIQUE NOT NULL
15 | );
16 | ''');
17 | }),
18 | );
19 |
20 | class TagBlockHelper with ChangeNotifier {
21 | TagBlockHelper._internal();
22 |
23 | static final _instance = TagBlockHelper._internal();
24 |
25 | factory TagBlockHelper() => _instance;
26 |
27 | late SqliteDatabase _db;
28 | String get dbPath => '${SetupConf.dataPath}/tag_block.db';
29 |
30 | Future initialize() async {
31 | _db = SqliteDatabase(path: dbPath);
32 | await migrations.migrate(_db);
33 | }
34 |
35 | Future insert(String tag) async {
36 | await _db.writeTransaction((tx) async {
37 | await tx.execute('INSERT OR IGNORE INTO tag_block (tag) VALUES (?)', [
38 | tag,
39 | ]);
40 | });
41 | notifyListeners();
42 | }
43 |
44 | Future delete(String tag) async {
45 | await _db.writeTransaction((tx) async {
46 | await tx.execute('DELETE FROM tag_block WHERE tag = ?', [tag]);
47 | });
48 | notifyListeners();
49 | }
50 |
51 | Future> query() async {
52 | final result = await _db.getAll('SELECT tag FROM tag_block');
53 | return result.map((row) => row['tag'] as String).toList();
54 | }
55 |
56 | Future contains(String tag) async {
57 | final result = await _db.getOptional(
58 | 'SELECT 1 FROM tag_block WHERE tag = ?',
59 | [tag],
60 | );
61 | return result != null;
62 | }
63 |
64 | Future clear() async {
65 | await _db.execute('DELETE FROM tag_block');
66 | notifyListeners();
67 | }
68 |
69 | Future backup() async {
70 | final tempDir = await getTemporaryDirectory();
71 | final path = p.join(tempDir.path, 'tag_block.db');
72 | final file = File(path);
73 | if (await file.exists()) {
74 | await file.delete();
75 | }
76 | await _db.execute('VACUUM INTO ?', [path]);
77 | return File(path);
78 | }
79 |
80 | Future restore(File file) async {
81 | await _db.close();
82 | final files = [File(dbPath), File('$dbPath-wal'), File('$dbPath-shm')];
83 | for (var f in files) {
84 | if (await f.exists()) {
85 | await f.delete();
86 | }
87 | }
88 | await file.copy(dbPath);
89 | await initialize();
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/lib/database/word_block_helper.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:flutter/material.dart';
3 | import 'package:haka_comic/config/setup_config.dart';
4 | import 'package:path_provider/path_provider.dart';
5 | import 'package:sqlite_async/sqlite_async.dart';
6 | import 'package:path/path.dart' as p;
7 |
8 | final migrations =
9 | SqliteMigrations()..add(
10 | SqliteMigration(1, (tx) async {
11 | await tx.execute('''
12 | CREATE TABLE IF NOT EXISTS word_block (
13 | id INTEGER PRIMARY KEY,
14 | word TEXT UNIQUE NOT NULL
15 | );
16 | ''');
17 | }),
18 | );
19 |
20 | class WordBlockHelper with ChangeNotifier {
21 | WordBlockHelper._internal();
22 |
23 | static final _instance = WordBlockHelper._internal();
24 |
25 | factory WordBlockHelper() => _instance;
26 |
27 | late SqliteDatabase _db;
28 | String get dbPath => '${SetupConf.dataPath}/word_block.db';
29 |
30 | Future initialize() async {
31 | _db = SqliteDatabase(path: dbPath);
32 | await migrations.migrate(_db);
33 | }
34 |
35 | Future insert(String word) async {
36 | await _db.writeTransaction((tx) async {
37 | await tx.execute('INSERT OR IGNORE INTO word_block (word) VALUES (?)', [
38 | word,
39 | ]);
40 | });
41 | notifyListeners();
42 | }
43 |
44 | Future delete(String word) async {
45 | await _db.writeTransaction((tx) async {
46 | await tx.execute('DELETE FROM word_block WHERE word = ?', [word]);
47 | });
48 | notifyListeners();
49 | }
50 |
51 | Future> query() async {
52 | final result = await _db.getAll('SELECT word FROM word_block');
53 | return result.map((row) => row['word'] as String).toList();
54 | }
55 |
56 | Future contains(String word) async {
57 | final result = await _db.getOptional(
58 | 'SELECT 1 FROM word_block WHERE word = ?',
59 | [word],
60 | );
61 | return result != null;
62 | }
63 |
64 | Future clear() async {
65 | await _db.execute('DELETE FROM word_block');
66 | notifyListeners();
67 | }
68 |
69 | Future backup() async {
70 | final tempDir = await getTemporaryDirectory();
71 | final path = p.join(tempDir.path, 'word_block.db');
72 | final file = File(path);
73 | if (await file.exists()) {
74 | await file.delete();
75 | }
76 | await _db.execute('VACUUM INTO ?', [path]);
77 | return File(path);
78 | }
79 |
80 | Future restore(File file) async {
81 | await _db.close();
82 | final files = [File(dbPath), File('$dbPath-wal'), File('$dbPath-shm')];
83 | for (var f in files) {
84 | if (await f.exists()) {
85 | await f.delete();
86 | }
87 | }
88 | await file.copy(dbPath);
89 | await initialize();
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/lib/mixin/auto_register_handler.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/widgets.dart';
2 | import 'package:haka_comic/utils/extension.dart';
3 |
4 | mixin AutoRegisterHandlerMixin on State {
5 | /// 注册请求处理器
6 | late final List _handlers;
7 |
8 | /// 注册请求处理器方法
9 | List registerHandler();
10 |
11 | void update() {
12 | if (mounted) {
13 | setState(() {});
14 | }
15 | }
16 |
17 | @override
18 | void initState() {
19 | super.initState();
20 | _handlers = registerHandler();
21 | for (var handler in _handlers) {
22 | handler.addListener(update);
23 | }
24 | }
25 |
26 | @override
27 | void dispose() {
28 | for (var handler in _handlers) {
29 | handler.dispose();
30 | }
31 | super.dispose();
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/lib/mixin/blocked_words.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/widgets.dart';
2 | import 'package:haka_comic/database/tag_block_helper.dart';
3 | import 'package:haka_comic/database/word_block_helper.dart';
4 |
5 | mixin BlockedWordsMixin on State {
6 | final _tagBlockHelper = TagBlockHelper();
7 | List blockedTags = [];
8 |
9 | Future _getBlockedTags() async {
10 | final tags = await _tagBlockHelper.query();
11 | setState(() {
12 | blockedTags = tags;
13 | });
14 | }
15 |
16 | final _wordBlockHelper = WordBlockHelper();
17 | List blockedWords = [];
18 |
19 | Future _getBlockedWords() async {
20 | final words = await _wordBlockHelper.query();
21 | setState(() {
22 | blockedWords = words;
23 | });
24 | }
25 |
26 | @override
27 | void initState() {
28 | super.initState();
29 | _getBlockedTags();
30 | _tagBlockHelper.addListener(_getBlockedTags);
31 | _getBlockedWords();
32 | _wordBlockHelper.addListener(_getBlockedWords);
33 | }
34 |
35 | @override
36 | void dispose() {
37 | _tagBlockHelper.removeListener(_getBlockedTags);
38 | _wordBlockHelper.removeListener(_getBlockedWords);
39 | super.dispose();
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/lib/mixin/pagination_handler.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:haka_comic/config/app_config.dart';
3 |
4 | mixin PaginationHandlerMixin on State {
5 | final scrollController = ScrollController();
6 | final pagination = AppConf().pagination;
7 | bool _loading = false;
8 |
9 | Future loadMore();
10 |
11 | void onScroll() {
12 | final position = scrollController.position;
13 | if (position.maxScrollExtent <= 0) return;
14 |
15 | const threshold = 200.0; // 距离底部 200 像素内触发加载
16 | final distanceToBottom = position.maxScrollExtent - position.pixels;
17 |
18 | if (distanceToBottom <= threshold) {
19 | if (_loading) return;
20 | _loading = true;
21 | loadMore().whenComplete(() => _loading = false);
22 | }
23 | }
24 |
25 | @override
26 | void initState() {
27 | super.initState();
28 |
29 | if (!pagination) {
30 | scrollController.addListener(onScroll);
31 | }
32 | }
33 |
34 | @override
35 | void dispose() {
36 | if (!pagination) {
37 | scrollController
38 | ..removeListener(onScroll)
39 | ..dispose();
40 | }
41 |
42 | super.dispose();
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/lib/model/reader_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:haka_comic/network/models.dart';
3 |
4 | enum ReadMode {
5 | /// 条漫模式
6 | vertical,
7 |
8 | /// 单页横向从左到右
9 | leftToRight,
10 |
11 | /// 单页横向从右到左
12 | rightToLeft,
13 |
14 | /// 双页横向从左到右
15 | doubleLeftToRight,
16 |
17 | /// 双页横向从右到左
18 | doubleRightToLeft,
19 | }
20 |
21 | ReadMode stringToReadMode(String mode) {
22 | return switch (mode) {
23 | 'vertical' => ReadMode.vertical,
24 | 'leftToRight' => ReadMode.leftToRight,
25 | 'rightToLeft' => ReadMode.rightToLeft,
26 | 'doubleLeftToRight' => ReadMode.doubleLeftToRight,
27 | 'doubleRightToLeft' => ReadMode.doubleRightToLeft,
28 | _ => ReadMode.vertical,
29 | };
30 | }
31 |
32 | String readModeToString(ReadMode mode) {
33 | return switch (mode) {
34 | ReadMode.vertical => '连续从上到下',
35 | ReadMode.leftToRight => '单页从左到右',
36 | ReadMode.rightToLeft => '单页从右到左',
37 | ReadMode.doubleLeftToRight => '双页从左到右',
38 | ReadMode.doubleRightToLeft => '双页从右到左',
39 | };
40 | }
41 |
42 | class ReaderProvider with ChangeNotifier {
43 | /// 漫画id
44 | late String cid;
45 |
46 | /// 漫画名称
47 | late String title;
48 |
49 | /// 漫画所有章节
50 | late List chapters;
51 |
52 | /// 漫画当前阅读章节
53 | late Chapter _currentChapter;
54 | Chapter get currentChapter => _currentChapter;
55 | set currentChapter(Chapter chapter) {
56 | _currentChapter = chapter;
57 | notifyListeners();
58 | }
59 |
60 | /// 当前章节的索引
61 | int get currentChapterIndex => chapters.indexOf(currentChapter);
62 |
63 | /// 是否为第一章
64 | bool get isFirstChapter => currentChapter.uid == chapters.first.uid;
65 |
66 | /// 是否为最后一章
67 | bool get isLastChapter => currentChapter.uid == chapters.last.uid;
68 |
69 | /// 当前章节第几张图片
70 | int _pageNo = 0;
71 | int get pageNo => _pageNo;
72 | set pageNo(int index) {
73 | _pageNo = index;
74 | notifyListeners();
75 | }
76 |
77 | /// [id] 漫画id
78 | /// [title] 漫画标题
79 | /// [chapters] 漫画所有章节
80 | /// [currentChapter] 从第几章开始
81 | /// [pageNo] 从第几张图片开始
82 | void initialize({
83 | required String id,
84 | required String title,
85 | required List chapters,
86 | Chapter? currentChapter,
87 | int? pageNo,
88 | }) {
89 | cid = id;
90 | this.title = title;
91 | this.chapters = chapters;
92 | _currentChapter = currentChapter ?? chapters.first;
93 | _pageNo = pageNo ?? 0;
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/lib/model/search_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:haka_comic/utils/shared_preferences_util.dart';
3 |
4 | class SearchProvider with ChangeNotifier {
5 | static const historyLength = 20;
6 | final List _history = [];
7 |
8 | List get history => _history;
9 |
10 | SearchProvider() {
11 | final history = SharedPreferencesUtil.prefs.getStringList('search_history');
12 | if (history != null) {
13 | _history.addAll(history);
14 | notifyListeners();
15 | }
16 | }
17 |
18 | void add(String keyword) {
19 | if (_history.contains(keyword)) {
20 | _history.remove(keyword);
21 | }
22 | if (_history.length >= historyLength) {
23 | _history.removeLast();
24 | }
25 | _history.insert(0, keyword);
26 | notifyListeners();
27 | }
28 |
29 | void remove(String keyword) {
30 | _history.remove(keyword);
31 | notifyListeners();
32 | }
33 |
34 | void clear() {
35 | _history.clear();
36 | notifyListeners();
37 | }
38 |
39 | @override
40 | void notifyListeners() {
41 | super.notifyListeners();
42 | useCache();
43 | }
44 |
45 | void useCache() {
46 | SharedPreferencesUtil.prefs.setStringList('search_history', _history);
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/lib/model/theme_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:haka_comic/utils/shared_preferences_util.dart';
3 |
4 | class ThemeProvider with ChangeNotifier {
5 | ThemeMode _themeMode = ThemeMode.system;
6 | String _primaryColor = 'System';
7 |
8 | ThemeMode get themeMode => _themeMode;
9 |
10 | String get primaryColor => _primaryColor;
11 |
12 | static const Map stringToThemeMode = {
13 | 'System': ThemeMode.system,
14 | 'Light': ThemeMode.light,
15 | 'Dark': ThemeMode.dark,
16 | };
17 |
18 | static const Map themeModeToString = {
19 | ThemeMode.system: 'System',
20 | ThemeMode.light: 'Light',
21 | ThemeMode.dark: 'Dark',
22 | };
23 |
24 | static Color stringToColor(String color) {
25 | return switch (color) {
26 | 'Red' => Colors.red,
27 | 'Pink' => Colors.pink,
28 | 'Green' => Colors.green,
29 | 'Blue' => Colors.blue,
30 | 'Yellow' => Colors.yellow,
31 | 'Orange' => Colors.orange,
32 | 'Purple' => Colors.purple,
33 | _ => Colors.blue,
34 | };
35 | }
36 |
37 | ThemeProvider() {
38 | final mode =
39 | SharedPreferencesUtil.prefs.getString('theme_mode') ?? 'System';
40 | _themeMode = stringToThemeMode[mode]!;
41 |
42 | _primaryColor =
43 | SharedPreferencesUtil.prefs.getString('primary_color') ?? 'System';
44 | }
45 |
46 | void setThemeMode(ThemeMode mode) {
47 | _themeMode = mode;
48 | SharedPreferencesUtil.prefs.setString(
49 | 'theme_mode',
50 | themeModeToString[mode]!,
51 | );
52 | notifyListeners();
53 | }
54 |
55 | void setPrimaryColor(String color) {
56 | _primaryColor = color;
57 | SharedPreferencesUtil.prefs.setString('primary_color', color);
58 | notifyListeners();
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/lib/model/user_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:haka_comic/network/models.dart';
3 |
4 | class UserProvider with ChangeNotifier {
5 | User? _user;
6 |
7 | User? get user => _user;
8 |
9 | set user(User? user) {
10 | _user = user;
11 | notifyListeners();
12 | }
13 |
14 | late VoidCallback refresh;
15 | }
16 |
--------------------------------------------------------------------------------
/lib/network/cache.dart:
--------------------------------------------------------------------------------
1 | class Cache {
2 | static final Map> _cache = {};
3 |
4 | static void add(String key, Map map) {
5 | _cache[key] = map;
6 | }
7 |
8 | static Map? get(String key) {
9 | return _cache[key];
10 | }
11 |
12 | static void clear() {
13 | _cache.clear();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/lib/router/aware_page_wrapper.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | typedef RouteAwarePageBuilder =
4 | Widget Function(BuildContext context, bool completed);
5 |
6 | class RouteAwarePageWrapper extends StatefulWidget {
7 | final RouteAwarePageBuilder builder;
8 | final bool shouldRebuildOnCompleted;
9 |
10 | const RouteAwarePageWrapper({
11 | super.key,
12 | required this.builder,
13 | this.shouldRebuildOnCompleted = true,
14 | });
15 |
16 | @override
17 | State createState() => _RouteAwarePageWrapperState();
18 | }
19 |
20 | class _RouteAwarePageWrapperState extends State {
21 | late bool _completed;
22 | Animation? _routeAnimation;
23 |
24 | @override
25 | void initState() {
26 | super.initState();
27 | _completed = false;
28 | WidgetsBinding.instance.addPostFrameCallback((_) => _setupRouteListener());
29 | }
30 |
31 | void _setupRouteListener() {
32 | final route = ModalRoute.of(context);
33 | if (route != null) {
34 | _routeAnimation = route.animation;
35 | // 检查初始状态
36 | if (_routeAnimation?.status == AnimationStatus.completed) {
37 | _markCompleted();
38 | } else {
39 | _routeAnimation?.addStatusListener(_handleRouteAnimationStatus);
40 | }
41 | }
42 | }
43 |
44 | void _handleRouteAnimationStatus(AnimationStatus status) {
45 | if (status == AnimationStatus.completed) {
46 | _markCompleted();
47 | _routeAnimation?.removeStatusListener(_handleRouteAnimationStatus);
48 | }
49 | }
50 |
51 | void _markCompleted() {
52 | if (!_completed && widget.shouldRebuildOnCompleted) {
53 | setState(() => _completed = true);
54 | } else {
55 | _completed = true;
56 | }
57 | }
58 |
59 | @override
60 | void dispose() {
61 | _routeAnimation?.removeStatusListener(_handleRouteAnimationStatus);
62 | super.dispose();
63 | }
64 |
65 | @override
66 | Widget build(BuildContext context) {
67 | return widget.builder(context, _completed);
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/lib/startup_prepare.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/foundation.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:haka_comic/config/app_config.dart';
4 | import 'package:haka_comic/config/setup_config.dart';
5 | import 'package:haka_comic/database/history_helper.dart';
6 | import 'package:haka_comic/database/images_helper.dart';
7 | import 'package:haka_comic/database/read_record_helper.dart';
8 | import 'package:haka_comic/database/tag_block_helper.dart';
9 | import 'package:haka_comic/database/word_block_helper.dart';
10 | import 'package:haka_comic/utils/common.dart';
11 | import 'package:haka_comic/utils/download_manager.dart';
12 | import 'package:window_manager/window_manager.dart';
13 |
14 | class StartupPrepare {
15 | /// 初始化
16 | static Future> prepare() async {
17 | await Future.wait([AppConf.initialize(), SetupConf.initialize()]);
18 | return Future.wait([
19 | HistoryHelper().initialize(),
20 | ImagesHelper.initialize(),
21 | ReadRecordHelper().initialize(),
22 | DownloadManager.initialize(),
23 | TagBlockHelper().initialize(),
24 | WordBlockHelper().initialize(),
25 | startDesktop(),
26 | ]);
27 | }
28 | }
29 |
30 | Future startDesktop() async {
31 | if (isDesktop && kReleaseMode) {
32 | await windowManager.ensureInitialized();
33 | WindowOptions windowOptions = const WindowOptions(
34 | size: Size(900, 620),
35 | center: true,
36 | backgroundColor: Colors.transparent,
37 | skipTaskbar: false,
38 | titleBarStyle: TitleBarStyle.normal,
39 | );
40 | windowManager.waitUntilReadyToShow(windowOptions, () async {
41 | await windowManager.setMinimumSize(const Size(750, 550));
42 | await windowManager.setResizable(true);
43 | await windowManager.show();
44 | await windowManager.focus();
45 | });
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/lib/utils/loader.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:go_router/go_router.dart';
3 | import 'package:haka_comic/utils/extension.dart';
4 |
5 | class Loader {
6 | static bool isShowing = false;
7 |
8 | static void show(BuildContext context) {
9 | if (isShowing) return;
10 | isShowing = true;
11 | showDialog(
12 | context: context,
13 | barrierDismissible: false,
14 | builder: (context) {
15 | return Center(
16 | child: Container(
17 | width: 70,
18 | height: 70,
19 | decoration: BoxDecoration(
20 | color: context.colorScheme.surfaceContainerLowest,
21 | borderRadius: BorderRadius.circular(10),
22 | ),
23 | child: const Center(child: CircularProgressIndicator()),
24 | ),
25 | );
26 | },
27 | );
28 | }
29 |
30 | static void hide(BuildContext context) {
31 | if (context.canPop() && isShowing) {
32 | isShowing = false;
33 | context.pop();
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/lib/utils/log.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/foundation.dart';
2 |
3 | extension FirstWhereOrNull on List {
4 | T? firstWhereOrNull(bool Function(T) predicate) {
5 | for (final element in this) {
6 | if (predicate(element)) return element;
7 | }
8 | return null;
9 | }
10 | }
11 |
12 | enum LogLevel { error, warning, info }
13 |
14 | class LogItem {
15 | final LogLevel level;
16 | final String title;
17 | final String content;
18 | final DateTime time = DateTime.now();
19 |
20 | LogItem(this.level, this.title, this.content);
21 |
22 | @override
23 | String toString() => "${level.name} $title $time \n$content\n\n";
24 | }
25 |
26 | class Log {
27 | static final List _items = [];
28 |
29 | static List get items => _items;
30 |
31 | static const int maxItemLength = 3000;
32 |
33 | static const int maxItemsNumber = 500;
34 |
35 | static void printWarning(String text) {
36 | debugPrint('⚠️ WARNING: $text');
37 | }
38 |
39 | static void printError(String text) {
40 | debugPrint('⛔ ERROR: $text');
41 | }
42 |
43 | static void printInfo(String text) {
44 | debugPrint('ℹ️ INFO: $text');
45 | }
46 |
47 | static void add(LogLevel level, String title, String content) {
48 | if (content.length > maxItemLength) {
49 | content = "${content.substring(0, maxItemLength)}...";
50 | }
51 |
52 | switch (level) {
53 | case LogLevel.error:
54 | printError(content);
55 | break;
56 | case LogLevel.warning:
57 | printWarning(content);
58 | break;
59 | case LogLevel.info:
60 | printInfo(content);
61 | }
62 |
63 | var item = LogItem(level, title, content);
64 |
65 | if (item == _items.lastOrNull) {
66 | return;
67 | }
68 |
69 | _items.add(item);
70 |
71 | if (_items.length > maxItemsNumber) {
72 | var res = _items.remove(
73 | _items.firstWhereOrNull((element) => element.level == LogLevel.info),
74 | );
75 | if (!res) {
76 | _items.removeAt(0);
77 | }
78 | }
79 | }
80 |
81 | static info(String title, String content) {
82 | add(LogLevel.info, title, content);
83 | }
84 |
85 | static warning(String title, String content) {
86 | add(LogLevel.warning, title, content);
87 | }
88 |
89 | static error(String title, Object content, [Object? stackTrace]) {
90 | var info = content.toString();
91 | if (stackTrace != null) {
92 | info += "\n${stackTrace.toString()}";
93 | }
94 | add(LogLevel.error, title, info);
95 | }
96 |
97 | static void clear() => _items.clear();
98 |
99 | @override
100 | String toString() {
101 | var res = "Logs\n\n";
102 | for (var log in _items) {
103 | res += log.toString();
104 | }
105 | return res;
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/lib/utils/shared_preferences_util.dart:
--------------------------------------------------------------------------------
1 | import 'package:shared_preferences/shared_preferences.dart';
2 |
3 | class SharedPreferencesUtil {
4 | static late SharedPreferences prefs;
5 |
6 | static Future init() async {
7 | prefs = await SharedPreferences.getInstance();
8 | return prefs;
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/lib/utils/ui.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:haka_comic/utils/extension.dart';
3 |
4 | enum UiModes {
5 | /// The screen have a short width. Usually the device is phone.
6 | m1,
7 |
8 | /// The screen's width is medium size. Usually the device is tablet.
9 | m2,
10 |
11 | /// The screen's width is long. Usually the device is PC.
12 | m3,
13 | }
14 |
15 | UiModes getMode(BuildContext context) {
16 | final width = context.width;
17 | if (width <= 600) {
18 | return UiModes.m1;
19 | } else if (width > 600 && width <= 950) {
20 | return UiModes.m2;
21 | } else {
22 | return UiModes.m3;
23 | }
24 | }
25 |
26 | class UiMode {
27 | static bool m1(BuildContext context) {
28 | return getMode(context) == UiModes.m1;
29 | }
30 |
31 | static bool m2(BuildContext context) {
32 | return getMode(context) == UiModes.m2;
33 | }
34 |
35 | static bool m3(BuildContext context) {
36 | return getMode(context) == UiModes.m3;
37 | }
38 |
39 | static bool notM1(BuildContext context) {
40 | return !m1(context);
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/lib/utils/version.dart:
--------------------------------------------------------------------------------
1 | class Version implements Comparable {
2 | final int major;
3 | final int minor;
4 | final int patch;
5 | final List