diff --git a/.flutter b/.flutter index ad70ec46..4cf24164 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit ad70ec4617166f1c38e5d2bfd388af71fda14f06 +Subproject commit 4cf24164269a5ebf0c16a028a00727d0e77bbb05 diff --git a/.github/workflows/release_for_android.yaml b/.github/workflows/release_for_android.yaml index 8bc30d90..59345480 100644 --- a/.github/workflows/release_for_android.yaml +++ b/.github/workflows/release_for_android.yaml @@ -32,7 +32,9 @@ jobs: .flutter/bin/flutter pub get - name: Remove build id - run: sed -i -e 's/-Wl,/-Wl,--build-id=none,/' ~/.pub-cache/hosted/pub.dev/jni-*/src/CMakeLists.txt + run: | + sed -i -e 's/-Wl,/-Wl,--build-id=none,/' ~/.pub-cache/hosted/pub.dev/jni-*/src/CMakeLists.txt + sed -i -e 's/-Wl,/-Wl,--build-id=none,/' ~/.pub-cache/hosted/pub.dev/flutter_zxing-*/src/CMakeLists.txt - name: Signing APK run: | diff --git a/.gitignore b/.gitignore index c28a181a..8ea0f0c0 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,5 @@ app.*.map.json /Ruisi-* *.csv docs/superpowers/plans/2026-07-26-aircon-meter-logger.md +# Widget Preview related +.widget_preview/ diff --git a/CONTRIBUTING.MD b/CONTRIBUTING.MD new file mode 100644 index 00000000..74f48464 --- /dev/null +++ b/CONTRIBUTING.MD @@ -0,0 +1,10 @@ +# XDYou贡献指南 + +> 最近一次编辑:BenderBlog Rodriguez 2026-08-10 +> 摘自:https://xdyou.superbart.top/docs/dev + +1. 光修改README.MD、写简单文档的不计入贡献者名单。这类 PR 自本公告发布之日起不再接收。**不要用我的项目刷你们的课程实践报告!** +2. 鼓励使用AI修改,添加新功能等。如果碰到小问题,也许就是你贡献的机会。但是**严禁使用AI生成PR介绍和文档**,并且做好大规模手工修改和学习新东西的准备。 +3. 涉及黑产、恶俗/善雅、法律灰色地带、违反校规校纪、对大多数同学没有好处而仅对部分人有好处的PR概不接收。我也将尽可能地为学校数据安全贡献一份力,所以搞这些东西的不要让我知道。 +4. 任何贡献,只要能跑起来我就收,后续继续适配问题我来干。我同时很乐意教你们写代码。 +5. 贡献成功后,如果我在校外,我会给你们通过邮政挂号方式送感谢信。如果您担心隐私问题,请提前说明。 \ No newline at end of file diff --git a/README.md b/README.md index ebd71ae8..ddd04c4c 100644 --- a/README.md +++ b/README.md @@ -59,11 +59,12 @@ XDYou,代码名称为 Traintime PDA,是为西电学生设计的开源信息 ## 编译环境 ```bash -(base) superbart@Mac traintime_pda % flutter --version -Flutter 3.44.0 • channel stable • https://github.com/flutter/flutter.git -Framework • revision 559ffa3f75 (2 周前) • 2026-05-15 14:13:13 -0700 -Engine • hash fcf463a2242790d1fdcd9d044f533080f5022e18 (revision 4c525dac5e) (16 days ago) • 2026-05-15 19:00:04.000Z -Tools • Dart 3.12.0 • DevTools 2.57.0 +Flutter 3.47.0 • channel stable • +https://github.com/flutter/flutter.git +Framework • revision 4cf2416426 (6 天前) • 2026-08-11 11:53:49 -0700 +Engine • hash 59d54a2b2896a6bbf356c94b7fac7b9e235bdacd (revision +5f77625673) (6 days ago) • 2026-08-11 16:38:36.000Z +Tools • Dart 3.13.0 • DevTools 2.60.0 ``` ## 授权信息 diff --git a/analysis_options.yaml b/analysis_options.yaml index ae08714c..f78ea2dc 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -7,6 +7,15 @@ # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. +analyzer: + exclude: + - build/** + - android/** + - ios/** + - web/** + - windows/** + - macos/** + - linux/** include: package:flutter_lints/flutter.yaml linter: diff --git a/android/app/build.gradle b/android/app/build.gradle index 26e8def3..52e75d29 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -36,7 +36,7 @@ kotlin { } android { - compileSdk = 36 + compileSdk = 37 ndkVersion = "28.2.13676358" // For compose glance diff --git a/android/build.gradle b/android/build.gradle index 2865aca3..f56a7333 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -10,32 +10,9 @@ allprojects { } } -// https://github.com/flutter/flutter/issues/153281#issuecomment-2292201697 -rootProject.buildDir = '../build' subprojects { - // TODO: Remove this once https://github.com/ABausG/home_widget/issues/417 - // is closed and the fix is available in a stable home_widget release. - // home_widget declares "androidx.glance:glance-appwidget:1.+" which resolves - // to pre-release Glance versions requiring AGP 9+. Force all Glance - // artifacts to the stable 1.1.1 release across every subproject. - afterEvaluate { project -> - project.configurations.all { config -> - config.resolutionStrategy.eachDependency { details -> - if (details.requested.group == 'androidx.glance') { - details.useVersion '1.1.1' - details.because 'Lock Glance to 1.1.1 to avoid alpha breakage from home_widget 1.+ range' - } - } - } - // Fix: camera_android_camerax -> camera-core 1.5.3 needs concurrent-futures - project.dependencies { - implementation 'androidx.concurrent:concurrent-futures:1.1.0' - } - } - - project.buildDir = "${rootProject.buildDir}/${project.name}" project.evaluationDependsOn(":app") } tasks.register("clean", Delete) { - delete rootProject.buildDir -} \ No newline at end of file + delete rootProject.layout.buildDirectory +} diff --git a/android/gradle/gradle-daemon-jvm.properties b/android/gradle/gradle-daemon-jvm.properties new file mode 100644 index 00000000..6c1139ec --- /dev/null +++ b/android/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,12 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/73bcfb608d1fde9fb62e462f834a3299/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/846ee0d876d26a26f37aa1ce8de73224/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9482ddec596298c84656d31d16652665/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/39701d92e1756bb2f141eb67cd4c660e/redirect +toolchainVersion=21 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index fc93bf37..bb780d6f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Apr 16 09:43:18 CST 2026 +#Tue Aug 18 11:37:34 CST 2026 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/settings.gradle b/android/settings.gradle index e2c539c2..bacd0539 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -19,9 +19,16 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "com.android.application" version '9.2.1' apply false - id "org.jetbrains.kotlin.android" version "2.2.20" apply false + id "org.jetbrains.kotlin.android" version "2.3.20" apply false } -include ":app" +def sharedBuildDir = file("../build").canonicalFile +gradle.beforeProject { project -> + def projectBuildDir = project == project.rootProject + ? sharedBuildDir + : new File(sharedBuildDir, project.name) + project.layout.buildDirectory.set(projectBuildDir) +} +include ":app" diff --git a/assets/flutter_i18n/en_US.yaml b/assets/flutter_i18n/en_US.yaml index d855abf0..875c473c 100644 --- a/assets/flutter_i18n/en_US.yaml +++ b/assets/flutter_i18n/en_US.yaml @@ -693,6 +693,7 @@ library: publish_year_end: Publish year to book_detail: Book details no_result: No result, change parameter or start your search + no_more_data: No more data library_card: title: Library status fetching: Fetching diff --git a/assets/flutter_i18n/zh_CN.yaml b/assets/flutter_i18n/zh_CN.yaml index 870ee892..8df75689 100644 --- a/assets/flutter_i18n/zh_CN.yaml +++ b/assets/flutter_i18n/zh_CN.yaml @@ -623,6 +623,7 @@ library: publish_year_end: 出版年止 book_detail: 书籍详细信息 no_result: 没有结果,请修改搜索参数或者开始你的搜索 + no_more_data: 没有更多结果了 library_card: title: 图书馆当前状况 fetching: 正在获取图书馆信息 diff --git a/assets/flutter_i18n/zh_TW.yaml b/assets/flutter_i18n/zh_TW.yaml index 522396f7..360337e4 100644 --- a/assets/flutter_i18n/zh_TW.yaml +++ b/assets/flutter_i18n/zh_TW.yaml @@ -621,6 +621,7 @@ library: publish_year_end: 出版年止 book_detail: 書籍詳細信息 no_result: 沒有結果,請修改搜索參數或者開始你的搜索 + no_more_data: 沒有更多結果了 library_card: title: 圖書館當前狀況 fetching: 正在獲取圖書館信息 diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index ec97fc6f..592ceee8 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index c4855bfe..592ceee8 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile deleted file mode 100644 index fafd6740..00000000 --- a/ios/Podfile +++ /dev/null @@ -1,54 +0,0 @@ -# Uncomment this line to define a global platform for your project -platform :ios, '13.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - - if target.name == 'permission_handler_apple' - target.build_configurations.each do |config| - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ - '$(inherited)', - 'PERMISSION_LOCATION=0', - ] - end - end - end -end diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index 1d0cc8b1..00000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,22 +0,0 @@ -PODS: - - Flutter (1.0.0) - - flutter_mailer (0.0.1): - - Flutter - -DEPENDENCIES: - - Flutter (from `Flutter`) - - flutter_mailer (from `.symlinks/plugins/flutter_mailer/ios`) - -EXTERNAL SOURCES: - Flutter: - :path: Flutter - flutter_mailer: - :path: ".symlinks/plugins/flutter_mailer/ios" - -SPEC CHECKSUMS: - Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - flutter_mailer: 3a8cd4f36c960fb04528d5471097270c19fec1c4 - -PODFILE CHECKSUM: 33ee58e3b6ad46b815d23ed7bf392f2a93d23dc3 - -COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 500ed8b1..4e9119cb 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 22F13ACD6516E421A8912721 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 19A4412B4460039531A4DDBE /* Pods_Runner.framework */; }; 262B016C2B58FED30094B372 /* SaveToGroupID.g.swift in Sources */ = {isa = PBXBuildFile; fileRef = 262B016B2B58FED30094B372 /* SaveToGroupID.g.swift */; }; 262B01702B5905FA0094B372 /* ApiImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 262B016F2B5905FA0094B372 /* ApiImplementation.swift */; }; 262B01722B5931740094B372 /* ExamModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 262B01712B5931740094B372 /* ExamModule.swift */; }; @@ -35,7 +34,6 @@ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - FA8AF369ED4978041E518B36 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D245FC4ADA0FCAFBD569A11 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -82,7 +80,6 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 19A4412B4460039531A4DDBE /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 262B016B2B58FED30094B372 /* SaveToGroupID.g.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SaveToGroupID.g.swift; sourceTree = ""; }; 262B016F2B5905FA0094B372 /* ApiImplementation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiImplementation.swift; sourceTree = ""; }; 262B01712B5931740094B372 /* ExamModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExamModule.swift; sourceTree = ""; }; @@ -108,18 +105,13 @@ 26D4C13C2D6075DB008FEE1D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Main.strings; sourceTree = ""; }; 26E67DD42B9222FD00B2BD5D /* IsTomorrowIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsTomorrowIntent.swift; sourceTree = ""; }; 26F000012E33A00100CC2026 /* CustomClassModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomClassModel.swift; sourceTree = ""; }; - 2C6385329A3FB85873E02BCE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 36ECC3CA634EBF73C79AAD97 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3FF95F69E40FD50A4617E6FB /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7675431F5A0AA2D354602038 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7D245FC4ADA0FCAFBD569A11 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -127,8 +119,6 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B3B0B2380ADA394C1804262A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - B8A7F8FC2F7D169D4772F1C5 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -145,7 +135,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FA8AF369ED4978041E518B36 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -154,7 +143,6 @@ buildActionMask = 2147483647; files = ( 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, - 22F13ACD6516E421A8912721 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -209,7 +197,6 @@ 26947AA62B49B50B006B2B17 /* ClasstableWidget */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - C9C6CBC03B7F1A33197D45B4 /* Pods */, D9D5E272809C25B343F9B947 /* Frameworks */, ); sourceTree = ""; @@ -242,26 +229,11 @@ path = Runner; sourceTree = ""; }; - C9C6CBC03B7F1A33197D45B4 /* Pods */ = { - isa = PBXGroup; - children = ( - 7675431F5A0AA2D354602038 /* Pods-Runner.debug.xcconfig */, - B8A7F8FC2F7D169D4772F1C5 /* Pods-Runner.release.xcconfig */, - 2C6385329A3FB85873E02BCE /* Pods-Runner.profile.xcconfig */, - 36ECC3CA634EBF73C79AAD97 /* Pods-RunnerTests.debug.xcconfig */, - 3FF95F69E40FD50A4617E6FB /* Pods-RunnerTests.release.xcconfig */, - B3B0B2380ADA394C1804262A /* Pods-RunnerTests.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; D9D5E272809C25B343F9B947 /* Frameworks */ = { isa = PBXGroup; children = ( 26947AA22B49B50B006B2B17 /* WidgetKit.framework */, 26947AA42B49B50B006B2B17 /* SwiftUI.framework */, - 19A4412B4460039531A4DDBE /* Pods_Runner.framework */, - 7D245FC4ADA0FCAFBD569A11 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -290,7 +262,6 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 18EA671BAC97AA7AFB1DFF1B /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, 76CA262462E56809870ECFF9 /* Frameworks */, @@ -309,7 +280,6 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - DFC74E092C814F6235E2DEE9 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -317,7 +287,6 @@ 26947AB52B49B50C006B2B17 /* Embed Foundation Extensions */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 0CED640916642A3F556DCD39 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -412,45 +381,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 0CED640916642A3F556DCD39 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 18EA671BAC97AA7AFB1DFF1B /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -482,28 +412,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - DFC74E092C814F6235E2DEE9 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -790,7 +698,6 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 36ECC3CA634EBF73C79AAD97 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -808,7 +715,6 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3FF95F69E40FD50A4617E6FB /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -824,7 +730,6 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B3B0B2380ADA394C1804262A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 21a3cc14..1d526a16 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,7 +4,4 @@ - - diff --git a/lib/external/ruisi_flutter/lib/pages/new_post_page.dart b/lib/external/ruisi_flutter/lib/pages/new_post_page.dart index fe10ac16..f6c43f86 100644 --- a/lib/external/ruisi_flutter/lib/pages/new_post_page.dart +++ b/lib/external/ruisi_flutter/lib/pages/new_post_page.dart @@ -92,9 +92,9 @@ class _NewPostPageState extends State { if (file == null) return; if (!mounted) return; - final ext = file.extension?.toLowerCase(); + final ext = file.name.toLowerCase(); const allowed = {'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'}; - if (ext == null || !allowed.contains(ext)) { + if (!allowed.contains(ext)) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('仅支持 jpg/jpeg/png/gif/bmp/webp 图片')), ); @@ -187,7 +187,7 @@ class _NewPostPageState extends State { final forums = state.groups.expand((g) => g.forums).toList(); return DropdownButtonFormField( - value: + initialValue: _selectedFid, // 注意:Flutter 新版本推荐使用 value 代替 initialValue decoration: InputDecoration( labelText: FlutterI18n.translate( diff --git a/lib/external/ruisi_flutter/lib/pages/topic_detail_page.dart b/lib/external/ruisi_flutter/lib/pages/topic_detail_page.dart index 64473a0d..e248657b 100644 --- a/lib/external/ruisi_flutter/lib/pages/topic_detail_page.dart +++ b/lib/external/ruisi_flutter/lib/pages/topic_detail_page.dart @@ -152,9 +152,9 @@ class _TopicDetailPageState extends State { if (file == null) return; if (!mounted) return; - final ext = file.extension?.toLowerCase(); + final ext = file.name.toLowerCase(); const allowed = {'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'}; - if (ext == null || !allowed.contains(ext)) { + if (!allowed.contains(ext)) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('仅支持 jpg/jpeg/png/gif/bmp/webp 图片')), ); diff --git a/lib/page/classtable/class_page/content_classtable_page.dart b/lib/page/classtable/class_page/content_classtable_page.dart index 821de0fd..b69dc0a1 100644 --- a/lib/page/classtable/class_page/content_classtable_page.dart +++ b/lib/page/classtable/class_page/content_classtable_page.dart @@ -801,7 +801,8 @@ class _ContentClassTablePageState extends State { bytes: Uint8List.fromList( utf8.encode(classTableState.iCalenderStr), ), - lockParentWindow: true, + windowsOptions: WindowsOptions(lockParentWindow: true), + linuxOptions: LinuxOptions(lockParentWindow: true), ); // } else { // String tempPath = await getTemporaryDirectory().then( diff --git a/lib/page/library/book_cover.dart b/lib/page/library/book_cover.dart new file mode 100644 index 00000000..2b8c4b62 --- /dev/null +++ b/lib/page/library/book_cover.dart @@ -0,0 +1,103 @@ +// Copyright 2026 Traintime PDA Authours, originally by BenderBlog Rodriguez. +// SPDX-License-Identifier: MPL-2.0 + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:watermeter/controller/library_controller.dart'; +import 'package:watermeter/repository/logger.dart'; + +class BookCover extends StatefulWidget { + final String bookName; + final String? isbn; + final int docNumber; + final String? knownImageUrl; + final double width; + + const BookCover({ + super.key, + required this.bookName, + this.isbn, + required this.docNumber, + this.knownImageUrl, + this.width = 176 * 0.6, + }); + + @override + State createState() => _BookCoverState(); +} + +class _BookCoverState extends State { + late Future _coverFuture; + String? _imageUrl; + + @override + void initState() { + super.initState(); + _coverFuture = _loadCover(); + _imageUrl = widget.knownImageUrl; + } + + @override + void didUpdateWidget(covariant BookCover oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.bookName != widget.bookName || + oldWidget.isbn != widget.isbn || + oldWidget.docNumber != widget.docNumber) { + _coverFuture = _loadCover(); + } + } + + Future _loadCover() { + final imageUrl = _imageUrl; + if (imageUrl != null && imageUrl.isNotEmpty) { + return Future.value(imageUrl); + } + return LibraryController.i.session.bookCover( + widget.bookName, + widget.isbn ?? "", + widget.docNumber, + ); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _coverFuture, + builder: (context, snapshot) { + final url = snapshot.data ?? ""; + if (url.isEmpty) { + return _emptyCover(); + } + _imageUrl = url; + return _networkCover(url); + }, + ); + } + + Widget _networkCover(String url) { + return CachedNetworkImage( + imageUrl: url, + placeholder: (context, url) => _emptyCover(), + errorWidget: (context, url, error) => _emptyCover(), + width: widget.width, + fit: BoxFit.fill, + alignment: Alignment.center, + errorListener: (e) { + if (e is DioException) { + log.info('Error with Internet error...'); + } else { + log.info('Image Exception is: ${e.runtimeType}'); + } + }, + ); + } + + Widget _emptyCover() { + return Image.asset( + "assets/art/pda_empty_cover.jpg", + width: widget.width, + fit: BoxFit.fill, + ); + } +} diff --git a/lib/page/library/book_detail_card.dart b/lib/page/library/book_detail_card.dart index e13ae8d1..b155d149 100644 --- a/lib/page/library/book_detail_card.dart +++ b/lib/page/library/book_detail_card.dart @@ -7,7 +7,7 @@ import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:watermeter/controller/library_controller.dart'; import 'package:watermeter/model/xidian_ids/library.dart'; -import 'package:watermeter/page/library/book_info_card.dart'; +import 'package:watermeter/page/library/book_cover.dart'; import 'package:watermeter/page/library/book_place_card.dart'; import 'package:watermeter/page/library/ebook_place_card.dart'; @@ -32,7 +32,12 @@ class _BookDetailCardState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - BookCover(toUse: widget.toUse) + BookCover( + key: ValueKey(widget.toUse.docNumber), + bookName: widget.toUse.bookName, + docNumber: widget.toUse.docNumber, + isbn: widget.toUse.isbn, + ) .clipRRect(all: 14) .padding(all: 2) .decorated( diff --git a/lib/page/library/book_info_card.dart b/lib/page/library/book_info_card.dart index ddc1aeb6..dea9c6cd 100644 --- a/lib/page/library/book_info_card.dart +++ b/lib/page/library/book_info_card.dart @@ -4,14 +4,11 @@ // Library info card. -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:styled_widget/styled_widget.dart'; -import 'package:watermeter/controller/library_controller.dart'; import 'package:watermeter/model/xidian_ids/library.dart'; -import 'package:watermeter/repository/logger.dart'; +import 'package:watermeter/page/library/book_cover.dart'; class BookInfoCard extends StatelessWidget { final BookInfo toUse; @@ -27,7 +24,9 @@ class BookInfoCard extends StatelessWidget { return [ BookCover( key: ValueKey(toUse.docNumber), - toUse: toUse, + bookName: toUse.bookName, + docNumber: toUse.docNumber, + isbn: toUse.isbn, width: constraints.maxWidth - 16, ).clipRRect(all: 6), const SizedBox(height: 8), @@ -172,87 +171,3 @@ class BookInfoCard extends StatelessWidget { ].toColumn().padding(all: 12).card(elevation: 0); } } - -class BookCover extends StatefulWidget { - final BookInfo toUse; - final double width; - - const BookCover({super.key, required this.toUse, this.width = 176 * 0.6}); - - @override - State createState() => _BookCoverState(); -} - -class _BookCoverState extends State { - late Future _coverFuture; - - @override - void initState() { - super.initState(); - _coverFuture = _loadCover(); - } - - @override - void didUpdateWidget(covariant BookCover oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.toUse.docNumber != widget.toUse.docNumber || - oldWidget.toUse.bookName != widget.toUse.bookName || - oldWidget.toUse.isbn != widget.toUse.isbn || - oldWidget.toUse.imageUrl != widget.toUse.imageUrl) { - _coverFuture = _loadCover(); - } - } - - Future _loadCover() { - final imageUrl = widget.toUse.imageUrl; - if (imageUrl != null && imageUrl.isNotEmpty) { - return Future.value(imageUrl); - } - return LibraryController.i.session.bookCover( - widget.toUse.bookName, - widget.toUse.isbn ?? "", - widget.toUse.docNumber, - ); - } - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: _coverFuture, - builder: (context, snapshot) { - final url = snapshot.data ?? ""; - if (url.isEmpty) { - return _emptyCover(); - } - widget.toUse.imageUrl = url; - return _networkCover(url); - }, - ); - } - - Widget _networkCover(String url) { - return CachedNetworkImage( - imageUrl: url, - placeholder: (context, url) => _emptyCover(), - errorWidget: (context, url, error) => _emptyCover(), - width: widget.width, - fit: BoxFit.fill, - alignment: Alignment.center, - errorListener: (e) { - if (e is DioException) { - log.info('Error with Internet error...'); - } else { - log.info('Image Exception is: ${e.runtimeType}'); - } - }, - ); - } - - Widget _emptyCover() { - return Image.asset( - "assets/art/pda_empty_cover.jpg", - width: widget.width, - fit: BoxFit.fill, - ); - } -} diff --git a/lib/page/library/borrow_info_card.dart b/lib/page/library/borrow_info_card.dart index 7ab31acf..3e018940 100644 --- a/lib/page/library/borrow_info_card.dart +++ b/lib/page/library/borrow_info_card.dart @@ -4,221 +4,168 @@ // Library borrow card. -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:intl/intl.dart'; import 'package:watermeter/controller/library_controller.dart'; +import 'package:watermeter/page/library/book_cover.dart'; import 'package:watermeter/page/public_widget/toast.dart'; import 'package:sn_progress_dialog/progress_dialog.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:watermeter/model/xidian_ids/library.dart'; -import 'package:watermeter/repository/logger.dart'; class BorrowInfoCard extends StatelessWidget { final BorrowData toUse; - const BorrowInfoCard({super.key, required this.toUse}); + final BoxConstraints constraints; + + const BorrowInfoCard({ + super.key, + required this.toUse, + required this.constraints, + }); @override Widget build(BuildContext context) { return [ - CachedNetworkImage( - imageUrl: toUse.imageUrl ?? "", - placeholder: (context, url) => Image.asset( - "assets/art/pda_empty_cover.jpg", - width: 176 * 0.5, - height: 250 * 0.5, - fit: BoxFit.fitHeight, + BookCover( + key: ValueKey(toUse.loanId), + bookName: toUse.title, + docNumber: toUse.recordId, + isbn: toUse.isbn, + width: constraints.maxWidth - 16, + ).clipRRect(all: 6), + Text( + toUse.title, + maxLines: 2, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.start, + style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600), + ).padding(vertical: 8), + [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: DateFormat("yyyy/M/dd").format(toUse.loanDateTime), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + TextSpan( + text: FlutterI18n.translate(context, "library.borrow_str"), + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + color: Colors.blueGrey, + ), + ), + ], + ), ), - errorWidget: (context, url, error) => Image.asset( - "assets/art/pda_empty_cover.jpg", - width: 176 * 0.5, - height: 250 * 0.5, - fit: BoxFit.fitHeight, + SizedBox( + width: 26, + height: 16, + child: List.generate( + 150 ~/ 10, + (index) => Expanded( + child: Container( + color: index % 2 == 0 ? Colors.transparent : Colors.grey, + height: 2, + ), + ), + ).toRow(), + ).padding(horizontal: 8), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: DateFormat("yyyy/M/dd").format(toUse.normReturnDateTime), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + TextSpan( + text: FlutterI18n.translate(context, "library.due_date"), + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + color: Colors.blueGrey, + ), + ), + ], + ), ), - width: 176 * 0.5, - height: 250 * 0.5, - fit: BoxFit.fitHeight, - alignment: Alignment.center, - errorListener: (e) { - if (e is DioException) { - log.info('Error with Internet error...'); - } else { - log.info('Image Exception is: ${e.runtimeType}'); + ].toColumn(mainAxisAlignment: MainAxisAlignment.spaceBetween), + const SizedBox(height: 12), + Builder( + builder: (context) { + bool isOverdue = false; + if (toUse.lendDay < 0) { + isOverdue = true; } - }, - ).clipRRect(all: 14), - const VerticalDivider(), - [ - Text( - toUse.title, - maxLines: 2, - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.start, - style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600), - ).padding(top: 10), - const SizedBox(height: 12), - [ - Text.rich( + final text = Text.rich( + TextSpan( + children: [ TextSpan( - children: [ - TextSpan( - children: [ - TextSpan( - text: "${toUse.loanDateTime.year}\n", - style: const TextStyle( - fontSize: 10, - fontWeight: FontWeight.w600, - color: Colors.blueGrey, - ), - ), - TextSpan( - text: DateFormat("M/dd").format(toUse.loanDateTime), - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - ], - ), - TextSpan( - text: FlutterI18n.translate( - context, - "library.borrow_str", - ), - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.w600, - color: Colors.blueGrey, - ), - ), - ], - ), - ), - SizedBox( - width: 26, - height: 16, - child: List.generate( - 150 ~/ 10, - (index) => Expanded( - child: Container( - color: index % 2 == 0 ? Colors.transparent : Colors.grey, - height: 2, - ), + text: toUse.lendDay.abs().toString(), + style: TextStyle( + fontSize: 24, + color: toUse.lendDay < 1 + ? Colors.red + : toUse.lendDay < 3 + ? Colors.yellow + : null, + fontWeight: FontWeight.w600, ), - ).toRow(), - ).padding(horizontal: 8), - Text.rich( - TextSpan( - children: [ - TextSpan( - text: "${toUse.normReturnDateTime.year}\n", - style: const TextStyle( - fontSize: 10, - fontWeight: FontWeight.w600, - color: Colors.blueGrey, - ), - ), - TextSpan( - text: DateFormat("M/dd").format(toUse.normReturnDateTime), - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - TextSpan( - text: FlutterI18n.translate(context, "library.due_date"), - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.w600, - color: Colors.blueGrey, - ), - ), - ], ), - ), - ].toRow(mainAxisAlignment: MainAxisAlignment.spaceBetween), - const SizedBox(height: 12), - Builder( - builder: (context) { - bool isOverdue = false; - if (toUse.lendDay < 0) { - isOverdue = true; - } - final text = Text.rich( - TextSpan( - children: [ - TextSpan( - text: toUse.lendDay.abs().toString(), - style: TextStyle( - fontSize: 24, - color: toUse.lendDay < 1 - ? Colors.red - : toUse.lendDay < 3 - ? Colors.yellow - : null, - fontWeight: FontWeight.w600, - ), - ), - TextSpan( - text: isOverdue - ? FlutterI18n.translate( - context, - "library.after_due_date", - ) - : FlutterI18n.translate( - context, - "library.before_due_date", - ), - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.w600, - color: Colors.blueGrey, + TextSpan( + text: isOverdue + ? FlutterI18n.translate(context, "library.after_due_date") + : FlutterI18n.translate( + context, + "library.before_due_date", ), - ), - ], - ), - ).padding(bottom: 10); - final button = TextButton( - onPressed: () { - if (!isOverdue) { - ProgressDialog pd = ProgressDialog(context: context); - pd.show( - msg: FlutterI18n.translate(context, "library.renewing"), - ); - LibraryController.i.session.renew(toUse).then((value) { - if (context.mounted) { - pd.close(); - showToast(context: context, msg: value); - } - }); - } - }, - child: Text( - isOverdue - ? FlutterI18n.translate( - context, - "library.cannot_be_renewable", - ) - : FlutterI18n.translate( - context, - "library.can_be_renewable", - ), + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + color: Colors.blueGrey, ), + ), + ], + ), + ).padding(bottom: 10); + final button = TextButton( + onPressed: () { + if (!isOverdue) { + ProgressDialog pd = ProgressDialog(context: context); + pd.show( + msg: FlutterI18n.translate(context, "library.renewing"), ); - return [text, button].toRow( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.end, - ); - }, + LibraryController.i.session.renew(toUse).then((value) { + if (context.mounted) { + pd.close(); + showToast(context: context, msg: value); + } + }); + } + }, + child: Text( + isOverdue + ? FlutterI18n.translate( + context, + "library.cannot_be_renewable", + ) + : FlutterI18n.translate(context, "library.can_be_renewable"), ), - ] - .toColumn( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.stretch, - ) - .expanded(), - ].toRow().padding(horizontal: 12, vertical: 4).card(elevation: 0); + ); + return [text, button].toColumn( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + ); + }, + ), + ].toColumn().padding(all: 12).card(elevation: 0); } } diff --git a/lib/page/library/borrow_list_view.dart b/lib/page/library/borrow_list_view.dart index 740e1c83..c90eb7ec 100644 --- a/lib/page/library/borrow_list_view.dart +++ b/lib/page/library/borrow_list_view.dart @@ -1,10 +1,12 @@ // Copyright 2026 Traintime PDA Authours, originally by BenderBlog Rodriguez. // SPDX-License-Identifier: MPL-2.0 +import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; import 'package:watermeter/model/xidian_ids/library.dart'; import 'package:watermeter/page/library/borrow_info_card.dart'; +import 'package:watermeter/page/library/search_book_constant.dart'; import 'package:watermeter/page/public_widget/empty_list_view.dart'; import 'package:watermeter/repository/preference.dart'; @@ -17,32 +19,33 @@ class BorrowListView extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - body: LayoutBuilder( - builder: (context, constraints) { - return Stack( - children: [ - if (borrowList.isEmpty) - EmptyListView( - type: EmptyListViewType.reading, - text: FlutterI18n.translate( - context, - "library.empty_borrow_list", - ), + body: Stack( + children: [ + if (borrowList.isEmpty) + EmptyListView( + type: EmptyListViewType.reading, + text: FlutterI18n.translate(context, "library.empty_borrow_list"), + ), + LayoutBuilder( + builder: (context, constraints) => AlignedGridView.count( + physics: const AlwaysScrollableScrollPhysics(), + itemCount: borrowList.length, + padding: const EdgeInsets.all(4), + crossAxisCount: max( + 1, + constraints.maxWidth ~/ resultCardMaxWidth, + ), + mainAxisSpacing: 4, + crossAxisSpacing: 4, + itemBuilder: (context, index) => LayoutBuilder( + builder: (context, constraints) => BorrowInfoCard( + toUse: borrowList[index], + constraints: constraints, ), - - AlignedGridView.count( - physics: const AlwaysScrollableScrollPhysics(), - itemCount: borrowList.length, - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), - crossAxisCount: constraints.maxWidth ~/ 360, - mainAxisSpacing: 4, - crossAxisSpacing: 4, - itemBuilder: (context, index) => - BorrowInfoCard(toUse: borrowList[index]), ), - ], - ); - }, + ), + ), + ], ), bottomNavigationBar: BottomAppBar( height: prefs.getString(Preference.localization.key) == "en_US" diff --git a/lib/page/library/borrow_list_window.dart b/lib/page/library/borrow_list_window.dart index 76df448d..4ecb3afe 100644 --- a/lib/page/library/borrow_list_window.dart +++ b/lib/page/library/borrow_list_window.dart @@ -32,16 +32,16 @@ class _BorrowListWindowState extends State child: SignalBuilder( builder: (context) => LibraryController.i.libraryBorrowStateSignal.value.map( - data: (list) => BorrowListView(borrowList: list), - loading: () => const CircularProgressIndicator().center(), - refreshing: () => const CircularProgressIndicator().center(), - reloading: () => const CircularProgressIndicator().center(), - error: (err, stack) => ReloadWidget( - errorStatus: err, - stackTrace: stack, - function: LibraryController.i.reloadBorrowList, - ).center(), - ), + data: (list) => BorrowListView(borrowList: list), + loading: () => const CircularProgressIndicator().center(), + refreshing: () => const CircularProgressIndicator().center(), + reloading: () => const CircularProgressIndicator().center(), + error: (err, stack) => ReloadWidget( + errorStatus: err, + stackTrace: stack, + function: LibraryController.i.reloadBorrowList, + ).center(), + ), ), ); } diff --git a/lib/page/library/search_book_constant.dart b/lib/page/library/search_book_constant.dart index d8c626e4..c89a4902 100644 --- a/lib/page/library/search_book_constant.dart +++ b/lib/page/library/search_book_constant.dart @@ -2,4 +2,4 @@ // SPDX-License-Identifier: MPL-2.0 const double searchPanelMaxWidth = 800; -const double resultCardMaxWidth = 180; +const double resultCardMaxWidth = 160; diff --git a/lib/page/library/search_book_window.dart b/lib/page/library/search_book_window.dart index 31fa3c0b..90ad6560 100644 --- a/lib/page/library/search_book_window.dart +++ b/lib/page/library/search_book_window.dart @@ -143,17 +143,16 @@ class _SearchBookWindowState extends State ), ), - // TODO: 致 Codex - // 1. 文字需要国际化 - // 2. 文字大小和图标大小需要修改 - // 3. 图标是不是可以换一个 noMoreItemsIndicatorBuilder: (context) => [ Icon(Icons.sentiment_very_satisfied, size: 24), SizedBox(width: 8), Text( - "没有更多数据了", - style: Theme.of(context).textTheme.bodyLarge, + FlutterI18n.translate( + context, + "library.no_more_data", + ), + style: Theme.of(context).textTheme.bodyMedium, ), ] .toRow(mainAxisAlignment: MainAxisAlignment.center) diff --git a/lib/page/setting/about_page/film_component.dart b/lib/page/setting/about_page/film_component.dart index 4c682876..fc65fc62 100644 --- a/lib/page/setting/about_page/film_component.dart +++ b/lib/page/setting/about_page/film_component.dart @@ -10,7 +10,15 @@ class FilmComponent extends StatelessWidget { static const sidePaddingRatio = 8 / 52; static const sideRadiusRatio = 8 / 36; static const imageVerticalPadding = 4.0; - static const imageRadius = 16.0; + + static List description = [ + "去这种咖啡厅等于给自己找妈?", + "每一个呆唯的背后都有一个当妈的妹妹", + "只能说女孩子之间的感情真好啊", + "看牙医的你", + "但是现实的可能更可爱,萌萌哒哒", + "大学定律:越到期末考试,好玩的事情越多", + ]; const FilmComponent({super.key}); @@ -39,15 +47,15 @@ class FilmComponent extends StatelessWidget { children: List.generate( 6, (i) => Padding( - padding: const EdgeInsets.symmetric( - vertical: imageVerticalPadding, + padding: const EdgeInsets.only( + bottom: imageVerticalPadding, ), - child: ClipRRect( - borderRadius: BorderRadius.circular(imageRadius), - child: Image.asset( + child: FilmFrame( + image: Image.asset( "assets/art/lucky_star_${i + 1}.jpg", fit: BoxFit.fill, ), + text: description[i], ), ), ), @@ -100,3 +108,37 @@ class _FilmPainter extends CustomPainter { return oldDelegate.color != color || oldDelegate.sideWidth != sideWidth; } } + +class FilmFrame extends StatelessWidget { + static const _imageRadius = 16.0; + + final String? text; + final Image image; + const FilmFrame({super.key, required this.image, this.text}); + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: BorderRadius.circular(_imageRadius), + child: Stack( + alignment: AlignmentGeometry.topCenter, + children: [ + image, + + if (text != null) + Container( + color: Theme.of( + context, + ).colorScheme.primary.withValues(alpha: 0.6), + width: double.infinity, + child: Text( + text!, + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + ); + } +} diff --git a/lib/page/setting/groups/classtable_section.dart b/lib/page/setting/groups/classtable_section.dart index 878cc86c..d17e57b2 100644 --- a/lib/page/setting/groups/classtable_section.dart +++ b/lib/page/setting/groups/classtable_section.dart @@ -64,10 +64,7 @@ class _ClasstableSectionState extends State { msg: FlutterI18n.translate(context, "setting.no_background"), ); } else { - /// TODO: Check whether need setState - setState(() { - preference.setBool(preference.Preference.decorated, value); - }); + preference.setBool(preference.Preference.decorated, value); } }, ), @@ -150,17 +147,17 @@ class _ClasstableSectionState extends State { TextButton( onPressed: () async { await CustomClassController.i.clearAll(); - if (mounted) { + if (context.mounted) { setState(() {}); + showToast( + context: context, + msg: FlutterI18n.translate( + context, + "setting.clear_user_class_clear", + ), + ); + Navigator.pop(context); } - showToast( - context: context, - msg: FlutterI18n.translate( - context, - "setting.clear_user_class_clear", - ), - ); - Navigator.pop(context); }, child: Text(FlutterI18n.translate(context, "confirm")), ), diff --git a/lib/repository/ids_session/classtable_session.dart b/lib/repository/ids_session/classtable_session.dart index 74249fce..57db8835 100644 --- a/lib/repository/ids_session/classtable_session.dart +++ b/lib/repository/ids_session/classtable_session.dart @@ -43,7 +43,6 @@ class ClassTableSession extends IDSSession { Future updateCacheAndGroup(ClassTableData data) async { await _schoolClassDataCache.writeAsString(jsonEncode(data.toJson())); - /// TODO: Change ios widgitkit code to parse user defined classtable. if (Platform.isIOS) { final api = SaveToGroupIdSwiftApi(); try { diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 720604a7..b7d87ff5 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,7 +7,7 @@ import Foundation import charset_converter import device_info_plus -import file_picker +import file_picker_darwin import file_selector_macos import flutter_local_notifications import package_info_plus diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index eb223ab6..0436efc6 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -463,7 +463,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -545,7 +545,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -595,7 +595,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/pubspec.lock b/pubspec.lock index 75c3418f..4676a6e1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,26 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "8d7ff3948166b8ec5da0fbb5962000926b8e02f2ed9b3e51d1738905fbd4c98d" + sha256: "9a3386eea899815698dd55995277cf7cb8572ee52b399a6edfb7ae2b50e5fc19" url: "https://pub.dev" source: hosted - version: "93.0.0" + version: "105.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: de7148ed2fcec579b19f122c1800933dfa028f6d9fd38a152b04b1516cec120b + sha256: "62993bed6eadbe9596c5c20d5c167e7bc563c5fe266657a04ddeb93bdb84f4c9" url: "https://pub.dev" source: hosted - version: "10.0.1" + version: "14.1.0" + android_file_picker: + dependency: transitive + description: + name: android_file_picker + sha256: "665a5a57dfca27f91a715d300e4852a784f9f98e503dcff281bec9afb55767be" + url: "https://pub.dev" + source: hosted + version: "1.0.1" ansicolor: dependency: transitive description: @@ -85,34 +93,34 @@ packages: dependency: transitive description: name: build - sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10 + sha256: b94f5da9ed3d081fd4ecc426c260998b5f4f4eb2f6d89b7e5472edef0b2b2a1b url: "https://pub.dev" source: hosted - version: "4.0.6" + version: "4.0.10" build_config: dependency: transitive description: name: build_config - sha256: "4070d2a59f8eec34c97c86ceb44403834899075f66e8a9d59706f8e7834f6f71" + sha256: "94eaf6708fe64408c632ef2689ca3777b112f9421306ccf4f8c84d7c5c9f83f8" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.2" build_daemon: dependency: transitive description: name: build_daemon - sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 + sha256: "79e05eaf15a48d7230b053a4363b8eaac0cc234bbd0134c3229455481f55cbc6" url: "https://pub.dev" source: hosted - version: "4.1.1" + version: "4.1.5" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "1523ce62448ebac2c15a8ba5fbad8acac169788658a7dd2a1c2d9c2a9318b9a6" + sha256: "90363d438bd9f84a4d5bbb83352251f57d2d9d771bc95a44e6a33fe25fa52774" url: "https://pub.dev" source: hosted - version: "2.15.0" + version: "2.16.0" built_collection: dependency: transitive description: @@ -125,10 +133,10 @@ packages: dependency: transitive description: name: built_value - sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" + sha256: "31b24be6615ec7fcf70b3aa5a7469fe35826485e639a16dd7eb83ba30e4cc6a8" url: "https://pub.dev" source: hosted - version: "8.12.6" + version: "8.12.7" cached_network_image: dependency: "direct main" description: @@ -165,50 +173,50 @@ packages: dependency: transitive description: name: camera - sha256: "4142a19a38e388d3bab444227636610ba88982e36dff4552d5191a86f65dc437" + sha256: "558230d6ce6ccea856b32d390db7e7b557adf4d9320aa614481bd3f2f608953f" url: "https://pub.dev" source: hosted - version: "0.11.4" + version: "0.12.0+2" camera_android_camerax: dependency: transitive description: name: camera_android_camerax - sha256: "8516fe308bc341a5067fb1a48edff0ddfa57c0d3cdcc9dbe7ceca3ba119e2577" + sha256: "6d8dd23f8ad52c36ae3da7417a59b3c3faa3d1e1b83c983a04ca8383f001233c" url: "https://pub.dev" source: hosted - version: "0.6.30" + version: "0.7.4+5" camera_avfoundation: dependency: transitive description: name: camera_avfoundation - sha256: "11b4aee2f5e5e038982e152b4a342c749b414aa27857899d20f4323e94cb5f0b" + sha256: "866e9cd8370f8055d005c0413937a52dc1d7a472687f0ee3ce02392955aababa" url: "https://pub.dev" source: hosted - version: "0.9.23+2" + version: "0.10.2" camera_platform_interface: dependency: transitive description: name: camera_platform_interface - sha256: "7ac852d77699acee79f0d438b793feee26721841e50973576419ff5c6d95e9b7" + sha256: "4524ca6eb4176b066864036ad4fe02c3e4863e63b77eadc21a5bf56824f43498" url: "https://pub.dev" source: hosted - version: "2.13.0" + version: "2.13.1" camera_web: dependency: transitive description: name: camera_web - sha256: "1245a480a113437f8d46d19c0fb90cea9db921436d9cf2ba5fb11854a1312693" + sha256: "081441bd2f92b5841aa70ff4d6eddfe34078d97f9d085cc9e0f9d0102f145925" url: "https://pub.dev" source: hosted - version: "0.3.5+4" + version: "0.3.5+5" catcher_2: dependency: "direct main" description: name: catcher_2 - sha256: ac9dd03230fa4058d14d46450335ca3c40564f734d793e52f81053f3cbf95009 + sha256: c0e21edc0fdb2fd91644ec8bb6870db5823ae2a6fed2cc8cf3f3500e5b295d4e url: "https://pub.dev" source: hosted - version: "2.1.9" + version: "2.1.11" characters: dependency: transitive description: @@ -221,10 +229,10 @@ packages: dependency: "direct main" description: name: charset_converter - sha256: af00b5b73b367101c661b8dfaa52abf3e533de7b3e247e3f65c535ebc4df820a + sha256: da90e0a5bc3bea06df12615cac23544db4e7f06fb26bec0c7253229fc291e12e url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.5.1" checked_yaml: dependency: transitive description: @@ -301,10 +309,10 @@ packages: dependency: transitive description: name: cross_file - sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" + sha256: "92c9c43c383bfa1c32079d3bc492d55d6d4318044b7b47edaff8971cbb555c51" url: "https://pub.dev" source: hosted - version: "0.3.5+2" + version: "0.3.5+4" crypto: dependency: "direct main" description: @@ -333,34 +341,34 @@ packages: dependency: transitive description: name: dart_style - sha256: "29f7ecc274a86d32920b1d9cfc7502fa87220da41ec60b55f329559d5732e2b2" + sha256: "3f88fc9c96c568d631356507355a2d1e983ee000c9ac008bdcb39b5bf53ce777" url: "https://pub.dev" source: hosted - version: "3.1.7" + version: "3.1.12" dbus: dependency: transitive description: name: dbus - sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" + sha256: "792974a4007974fbc5c1b5433eb2330a9db3e368c3f906253af4c007d0f49a91" url: "https://pub.dev" source: hosted - version: "0.7.14" + version: "0.7.13" device_calendar_plus: dependency: "direct main" description: name: device_calendar_plus - sha256: b26e053119da51ea18357154f440e0dd6ebd9de51661f6844188e81410546193 + sha256: "7f3418209e6678e8d9e8a8235e9beda34c1c0c35b0e071644283b300e7939a22" url: "https://pub.dev" source: hosted - version: "0.7.1" + version: "0.8.0" device_calendar_plus_android: dependency: transitive description: name: device_calendar_plus_android - sha256: "81c3e107f469e1acb5c8f926bc3f1b8106d0bb25f94d109ae4231982e2e7c937" + sha256: "7143fa08a3e1b57a1c81f478af1f4c6a1c47eee768fd5d322a69ed7abb43dcf8" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.1" device_calendar_plus_ios: dependency: transitive description: @@ -397,26 +405,26 @@ packages: dependency: "direct main" description: name: dio - sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c + sha256: "0df44ebba85e503958eb75d07eedd3c86275a58c1d3eda2f2ce8f0a2c3abbb3c" url: "https://pub.dev" source: hosted - version: "5.9.2" + version: "5.11.0" dio_cookie_manager: dependency: "direct main" description: name: dio_cookie_manager - sha256: "0db1a7b997a0455e488ac35744c68eed3f2a4280d3ab531835a65641b0a08744" + sha256: "4ed4669cacb11931517c1158876a2189f19386674b9dab498abcca063dbe4c61" url: "https://pub.dev" source: hosted - version: "3.4.0" + version: "3.5.0" dio_web_adapter: dependency: transitive description: name: dio_web_adapter - sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340" + sha256: "0786d0b7295a373de356fc0af4f6f1d0ab2844ed31b19dfc5e7556b70e24212c" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.2.1" encrypter_plus: dependency: "direct main" description: @@ -461,10 +469,42 @@ packages: dependency: "direct main" description: name: file_picker - sha256: fdc6a37f715d19f35b131decf1ce39242eeed5ddae18c0818c3eccb731ab76be + sha256: afbaa8015d9efabd224f41084ed9fdeddfa65389ebd7cd3a9eb1476aca66b46d + url: "https://pub.dev" + source: hosted + version: "12.0.0" + file_picker_darwin: + dependency: transitive + description: + name: file_picker_darwin + sha256: "5d87d156c1d63920447a662b7117d3498c67e3444a44d2cb01ed955d6efa62ef" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + file_picker_linux: + dependency: transitive + description: + name: file_picker_linux + sha256: "93d3f62f97c657053e7b184fe0f5e22347d85067c053640a30b1ac8ad7844e3b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + file_picker_platform_interface: + dependency: transitive + description: + name: file_picker_platform_interface + sha256: "9e7a7e01e179929241f0afeb2c8c69ac95e29e17c0abea36ed193881c6bef90c" url: "https://pub.dev" source: hosted - version: "12.0.0-beta.7" + version: "3.0.1" + file_picker_web: + dependency: transitive + description: + name: file_picker_web + sha256: f1af38b3c91fafe0ca97f659b5c6818a057473ef09bb8b722f9f3f5364aa7eed + url: "https://pub.dev" + source: hosted + version: "3.0.1" file_selector_linux: dependency: transitive description: @@ -530,10 +570,10 @@ packages: dependency: transitive description: name: flutter_cache_manager - sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + sha256: "1de7849213b4c73c85aca7e0ac687a9a5d82ccdb594366b9dcc26cb6a2189cd2" url: "https://pub.dev" source: hosted - version: "3.4.1" + version: "3.4.2" flutter_hooks: dependency: transitive description: @@ -578,10 +618,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: a0d7141f14cabcee42967470a858dfc99dd6cfb70d3cab404bacfcafa9e84e70 + sha256: "1447ba911c60f2ba3f25dae1af151ec187162566b0f57e37771bf0b400f013ad" url: "https://pub.dev" source: hosted - version: "22.0.1" + version: "22.3.0" flutter_local_notifications_linux: dependency: transitive description: @@ -594,10 +634,10 @@ packages: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: ff0013eae795e8dc8fad4a8992a209e64d3ba2fbd8bf5e43c36bf448f95bd814 + sha256: "43c3761d916c9bd3d5c7ebbc44d82f4990329840c0c5d62ad5260cc1b5d399bd" url: "https://pub.dev" source: hosted - version: "12.0.0" + version: "12.2.0" flutter_local_notifications_web: dependency: transitive description: @@ -623,18 +663,18 @@ packages: dependency: transitive description: name: flutter_mailer - sha256: e1c0b4425e3cc789f8dd914fd08b5da660c3ac46c8ebf3e7db183d39775a8fa6 + sha256: b01486ed1abed30e50748b330082a9287dde50433bcdb2cfe9fd27da32b8a763 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" flutter_native_splash: dependency: "direct main" description: name: flutter_native_splash - sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" + sha256: "9db4b80b044e9af17cc4b1272137fc7ace0054d879ef8210a76adc34aaf4cdff" url: "https://pub.dev" source: hosted - version: "2.4.7" + version: "2.4.8" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -673,10 +713,10 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: "7903c9d5339173497bfecbc23bc4212f5a87e0edfac2e1693fb74465ea67da7e" + sha256: "1ecdfd4add8b57eb33f6a36e7856d023cb039fe652ab225504d8a712b4238572" url: "https://pub.dev" source: hosted - version: "9.1.0" + version: "10.0.0" get_it: dependency: "direct main" description: @@ -721,10 +761,10 @@ packages: dependency: transitive description: name: hooks - sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" + sha256: "03a564c3704524ee0f7fc56fc621e8796cc2eb8c24d1f1a33b34979815b285c4" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.1.0" html: dependency: "direct main" description: @@ -761,10 +801,10 @@ packages: dependency: "direct main" description: name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce + sha256: "6300175e00616bbc832e2fc91bfa4d776af5402c81c7151bee6905bb08473c52" url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "4.9.1" image_picker: dependency: transitive description: @@ -841,10 +881,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + sha256: "1ca20c894b1717686a2319b8548763d812bc0aabdac580420a44c5178c57a867" url: "https://pub.dev" source: hosted - version: "0.20.2" + version: "0.20.3" io: dependency: transitive description: @@ -857,18 +897,26 @@ packages: dependency: transitive description: name: jni - sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + sha256: f038e58b4dc2c9037f50e233175086337e0b305e356d28211bf55f21c504cbd3 url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.3" jni_flutter: dependency: transitive description: name: jni_flutter - sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + sha256: "7b717011ea40d04fd47c2731d3d1d36eb99eba3435c2753d62489e8c3c9991d5" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.2" + jni_util: + dependency: transitive + description: + name: jni_util + sha256: "1ba86da04a5f2bf18fde2edb235587e70c5b0fc5bd4ba955f46b00942c3fc35f" + url: "https://pub.dev" + source: hosted + version: "1.0.0" json_annotation: dependency: "direct main" description: @@ -881,10 +929,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: ffcd10cde35a93b2abbbcc26bd9971f4ca93763e8abe78d855e3c4177797e501 + sha256: e45aefa0324f08c683caafbb94b72837aa6193c61822799c916e45f4a263113d url: "https://pub.dev" source: hosted - version: "6.14.0" + version: "6.14.1" leak_tracker: dependency: transitive description: @@ -945,18 +993,18 @@ packages: dependency: transitive description: name: mailer - sha256: "7b8691b080809ea1b2fa2f1b0d49c7c089fb328bd23e68aa5818b9cf5f4b420d" + sha256: "9f7213f57272c2a047f13ae89e68652d492f929d84ded9a618424b38da328f97" url: "https://pub.dev" source: hosted - version: "7.1.0" + version: "7.2.0" matcher: dependency: transitive description: name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + sha256: "31bd099b47c10cd1aeb55146a2d46ce0277630ecef3f7dae54ad7873f36696cd" url: "https://pub.dev" source: hosted - version: "0.12.19" + version: "0.12.20" material_color_utilities: dependency: transitive description: @@ -969,10 +1017,10 @@ packages: dependency: transitive description: name: meta - sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" + sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.0" mime: dependency: transitive description: @@ -1001,10 +1049,10 @@ packages: dependency: transitive description: name: objective_c - sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" + sha256: b7fb95a6d9a4f009edd63dc5ac69f07420b23a16161c6dd8660290b59c602e8e url: "https://pub.dev" source: hosted - version: "9.4.1" + version: "9.5.0" octo_image: dependency: transitive description: @@ -1017,18 +1065,18 @@ packages: dependency: transitive description: name: package_config - sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + sha256: ffcf4cf3d6c0b74ac43708d9f56625506e8a68aa935abe9d267a7330f320eb5d url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "3.0.0" package_info_plus: dependency: "direct main" description: name: package_info_plus - sha256: f5c435dc0e0d461e5b32471a870f769b6a1cc46930637efe24fbc535314e78ad + sha256: "127e1751e37ffb2ff4658beeaca77bad0c27bf5f932bd3a501c2296926d4b481" url: "https://pub.dev" source: hosted - version: "10.2.0" + version: "10.2.1" package_info_plus_platform_interface: dependency: transitive description: @@ -1097,50 +1145,50 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: fe54465bcc62a4564c6e4db337bbaded6c0c0fa6e10487414436d163114784f6 + sha256: e7317eb2eb611d1bf0386b6b974be9c50449f975f19a90a7b8ea013550302b30 url: "https://pub.dev" source: hosted - version: "12.0.3" + version: "13.0.1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" + sha256: d7676c6fcf2f0b92537ec41476a6ead45a00b0d8bbb852395a6f9f33f49d6242 url: "https://pub.dev" source: hosted - version: "13.0.1" + version: "14.0.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: "79dfa1df734798aa3cfdad166d3a3698c206d8813de13516ea1071b5d7e2f420" + sha256: f49cb15a064ea9d974fc7fbb302099353b7b170d07284e86e264561579e5bcf8 url: "https://pub.dev" source: hosted - version: "9.4.10" + version: "9.6.1" permission_handler_html: dependency: transitive description: name: permission_handler_html - sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + sha256: "6ea98b3f17f60d3b527f2647ed2ab4dc0f6bfe25b22cb1c363f5d8f62252f6ac" url: "https://pub.dev" source: hosted - version: "0.1.3+5" + version: "0.1.4+1" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + sha256: a5c8a97ecf5616112a5b16d4b8e9ec0e5ae90ef63ac69c0d7b8ae240be760b23 url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.4.0" permission_handler_windows: dependency: transitive description: name: permission_handler_windows - sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + sha256: caeae01858a0a7d2df67a445ac98e1ad95e55a0e77c73044f4e9b1c8c2289cbd url: "https://pub.dev" source: hosted - version: "0.2.1" + version: "0.2.2" petitparser: dependency: transitive description: @@ -1153,10 +1201,10 @@ packages: dependency: "direct dev" description: name: pigeon - sha256: a716c5729bad574ab45d94d3ca13d6348b5d20d6c1f7f89a0acecab2ebdc6dda + sha256: b57a735cc2d0452564a87d34b229f204d43d907ddc34e4b79a6540a2c692bcb5 url: "https://pub.dev" source: hosted - version: "27.1.0" + version: "27.3.1" platform: dependency: transitive description: @@ -1193,10 +1241,10 @@ packages: dependency: transitive description: name: posix - sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e url: "https://pub.dev" source: hosted - version: "6.5.0" + version: "6.5.2" preact_signals: dependency: transitive description: @@ -1233,18 +1281,18 @@ packages: dependency: transitive description: name: punycoder - sha256: aed79c05986a18782caa9bad649a4a786e840e1baaf6a2e1aa3a25d143d28e6e + sha256: "982734df864d9588eb13e28ac1c5a46b57e22117b3696032ac58739966cec190" url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.3.0" record_use: dependency: transitive description: name: record_use - sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + sha256: "3b4ab682aff40175afca6ff090cc5aa7ce9dafe8dfbae1537a6c678e6678baee" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "1.1.0" remixicon: dependency: "direct main" description: @@ -1257,10 +1305,10 @@ packages: dependency: "direct main" description: name: restart_app - sha256: "400dd401b77b599e2defef55fd4c22af3ff80af48616a82f01c2a07070e3e368" + sha256: "3ea6b790dd88d7d927ed4792f3c6dd68e2fdffcbb1bf4df6d19313702e2d6387" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.1" rxdart: dependency: transitive description: @@ -1273,26 +1321,26 @@ packages: dependency: transitive description: name: sentry - sha256: "3311f89e0c964c4df5f65670348c8a11744c94ae2b57032c947cfb26bfd03ef0" + sha256: c2ecd8abe82e63cdcb6947f71320612ced56e10ba94db7529d85cc02be47cb3b url: "https://pub.dev" source: hosted - version: "9.22.0" + version: "9.27.0" share_plus: dependency: "direct main" description: name: share_plus - sha256: "9eee8283462d91a7a1c8bdb67d08874abd75a2f8fae3bc0ca033035e375fb3d8" + sha256: "34f00f9becd2743c1fb05363d624f9f70d37f7ccdcdda47450bc0b8c9d327b8c" url: "https://pub.dev" source: hosted - version: "13.2.0" + version: "13.3.0" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "7f7ae28cf400d13f811e297ff37742dba83b79e0a6f5dce14eec0248274e6ce9" + sha256: "365ef7379fc22507256adda3385152942ffce08935452bc972c2e52a0bebae41" url: "https://pub.dev" source: hosted - version: "7.1.0" + version: "7.2.0" shared_preferences: dependency: "direct main" description: @@ -1305,10 +1353,10 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 + sha256: "0634e64bd719f89c012f392938e173521f535d3ecaf66558fa94a056d22b5cc7" url: "https://pub.dev" source: hosted - version: "2.4.23" + version: "2.4.27" shared_preferences_foundation: dependency: transitive description: @@ -1414,26 +1462,26 @@ packages: dependency: "direct main" description: name: sn_progress_dialog - sha256: bbb6bbe71c12afe937474932eefcb5c7d607238b1325f83206f12d3f7a850acf + sha256: cb17c07a45f28e62f314c79366a0067651e0183b5f8b9b3a1b0717aeadacca69 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "2.0.0" source_gen: dependency: transitive description: name: source_gen - sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02 + sha256: a603f1fb984a7391ae5978d1b92bfaaa08b350dca5c825256f925818f7943bf5 url: "https://pub.dev" source: hosted - version: "4.2.3" + version: "4.2.4" source_helper: dependency: transitive description: name: source_helper - sha256: "4227d54ceefd0bb8ca4c8fcb96e1719dc53f1ee1b6e2ca9d7a6069da160e4eae" + sha256: "5e6f216fdf6376c9f3852381ae037499797a3385377d388b011dac98d303c67c" url: "https://pub.dev" source: hosted - version: "1.3.12" + version: "1.3.13" source_span: dependency: transitive description: @@ -1446,42 +1494,42 @@ packages: dependency: transitive description: name: sqflite - sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a" + sha256: "58a799e6ac17dd32fbab93813d39ed835a75ccc0f8f85b8955fe318c6712b082" url: "https://pub.dev" source: hosted - version: "2.4.2+1" + version: "2.4.3" sqflite_android: dependency: transitive description: name: sqflite_android - sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40" + sha256: d0548f9d7422a2dae99ec6f8b0a3074463b132d216fa5ba0d230eeefc901983b url: "https://pub.dev" source: hosted - version: "2.4.2+3" + version: "2.4.3" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465" + sha256: "5bf6a55c166e73bf651ba7ec3ed486e577620e3dc8f3a9c6a258a8031b624590" url: "https://pub.dev" source: hosted - version: "2.5.8" + version: "2.5.11" sqflite_darwin: dependency: transitive description: name: sqflite_darwin - sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + sha256: c86ca18b8f666bbf903924687fe21cc16fc385d086005067e26619ca530bef9f url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.3+1" sqflite_platform_interface: dependency: transitive description: name: sqflite_platform_interface - sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + sha256: f84939f84350d92d04416f8bc4dc52d3896aec7716cc9e80cf0146342139dc50 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" stack_trace: dependency: transitive description: @@ -1526,42 +1574,42 @@ packages: dependency: "direct main" description: name: synchronized - sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" + sha256: "3a7b5d17422dd0f8d5c6c14feaa5a1c65638b9455f871a96f08437562c046931" url: "https://pub.dev" source: hosted - version: "3.4.0+1" + version: "3.4.1+2" talker: dependency: transitive description: name: talker - sha256: f1a14d623f1d1bec42bb3bb77674eb766ffe8d26e5f79af652d85cb097c3e757 + sha256: "57b160b70123fdb28cc1035987e4718bce5715c724a40ff74d6466d1559de68a" url: "https://pub.dev" source: hosted - version: "5.1.17" + version: "5.1.20" talker_dio_logger: dependency: "direct main" description: name: talker_dio_logger - sha256: "6dba5c29afb566c6efe1a2c1b676488ea7c727b486bda0654d965a1cfad6ea9b" + sha256: c2ab184171bdc3f45a8791c57a7746d095398d5e18a505c042b41a30af244bc4 url: "https://pub.dev" source: hosted - version: "5.1.17" + version: "5.1.20" talker_flutter: dependency: "direct main" description: name: talker_flutter - sha256: "7e4b5fb520b4dadfc8db97e73a2a76ea5d6eda471a51489f3c0bd58b96a1ed43" + sha256: "9be092f9661d217edcfb3e2d7e3581a290a69ecfbbd2e19e582ff9d49e7f0e97" url: "https://pub.dev" source: hosted - version: "5.1.17" + version: "5.1.20" talker_logger: dependency: transitive description: name: talker_logger - sha256: "459205c3e571f97ecc6be6e1b1b7e6b97b853e78ea458894650be407596e3216" + sha256: b24550d115f209a1b84a697d65f5ec0fa9eb483735c802f18077692fa83cb5f8 url: "https://pub.dev" source: hosted - version: "5.1.17" + version: "5.1.20" term_glyph: dependency: transitive description: @@ -1574,10 +1622,10 @@ packages: dependency: transitive description: name: test_api - sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" + sha256: "2a122cbe059f8b610d3a5415f42e255b6c17b1f21eee1d960f31080237fb4f11" url: "https://pub.dev" source: hosted - version: "0.7.11" + version: "0.7.12" time: dependency: "direct main" description: @@ -1590,10 +1638,10 @@ packages: dependency: "direct main" description: name: timezone - sha256: "784a5e34d2eb62e1326f24d6f600aaaee452eb8ca8ef2f384a59244e292d158b" + sha256: "981d1020d6ef8fe1e7b3de5054e5b25579ae7c403d7734adc508ffc47668e9cb" url: "https://pub.dev" source: hosted - version: "0.11.0" + version: "0.11.1" toml: dependency: transitive description: @@ -1638,10 +1686,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" + sha256: b413d49b73867ac08dd2f9890efd3cc11f2a0e577618d50843440a1fb3776c32 url: "https://pub.dev" source: hosted - version: "6.3.30" + version: "6.3.32" url_launcher_ios: dependency: transitive description: @@ -1694,18 +1742,18 @@ packages: dependency: transitive description: name: uuid - sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" + sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd" url: "https://pub.dev" source: hosted - version: "4.5.3" + version: "4.6.0" vector_math: dependency: transitive description: name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + sha256: f36f9f3be64c6198714492bb455c11056e33e2f85d9a0b676a48301e44fdcf47 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.4.2" vm_service: dependency: transitive description: @@ -1750,10 +1798,10 @@ packages: dependency: transitive description: name: win32 - sha256: ba6f4bba816c8d7e3c1580e170f3786d216951cc6b94babc3b814c08d2cb2738 + sha256: a0b93865d5644f11cf6a8c3f6db909f1ec168958b5805f6cc684adea957cd63d url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.4.0" win32_registry: dependency: transitive description: @@ -1762,6 +1810,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + windows_file_picker: + dependency: transitive + description: + name: windows_file_picker + sha256: "72cf23466e146f2c0f19e1d78be97ff6409dc15b0c090f8eb284f94f4a33de26" + url: "https://pub.dev" + source: hosted + version: "1.0.1" xdg_directories: dependency: transitive description: @@ -1774,18 +1830,18 @@ packages: dependency: transitive description: name: xml - sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + sha256: "67f0aff7be013d107995e9b75bf4e7f2c3ef2dfdb2c8e68024bba0a7fd5756a4" url: "https://pub.dev" source: hosted - version: "6.6.1" + version: "7.0.1" xml2json: dependency: transitive description: name: xml2json - sha256: "8a7ae63b76676f083d81287b61f03222952609c0507893bc62e60a4a588a9702" + sha256: "0c1cb4e84105bdc3a8c67efc4673d317932f6fd7cc9a46cb4438bea375b7bb9b" url: "https://pub.dev" source: hosted - version: "6.2.7" + version: "6.2.9" yaml: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index cd5c4f0d..4cdf5d18 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,8 +31,8 @@ dependencies: charset_converter: ^2.2.1 # Homepage infinite_scroll_pagination: ^5.1.1 - sn_progress_dialog: ^1.1.3 - fluttertoast: ^9.0.0 + sn_progress_dialog: ^2.0.0 + fluttertoast: ^10.0.0 flex_color_scheme: ^8.3.0 # Others url_launcher: ^6.1.6 @@ -53,10 +53,11 @@ dependencies: ming_cute_icons: ^0.0.7 remixicon: ^4.9.1 based_split_view: ^1.2.0 - permission_handler: ^12.0.1 + permission_handler: ^13.0.1 # QR code scanner + flutter_zxing: ^2.3.0 # Output to system calendar - device_calendar_plus: ^0.7.1 + device_calendar_plus: ^0.8.0 # Homepage Widget home_widget: ^0.9.3 image: ^4.2.0 @@ -70,7 +71,6 @@ dependencies: intl: timezone: ^0.11.0 flutter_local_notifications: ^22.0.1 - flutter_zxing: ^2.3.0 flutter_html: ^3.0.0 dev_dependencies: