From 331f83960ea11c10eeeb9e125676167180385e02 Mon Sep 17 00:00:00 2001 From: MaoTechh Date: Thu, 11 Jun 2026 19:51:46 +0800 Subject: [PATCH 01/11] feat: add widgets --- ios/Runner/Runner.entitlements | 8 ++ .../AccentColor.colorset/Contents.json | 11 +++ .../AppIcon.appiconset/Contents.json | 35 ++++++++ .../Assets.xcassets/Contents.json | 6 ++ .../WidgetBackground.colorset/Contents.json | 11 +++ ios/TechPieWidget/Info.plist | 11 +++ ios/TechPieWidget/TechPieWidget.swift | 88 +++++++++++++++++++ ios/TechPieWidget/TechPieWidgetBundle.swift | 18 ++++ ios/TechPieWidgetExtension.entitlements | 5 ++ 9 files changed, 193 insertions(+) create mode 100644 ios/Runner/Runner.entitlements create mode 100644 ios/TechPieWidget/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 ios/TechPieWidget/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/TechPieWidget/Assets.xcassets/Contents.json create mode 100644 ios/TechPieWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json create mode 100644 ios/TechPieWidget/Info.plist create mode 100644 ios/TechPieWidget/TechPieWidget.swift create mode 100644 ios/TechPieWidget/TechPieWidgetBundle.swift create mode 100644 ios/TechPieWidgetExtension.entitlements diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..2eb7e33 --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.application-groups + + + diff --git a/ios/TechPieWidget/Assets.xcassets/AccentColor.colorset/Contents.json b/ios/TechPieWidget/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ios/TechPieWidget/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/TechPieWidget/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/TechPieWidget/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2305880 --- /dev/null +++ b/ios/TechPieWidget/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/TechPieWidget/Assets.xcassets/Contents.json b/ios/TechPieWidget/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ios/TechPieWidget/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/TechPieWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json b/ios/TechPieWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ios/TechPieWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/TechPieWidget/Info.plist b/ios/TechPieWidget/Info.plist new file mode 100644 index 0000000..0f118fb --- /dev/null +++ b/ios/TechPieWidget/Info.plist @@ -0,0 +1,11 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/ios/TechPieWidget/TechPieWidget.swift b/ios/TechPieWidget/TechPieWidget.swift new file mode 100644 index 0000000..b21a9d8 --- /dev/null +++ b/ios/TechPieWidget/TechPieWidget.swift @@ -0,0 +1,88 @@ +// +// TechPieWidget.swift +// TechPieWidget +// +// Created by Henry Li on 2026/6/11. +// + +import WidgetKit +import SwiftUI + +struct Provider: AppIntentTimelineProvider { + func placeholder(in context: Context) -> SimpleEntry { + SimpleEntry(date: Date(), configuration: ConfigurationAppIntent()) + } + + func snapshot(for configuration: ConfigurationAppIntent, in context: Context) async -> SimpleEntry { + SimpleEntry(date: Date(), configuration: configuration) + } + + func timeline(for configuration: ConfigurationAppIntent, in context: Context) async -> Timeline { + var entries: [SimpleEntry] = [] + + // Generate a timeline consisting of five entries an hour apart, starting from the current date. + let currentDate = Date() + for hourOffset in 0 ..< 5 { + let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! + let entry = SimpleEntry(date: entryDate, configuration: configuration) + entries.append(entry) + } + + return Timeline(entries: entries, policy: .atEnd) + } + +// func relevances() async -> WidgetRelevances { +// // Generate a list containing the contexts this widget is relevant in. +// } +} + +struct SimpleEntry: TimelineEntry { + let date: Date + let configuration: ConfigurationAppIntent +} + +struct TechPieWidgetEntryView : View { + var entry: Provider.Entry + + var body: some View { + VStack { + Text("Time:") + Text(entry.date, style: .time) + + Text("Favorite Emoji:") + Text(entry.configuration.favoriteEmoji) + } + } +} + +struct TechPieWidget: Widget { + let kind: String = "TechPieWidget" + + var body: some WidgetConfiguration { + AppIntentConfiguration(kind: kind, intent: ConfigurationAppIntent.self, provider: Provider()) { entry in + TechPieWidgetEntryView(entry: entry) + .containerBackground(.fill.tertiary, for: .widget) + } + } +} + +extension ConfigurationAppIntent { + fileprivate static var smiley: ConfigurationAppIntent { + let intent = ConfigurationAppIntent() + intent.favoriteEmoji = "😀" + return intent + } + + fileprivate static var starEyes: ConfigurationAppIntent { + let intent = ConfigurationAppIntent() + intent.favoriteEmoji = "🤩" + return intent + } +} + +#Preview(as: .systemSmall) { + TechPieWidget() +} timeline: { + SimpleEntry(date: .now, configuration: .smiley) + SimpleEntry(date: .now, configuration: .starEyes) +} diff --git a/ios/TechPieWidget/TechPieWidgetBundle.swift b/ios/TechPieWidget/TechPieWidgetBundle.swift new file mode 100644 index 0000000..39efe93 --- /dev/null +++ b/ios/TechPieWidget/TechPieWidgetBundle.swift @@ -0,0 +1,18 @@ +// +// TechPieWidgetBundle.swift +// TechPieWidget +// +// Created by Henry Li on 2026/6/11. +// + +import WidgetKit +import SwiftUI + +@main +struct TechPieWidgetBundle: WidgetBundle { + var body: some Widget { + TechPieWidget() + TechPieWidgetControl() + TechPieWidgetLiveActivity() + } +} diff --git a/ios/TechPieWidgetExtension.entitlements b/ios/TechPieWidgetExtension.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/ios/TechPieWidgetExtension.entitlements @@ -0,0 +1,5 @@ + + + + + From 33b7d7008c897e35c65ea2e0ed029932c0b8e3cc Mon Sep 17 00:00:00 2001 From: MaoTechh Date: Thu, 11 Jun 2026 19:52:05 +0800 Subject: [PATCH 02/11] feat: add widgets --- ios/Podfile | 2 +- ios/Podfile.lock | 21 +- ios/Runner.xcodeproj/project.pbxproj | 261 ++++++++++- .../NativeGlass/NativeGlassButton.swift | 7 + .../NativeGlassConfirmationButton.swift | 7 + .../NativeGlass/NativeGlassDropdownMenu.swift | 4 + .../NativeGlass/NativeGlassSelect.swift | 4 + .../NativeGlass/NativeNavigationBar.swift | 4 + ios/Runner/Runner.entitlements | 4 +- ios/TechPieWidget/TechPieWidget.swift | 233 +++++++--- ios/TechPieWidget/TechPieWidgetBundle.swift | 2 - ios/TechPieWidgetExtension.entitlements | 7 +- lib/services/assignment_service.dart | 17 +- lib/services/schedule_service.dart | 12 + lib/services/widget_sync_service.dart | 65 +++ pubspec.lock | 432 +++++++++++------- pubspec.yaml | 1 + 17 files changed, 828 insertions(+), 255 deletions(-) create mode 100644 lib/services/widget_sync_service.dart diff --git a/ios/Podfile b/ios/Podfile index 2dbf7d7..c2c1dc5 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '13.0' +platform :ios, '14.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 112a9bf..2fde109 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2,13 +2,12 @@ PODS: - Flutter (1.0.0) - flutter_secure_storage (6.0.0): - Flutter + - home_widget (0.0.1): + - Flutter - open_filex (0.0.2): - Flutter - package_info_plus (0.4.5): - Flutter - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS @@ -21,9 +20,9 @@ PODS: DEPENDENCIES: - Flutter (from `Flutter`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - home_widget (from `.symlinks/plugins/home_widget/ios`) - open_filex (from `.symlinks/plugins/open_filex/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`) @@ -33,12 +32,12 @@ EXTERNAL SOURCES: :path: Flutter flutter_secure_storage: :path: ".symlinks/plugins/flutter_secure_storage/ios" + home_widget: + :path: ".symlinks/plugins/home_widget/ios" open_filex: :path: ".symlinks/plugins/open_filex/ios" package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" url_launcher_ios: @@ -47,15 +46,15 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin" SPEC CHECKSUMS: - Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 + home_widget: 54b4f6b36ed8d64cfee594a476225c35c3e45091 open_filex: 432f3cd11432da3e39f47fcc0df2b1603854eff1 package_info_plus: 566e1b7a2f3900e4b0020914ad3fc051dcc95596 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 - url_launcher_ios: 694010445543906933d732453a59da0a173ae33d + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb + url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2 -PODFILE CHECKSUM: 251cb053df7158f337c0712f2ab29f4e0fa474ce +PODFILE CHECKSUM: e30f02f9d1c72c47bb6344a0a748c9d268180865 COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2d632d9..47048bb 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 70; objects = { /* Begin PBXBuildFile section */ @@ -25,11 +25,14 @@ 5A00101E2F1A000100000001 /* NativeTextFieldGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A00101D2F1A000100000001 /* NativeTextFieldGroup.swift */; }; 6BFBE954DB868241E9E9810B /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052EF181B45C1F8AB028A91F /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; 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 */; }; + AE1A35252FDAC803007C86E7 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE1A35242FDAC803007C86E7 /* WidgetKit.framework */; }; + AE1A35272FDAC803007C86E7 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE1A35262FDAC803007C86E7 /* SwiftUI.framework */; }; + AE1A35382FDAC804007C86E7 /* TechPieWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = AE1A35232FDAC803007C86E7 /* TechPieWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; AE9BB45FC9E1D531003A2DF5 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95DFA3F27C43BF6B489182B8 /* Pods_RunnerTests.framework */; }; - 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -40,6 +43,13 @@ remoteGlobalIDString = 97C146ED1CF9000F007C117D; remoteInfo = Runner; }; + AE1A35362FDAC804007C86E7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = AE1A35222FDAC803007C86E7; + remoteInfo = TechPieWidgetExtension; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -53,6 +63,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + AE1A35392FDAC804007C86E7 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + AE1A35382FDAC804007C86E7 /* TechPieWidgetExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -80,6 +101,7 @@ 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 = ""; }; 776CD06E7F9DDAC30B1D93AD /* 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 = ""; }; + 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 = ""; }; 95DFA3F27C43BF6B489182B8 /* 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 = ""; }; @@ -89,12 +111,30 @@ 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 = ""; }; + AE1A35232FDAC803007C86E7 /* TechPieWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TechPieWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + AE1A35242FDAC803007C86E7 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; + AE1A35262FDAC803007C86E7 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; + AE1A35412FDAC98F007C86E7 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + AE1A35422FDAC9B5007C86E7 /* TechPieWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TechPieWidgetExtension.entitlements; sourceTree = ""; }; C6ECDBC06E9BDB1CBA58B7DB /* 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 = ""; }; C7BBB453CDB9F73A63A4A327 /* 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 = ""; }; D3EC6B66BB17FD8FCFF14373 /* 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 = ""; }; - 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + AE1A353D2FDAC804007C86E7 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = AE1A35222FDAC803007C86E7 /* TechPieWidgetExtension */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + AE1A35282FDAC803007C86E7 /* TechPieWidget */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (AE1A353D2FDAC804007C86E7 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = TechPieWidget; sourceTree = ""; }; +/* End PBXFileSystemSynchronizedRootGroup section */ + /* Begin PBXFrameworksBuildPhase section */ 37EE0E03704066D35E7DAB45 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; @@ -113,6 +153,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AE1A35202FDAC803007C86E7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AE1A35272FDAC803007C86E7 /* SwiftUI.framework in Frameworks */, + AE1A35252FDAC803007C86E7 /* WidgetKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -121,6 +170,8 @@ children = ( 052EF181B45C1F8AB028A91F /* Pods_Runner.framework */, 95DFA3F27C43BF6B489182B8 /* Pods_RunnerTests.framework */, + AE1A35242FDAC803007C86E7 /* WidgetKit.framework */, + AE1A35262FDAC803007C86E7 /* SwiftUI.framework */, ); name = Frameworks; sourceTree = ""; @@ -181,8 +232,10 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( + AE1A35422FDAC9B5007C86E7 /* TechPieWidgetExtension.entitlements */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, + AE1A35282FDAC803007C86E7 /* TechPieWidget */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, 1FD71643C385FC3B24A7C891 /* Pods */, @@ -195,6 +248,7 @@ children = ( 97C146EE1CF9000F007C117D /* Runner.app */, 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + AE1A35232FDAC803007C86E7 /* TechPieWidgetExtension.appex */, ); name = Products; sourceTree = ""; @@ -202,6 +256,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + AE1A35412FDAC98F007C86E7 /* Runner.entitlements */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -238,9 +293,6 @@ productType = "com.apple.product-type.bundle.unit-test"; }; 97C146ED1CF9000F007C117D /* Runner */ = { - packageProductDependencies = ( - 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, - ); isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( @@ -250,28 +302,51 @@ 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, + AE1A35392FDAC804007C86E7 /* Embed Foundation Extensions */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 1C676109FBCDA2409F8A534A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); dependencies = ( + AE1A35372FDAC804007C86E7 /* PBXTargetDependency */, ); name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; }; + AE1A35222FDAC803007C86E7 /* TechPieWidgetExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = AE1A353E2FDAC804007C86E7 /* Build configuration list for PBXNativeTarget "TechPieWidgetExtension" */; + buildPhases = ( + AE1A351F2FDAC803007C86E7 /* Sources */, + AE1A35202FDAC803007C86E7 /* Frameworks */, + AE1A35212FDAC803007C86E7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + AE1A35282FDAC803007C86E7 /* TechPieWidget */, + ); + name = TechPieWidgetExtension; + productName = TechPieWidgetExtension; + productReference = AE1A35232FDAC803007C86E7 /* TechPieWidgetExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 97C146E61CF9000F007C117D /* Project object */ = { - packageReferences = ( - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, - ); isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 1640; LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { @@ -283,6 +358,9 @@ CreatedOnToolsVersion = 7.3.1; LastSwiftMigration = 1100; }; + AE1A35222FDAC803007C86E7 = { + CreatedOnToolsVersion = 16.4; + }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; @@ -294,12 +372,16 @@ Base, ); mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, 331C8080294A63A400263BE5 /* RunnerTests */, + AE1A35222FDAC803007C86E7 /* TechPieWidgetExtension */, ); }; /* End PBXProject section */ @@ -323,6 +405,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AE1A35212FDAC803007C86E7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -334,10 +423,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; @@ -451,6 +544,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AE1A351F2FDAC803007C86E7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -459,6 +559,11 @@ target = 97C146ED1CF9000F007C117D /* Runner */; targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; }; + AE1A35372FDAC804007C86E7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AE1A35222FDAC803007C86E7 /* TechPieWidgetExtension */; + targetProxy = AE1A35362FDAC804007C86E7 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -525,7 +630,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; STRING_CATALOG_GENERATE_SYMBOLS = YES; @@ -541,6 +646,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -656,7 +762,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -709,7 +815,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; STRING_CATALOG_GENERATE_SYMBOLS = YES; @@ -727,6 +833,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -749,6 +856,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -764,6 +872,123 @@ }; name = Release; }; + AE1A353A2FDAC804007C86E7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = TechPieWidgetExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = TechPieWidget/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = TechPieWidget; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.example.techpie.TechPieWidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + AE1A353B2FDAC804007C86E7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = TechPieWidgetExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = TechPieWidget/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = TechPieWidget; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.example.techpie.TechPieWidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + AE1A353C2FDAC804007C86E7 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = TechPieWidgetExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = TechPieWidget/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = TechPieWidget; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.example.techpie.TechPieWidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Profile; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -797,13 +1022,25 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AE1A353E2FDAC804007C86E7 /* Build configuration list for PBXNativeTarget "TechPieWidgetExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AE1A353A2FDAC804007C86E7 /* Debug */, + AE1A353B2FDAC804007C86E7 /* Release */, + AE1A353C2FDAC804007C86E7 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ + /* Begin XCLocalSwiftPackageReference section */ 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { isa = XCLocalSwiftPackageReference; relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; }; /* End XCLocalSwiftPackageReference section */ + /* Begin XCSwiftPackageProductDependency section */ 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { isa = XCSwiftPackageProductDependency; diff --git a/ios/Runner/NativeGlass/NativeGlassButton.swift b/ios/Runner/NativeGlass/NativeGlassButton.swift index ed9b9d2..f5d7d0e 100644 --- a/ios/Runner/NativeGlass/NativeGlassButton.swift +++ b/ios/Runner/NativeGlass/NativeGlassButton.swift @@ -116,10 +116,17 @@ final class NativeGlassButtonPlatformView: NSObject, FlutterPlatformView { @available(iOS 26.0, *) private func applyLiquidGlassAppearance(image: UIImage?) { +#if compiler(>=7.0) var configuration = UIButton.Configuration.prominentGlass() configuration.image = image button.configuration = configuration +#else + var configuration = UIButton.Configuration.filled() + configuration.image = image + + button.configuration = configuration +#endif } @available(iOS 15.0, *) diff --git a/ios/Runner/NativeGlass/NativeGlassConfirmationButton.swift b/ios/Runner/NativeGlass/NativeGlassConfirmationButton.swift index 71a9ab6..84a330f 100644 --- a/ios/Runner/NativeGlass/NativeGlassConfirmationButton.swift +++ b/ios/Runner/NativeGlass/NativeGlassConfirmationButton.swift @@ -143,10 +143,17 @@ final class NativeGlassConfirmationButtonPlatformView: NSObject, FlutterPlatform private func applyLiquidGlassAppearance() { let image = symbolImage(named: sfSymbol) +#if compiler(>=7.0) var configuration: UIButton.Configuration = label == nil || label?.isEmpty == true ? .clearGlass() : .glass() +#else + var configuration: UIButton.Configuration = + label == nil || label?.isEmpty == true + ? .plain() + : .filled() +#endif configuration.image = image configuration.title = label if destructive { diff --git a/ios/Runner/NativeGlass/NativeGlassDropdownMenu.swift b/ios/Runner/NativeGlass/NativeGlassDropdownMenu.swift index 9ff6838..188f557 100644 --- a/ios/Runner/NativeGlass/NativeGlassDropdownMenu.swift +++ b/ios/Runner/NativeGlass/NativeGlassDropdownMenu.swift @@ -124,7 +124,11 @@ final class NativeGlassDropdownMenuPlatformView: NSObject, FlutterPlatformView { let image = symbolImage(named: sfSymbol) if #available(iOS 26.0, *) { +#if compiler(>=7.0) var configuration = UIButton.Configuration.glass() +#else + var configuration = UIButton.Configuration.filled() +#endif configuration.image = image configuration.title = label button.configuration = configuration diff --git a/ios/Runner/NativeGlass/NativeGlassSelect.swift b/ios/Runner/NativeGlass/NativeGlassSelect.swift index b3ac46b..fb2ff11 100644 --- a/ios/Runner/NativeGlass/NativeGlassSelect.swift +++ b/ios/Runner/NativeGlass/NativeGlassSelect.swift @@ -136,7 +136,11 @@ final class NativeGlassSelectPlatformView: NSObject, FlutterPlatformView { let image = symbolImage(named: sfSymbol) if #available(iOS 26.0, *) { +#if compiler(>=7.0) var configuration = UIButton.Configuration.glass() +#else + var configuration = UIButton.Configuration.filled() +#endif configuration.image = image configuration.title = selectedLabel button.configuration = configuration diff --git a/ios/Runner/NativeGlass/NativeNavigationBar.swift b/ios/Runner/NativeGlass/NativeNavigationBar.swift index 243ef9c..33efa9b 100644 --- a/ios/Runner/NativeGlass/NativeNavigationBar.swift +++ b/ios/Runner/NativeGlass/NativeNavigationBar.swift @@ -110,10 +110,12 @@ final class NativeNavigationBarPlatformView: NSObject, FlutterPlatformView { navigationItem.title = configuration.title navigationItem.largeTitleDisplayMode = configuration.largeTitleMode ? .always : .never +#if compiler(>=7.0) if #available(iOS 26.0, *) { navigationItem.subtitle = configuration.largeTitleMode ? nil : configuration.subtitle navigationItem.largeSubtitle = configuration.largeTitleMode ? configuration.subtitle : nil } +#endif if #available(iOS 16.0, *) { navigationItem.leadingItemGroups = [] @@ -165,9 +167,11 @@ final class NativeNavigationBarPlatformView: NSObject, FlutterPlatformView { if #available(iOS 16.0, *) { barButtonItem.isHidden = item.hidden } +#if compiler(>=7.0) if #available(iOS 26.0, *) { barButtonItem.identifier = item.id } +#endif return barButtonItem } diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements index 2eb7e33..fbb0586 100644 --- a/ios/Runner/Runner.entitlements +++ b/ios/Runner/Runner.entitlements @@ -3,6 +3,8 @@ com.apple.security.application-groups - + + group.com.example.techpie + diff --git a/ios/TechPieWidget/TechPieWidget.swift b/ios/TechPieWidget/TechPieWidget.swift index b21a9d8..c813268 100644 --- a/ios/TechPieWidget/TechPieWidget.swift +++ b/ios/TechPieWidget/TechPieWidget.swift @@ -1,56 +1,143 @@ -// -// TechPieWidget.swift -// TechPieWidget -// -// Created by Henry Li on 2026/6/11. -// - import WidgetKit import SwiftUI -struct Provider: AppIntentTimelineProvider { +struct Provider: TimelineProvider { func placeholder(in context: Context) -> SimpleEntry { - SimpleEntry(date: Date(), configuration: ConfigurationAppIntent()) + SimpleEntry(date: Date(), courses: [], assignments: []) } - func snapshot(for configuration: ConfigurationAppIntent, in context: Context) async -> SimpleEntry { - SimpleEntry(date: Date(), configuration: configuration) + func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { + let entry = SimpleEntry(date: Date(), + courses: WidgetDataManager.shared.courses, + assignments: WidgetDataManager.shared.assignments) + completion(entry) } - - func timeline(for configuration: ConfigurationAppIntent, in context: Context) async -> Timeline { - var entries: [SimpleEntry] = [] - - // Generate a timeline consisting of five entries an hour apart, starting from the current date. - let currentDate = Date() - for hourOffset in 0 ..< 5 { - let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! - let entry = SimpleEntry(date: entryDate, configuration: configuration) - entries.append(entry) - } - return Timeline(entries: entries, policy: .atEnd) + func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { + let entry = SimpleEntry(date: Date(), + courses: WidgetDataManager.shared.courses, + assignments: WidgetDataManager.shared.assignments) + + // Update widget occasionally or when told by Flutter + let nextUpdate = Calendar.current.date(byAdding: .minute, value: 30, to: Date())! + let timeline = Timeline(entries: [entry], policy: .after(nextUpdate)) + completion(timeline) } - -// func relevances() async -> WidgetRelevances { -// // Generate a list containing the contexts this widget is relevant in. -// } } struct SimpleEntry: TimelineEntry { let date: Date - let configuration: ConfigurationAppIntent + let courses: [Course] + let assignments: [Assignment] } struct TechPieWidgetEntryView : View { var entry: Provider.Entry + @Environment(\.widgetFamily) var family var body: some View { - VStack { - Text("Time:") - Text(entry.date, style: .time) - - Text("Favorite Emoji:") - Text(entry.configuration.favoriteEmoji) + ZStack { + VStack(alignment: .leading, spacing: 10) { + if family == .systemSmall { + smallView + } else { + mediumView + } + } + .padding() + } + } + + var smallView: some View { + VStack(alignment: .leading, spacing: 8) { + HStack { + Image(systemName: "book.fill") + .foregroundColor(.blue) + Text("Next Class") + .font(.headline) + } + + if let firstClass = entry.courses.first { + Text(firstClass.name) + .font(.subheadline) + .fontWeight(.bold) + .lineLimit(2) + Text("\(firstClass.startTime) - \(firstClass.endTime)") + .font(.caption) + .foregroundColor(.secondary) + Text(firstClass.location) + .font(.caption) + .foregroundColor(.secondary) + } else { + Text("No more classes today! 🎉") + .font(.subheadline) + .foregroundColor(.secondary) + } + } + } + + var mediumView: some View { + HStack(alignment: .top, spacing: 16) { + // Left Side: Schedule + VStack(alignment: .leading, spacing: 8) { + HStack { + Image(systemName: "calendar") + .foregroundColor(.blue) + Text("Today's Classes") + .font(.headline) + } + + if entry.courses.isEmpty { + Text("Free day! 🎉") + .font(.subheadline) + .foregroundColor(.secondary) + } else { + ForEach(entry.courses.prefix(2)) { course in + VStack(alignment: .leading, spacing: 2) { + Text(course.name) + .font(.subheadline) + .fontWeight(.medium) + .lineLimit(1) + Text("\(course.startTime) | \(course.location)") + .font(.caption2) + .foregroundColor(.secondary) + } + } + } + } + .frame(maxWidth: .infinity, alignment: .leading) + + Divider() + + // Right Side: Assignments + VStack(alignment: .leading, spacing: 8) { + HStack { + Image(systemName: "doc.text.fill") + .foregroundColor(.orange) + Text("Pending Work") + .font(.headline) + } + + if entry.assignments.isEmpty { + Text("All caught up! ✅") + .font(.subheadline) + .foregroundColor(.secondary) + } else { + ForEach(entry.assignments.prefix(2)) { assignment in + VStack(alignment: .leading, spacing: 2) { + Text(assignment.title) + .font(.subheadline) + .fontWeight(.medium) + .lineLimit(1) + Text(assignment.course) + .font(.caption2) + .foregroundColor(.secondary) + .lineLimit(1) + } + } + } + } + .frame(maxWidth: .infinity, alignment: .leading) } } } @@ -59,30 +146,70 @@ struct TechPieWidget: Widget { let kind: String = "TechPieWidget" var body: some WidgetConfiguration { - AppIntentConfiguration(kind: kind, intent: ConfigurationAppIntent.self, provider: Provider()) { entry in - TechPieWidgetEntryView(entry: entry) - .containerBackground(.fill.tertiary, for: .widget) + StaticConfiguration(kind: kind, provider: Provider()) { entry in + if #available(iOS 17.0, *) { + TechPieWidgetEntryView(entry: entry) + .containerBackground(Color(UIColor.systemBackground), for: .widget) + } else { + TechPieWidgetEntryView(entry: entry) + .background(Color(UIColor.systemBackground)) + } } + .configurationDisplayName("TechPie Tracker") + .description("Track your daily schedule and pending assignments.") + .supportedFamilies([.systemSmall, .systemMedium]) } } -extension ConfigurationAppIntent { - fileprivate static var smiley: ConfigurationAppIntent { - let intent = ConfigurationAppIntent() - intent.favoriteEmoji = "😀" - return intent +// MARK: - Data Models + +struct Course: Codable, Identifiable { + var id: String { name + startTime } + let name: String + let location: String + let startTime: String + let endTime: String +} + +struct Assignment: Codable, Identifiable { + var id: String { title + course } + let title: String + let course: String + let due: String +} + +class WidgetDataManager { + static let shared = WidgetDataManager() + // IMPORTANT: Match this with your App Group ID configured in Xcode + let appGroupID = "group.com.example.techpie" + + var courses: [Course] { + guard let defaults = UserDefaults(suiteName: appGroupID), + let dataString = defaults.string(forKey: "schedule_data"), + let data = dataString.data(using: .utf8) else { + return [] + } + + do { + return try JSONDecoder().decode([Course].self, from: data) + } catch { + print("Error decoding courses: \(error)") + return [] + } } - fileprivate static var starEyes: ConfigurationAppIntent { - let intent = ConfigurationAppIntent() - intent.favoriteEmoji = "🤩" - return intent + var assignments: [Assignment] { + guard let defaults = UserDefaults(suiteName: appGroupID), + let dataString = defaults.string(forKey: "assignment_data"), + let data = dataString.data(using: .utf8) else { + return [] + } + + do { + return try JSONDecoder().decode([Assignment].self, from: data) + } catch { + print("Error decoding assignments: \(error)") + return [] + } } } - -#Preview(as: .systemSmall) { - TechPieWidget() -} timeline: { - SimpleEntry(date: .now, configuration: .smiley) - SimpleEntry(date: .now, configuration: .starEyes) -} diff --git a/ios/TechPieWidget/TechPieWidgetBundle.swift b/ios/TechPieWidget/TechPieWidgetBundle.swift index 39efe93..64449a7 100644 --- a/ios/TechPieWidget/TechPieWidgetBundle.swift +++ b/ios/TechPieWidget/TechPieWidgetBundle.swift @@ -12,7 +12,5 @@ import SwiftUI struct TechPieWidgetBundle: WidgetBundle { var body: some Widget { TechPieWidget() - TechPieWidgetControl() - TechPieWidgetLiveActivity() } } diff --git a/ios/TechPieWidgetExtension.entitlements b/ios/TechPieWidgetExtension.entitlements index 0c67376..fbb0586 100644 --- a/ios/TechPieWidgetExtension.entitlements +++ b/ios/TechPieWidgetExtension.entitlements @@ -1,5 +1,10 @@ - + + com.apple.security.application-groups + + group.com.example.techpie + + diff --git a/lib/services/assignment_service.dart b/lib/services/assignment_service.dart index e6430ef..794dbaf 100644 --- a/lib/services/assignment_service.dart +++ b/lib/services/assignment_service.dart @@ -14,6 +14,7 @@ import 'http_client.dart'; import 'schedule_service.dart'; import 'storage_service.dart'; import 'third_party_auth_service.dart'; +import 'widget_sync_service.dart'; class AssignmentService extends ChangeNotifier { final StorageService _storage; @@ -104,13 +105,16 @@ class AssignmentService extends ChangeNotifier { } _assignments = raw.map((e) => Assignment.fromJson(e)).toList() ..sort((a, b) => a.due.compareTo(b.due)); + _syncWidget(); notifyListeners(); } // -- Override mutators -- - Future _persistOverrides() => - _storage.saveAssignmentOverrides(_overrides); + Future _persistOverrides() async { + await _storage.saveAssignmentOverrides(_overrides); + _syncWidget(); + } Future setCompleted(Assignment a, bool completed) async { _overrides.completed[AssignmentOverrides.keyFor(a)] = completed; @@ -221,6 +225,7 @@ class AssignmentService extends ChangeNotifier { await _storage.saveCachedAssignments( merged.map((a) => a.toJson()).toList(), ); + _syncWidget(); } catch (e) { _error = '同步失败,请检查网络或稍后重试'; } finally { @@ -289,6 +294,7 @@ class AssignmentService extends ChangeNotifier { await _storage.saveCachedAssignments( merged.map((a) => a.toJson()).toList(), ); + _syncWidget(); } catch (e) { _error = e.toString(); } @@ -567,4 +573,11 @@ class AssignmentService extends ChangeNotifier { ? (baseCookies.isNotEmpty ? '$baseCookies; CASTGC=$tgc' : 'CASTGC=$tgc') : baseCookies; } + + void _syncWidget() { + try { + WidgetSyncService.syncAssignments(_assignments, _overrides); + } catch (_) {} + } } + diff --git a/lib/services/schedule_service.dart b/lib/services/schedule_service.dart index 8219edf..9d49736 100644 --- a/lib/services/schedule_service.dart +++ b/lib/services/schedule_service.dart @@ -8,6 +8,7 @@ import 'api_base_url.dart'; import 'auth_service.dart'; import 'http_client.dart'; import 'storage_service.dart'; +import 'widget_sync_service.dart'; class ScheduleService extends ChangeNotifier { final StorageService _storage; @@ -62,6 +63,7 @@ class ScheduleService extends ChangeNotifier { _courseTable = _storage.loadCourseTable(_selectedSemesterId!); } _termBegin = _storage.loadTermBegin(_selectedSemesterId ?? ''); + _syncWidget(); notifyListeners(); } @@ -128,6 +130,7 @@ class ScheduleService extends ChangeNotifier { data['data'] as Map, ); await _storage.saveCourseTable(semesterId, _courseTable!); + _syncWidget(); notifyListeners(); } @@ -240,4 +243,13 @@ class ScheduleService extends ChangeNotifier { return resp; } + + void _syncWidget() { + if (_courseTable != null) { + try { + WidgetSyncService.syncSchedule(_courseTable!, currentWeek()); + } catch (_) {} + } + } } + diff --git a/lib/services/widget_sync_service.dart b/lib/services/widget_sync_service.dart new file mode 100644 index 0000000..ea61d8c --- /dev/null +++ b/lib/services/widget_sync_service.dart @@ -0,0 +1,65 @@ +import 'dart:convert'; +import 'package:home_widget/home_widget.dart'; +import '../models/course_table.dart'; +import '../models/course.dart'; +import '../models/assignment.dart'; +import '../models/assignment_overrides.dart'; + +class WidgetSyncService { + static const String _groupId = 'group.com.example.techpie'; + // IMPORTANT: Ensure this matches the App Group identifier configured in Xcode + + static Future syncSchedule(CourseTable table, int currentWeek) async { + final now = DateTime.now(); + final weekday = now.weekday; // 1 = Mon, 7 = Sun + + // Convert to display courses, filtering for current week + final displayCourses = eamsToDisplayCourses(table.courses, currentWeek); + + // Get today's active courses, sorted by period + final todayCourses = displayCourses + .where((c) => c.dayOfWeek == weekday && !c.isGhost) + .toList(); + todayCourses.sort((a, b) => a.startPeriod.compareTo(b.startPeriod)); + + final coursesJson = todayCourses.map((c) { + final startTime = defaultPeriods.firstWhere((p) => p.number == c.startPeriod, orElse: () => const Period(number: 0, startTime: '', endTime: '')).startTime; + final endTime = defaultPeriods.firstWhere((p) => p.number == c.endPeriod, orElse: () => const Period(number: 0, startTime: '', endTime: '')).endTime; + return { + 'name': c.name, + 'location': c.location, + 'startTime': startTime, + 'endTime': endTime, + }; + }).toList(); + + await HomeWidget.setAppGroupId(_groupId); + await HomeWidget.saveWidgetData('schedule_data', jsonEncode(coursesJson)); + await HomeWidget.updateWidget(name: 'TechPieWidget', iOSName: 'TechPieWidget'); + } + + static Future syncAssignments(List assignments, AssignmentOverrides overrides) async { + final now = DateTime.now(); + + final pending = assignments.where((a) { + if (overrides.isHidden(a)) return false; + if (overrides.effectiveCompleted(a)) return false; + return a.due.isAfter(now); + }).toList(); + + pending.sort((a, b) => a.due.compareTo(b.due)); + final topPending = pending.take(3).toList(); + + final assignmentsJson = topPending.map((a) { + return { + 'title': a.title, + 'course': a.course, + 'due': a.due.toIso8601String(), + }; + }).toList(); + + await HomeWidget.setAppGroupId(_groupId); + await HomeWidget.saveWidgetData('assignment_data', jsonEncode(assignmentsJson)); + await HomeWidget.updateWidget(name: 'TechPieWidget', iOSName: 'TechPieWidget'); + } +} diff --git a/pubspec.lock b/pubspec.lock index c6b48fa..f69e1af 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,16 +5,16 @@ packages: dependency: "direct main" description: name: animations - sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb - url: "https://pub.flutter-io.cn" + sha256: "9cb469212ea51be27097f23b519d594c01171721347b55df9334fff653659e7f" + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.2.0" archive: dependency: transitive description: name: archive sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.9" args: @@ -22,103 +22,119 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.7.0" async: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.flutter-io.cn" + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.13.1" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.flutter-io.cn" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.flutter-io.cn" + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" checked_yaml: dependency: transitive description: name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.flutter-io.cn" + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.4" cli_util: dependency: transitive description: name: cli_util sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.4.2" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.flutter-io.cn" + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 + url: "https://pub.dev" + source: hosted + version: "1.2.1" collection: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf - url: "https://pub.flutter-io.cn" + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "3.0.7" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.flutter-io.cn" + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "1.0.9" dynamic_color: dependency: "direct main" description: name: dynamic_color sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.7.0" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.flutter-io.cn" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.3" ffi: dependency: transitive description: name: ffi - sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" - url: "https://pub.flutter-io.cn" + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.2.0" file: dependency: transitive description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.1" flutter: @@ -131,7 +147,7 @@ packages: description: name: flutter_launcher_icons sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.14.4" flutter_lints: @@ -139,7 +155,7 @@ packages: description: name: flutter_lints sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.0.0" flutter_secure_storage: @@ -147,7 +163,7 @@ packages: description: name: flutter_secure_storage sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "9.2.4" flutter_secure_storage_linux: @@ -155,7 +171,7 @@ packages: description: name: flutter_secure_storage_linux sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.3" flutter_secure_storage_macos: @@ -163,7 +179,7 @@ packages: description: name: flutter_secure_storage_macos sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.3" flutter_secure_storage_ohos: @@ -180,7 +196,7 @@ packages: description: name: flutter_secure_storage_platform_interface sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.2" flutter_secure_storage_web: @@ -188,7 +204,7 @@ packages: description: name: flutter_secure_storage_web sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.1" flutter_secure_storage_windows: @@ -196,7 +212,7 @@ packages: description: name: flutter_secure_storage_windows sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.2" flutter_test: @@ -214,15 +230,31 @@ packages: description: name: fullscreen_window sha256: "262a19366157542c3e1fa07232ee7e8a5c82e5223d912b04a2771c47aa6a048d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.1" + home_widget: + dependency: "direct main" + description: + name: home_widget + sha256: fece84c7464099873c3ace38394ad7053509a4b0e36e57a1105a6aa31f47f23c + url: "https://pub.dev" + source: hosted + version: "0.9.3" + hooks: + dependency: transitive + description: + name: hooks + sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" + url: "https://pub.dev" + source: hosted + version: "2.0.2" http: dependency: "direct main" description: name: http sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.6.0" http_parser: @@ -230,105 +262,145 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.2" image: dependency: transitive description: name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce - url: "https://pub.flutter-io.cn" + sha256: "6300175e00616bbc832e2fc91bfa4d776af5402c81c7151bee6905bb08473c52" + url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "4.9.1" intl: dependency: "direct main" description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.20.2" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" js: dependency: transitive description: name: js sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.6.7" json_annotation: dependency: transitive description: name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.flutter-io.cn" + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + url: "https://pub.dev" source: hosted - version: "4.9.0" + version: "4.12.0" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" - url: "https://pub.flutter-io.cn" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" - url: "https://pub.flutter-io.cn" + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.flutter-io.cn" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: name: lints sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.1.1" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" matcher: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.flutter-io.cn" + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.19" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.flutter-io.cn" + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 - url: "https://pub.flutter-io.cn" + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.17.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" + url: "https://pub.dev" + source: hosted + version: "9.4.1" open_filex: dependency: "direct main" description: name: open_filex sha256: "9976da61b6a72302cf3b1efbce259200cd40232643a467aac7370addf94d6900" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.7.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" package_info_plus: dependency: "direct main" description: @@ -343,47 +415,47 @@ packages: description: name: package_info_plus_platform_interface sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.1" path: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.flutter-io.cn" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_provider: dependency: "direct main" description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.5" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 - url: "https://pub.flutter-io.cn" + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" source: hosted - version: "2.2.17" + version: "2.3.1" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.flutter-io.cn" + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.6.0" path_provider_linux: dependency: transitive description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -391,7 +463,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" path_provider_windows: @@ -399,23 +471,23 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.0" petitparser: dependency: transitive description: name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.flutter-io.cn" + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "7.0.2" platform: dependency: transitive description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.6" plugin_platform_interface: @@ -423,7 +495,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.8" posix: @@ -431,39 +503,55 @@ packages: description: name: posix sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.5.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + record_use: + dependency: transitive + description: + name: record_use + sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + url: "https://pub.dev" + source: hosted + version: "0.6.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.flutter-io.cn" + sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf + url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.5" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "5bcf0772a761b04f8c6bf814721713de6f3e5d9d89caf8d3fe031b02a342379e" - url: "https://pub.flutter-io.cn" + sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 + url: "https://pub.dev" source: hosted - version: "2.4.11" + version: "2.4.23" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.flutter-io.cn" + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" + url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.6" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" shared_preferences_ohos: @@ -479,16 +567,16 @@ packages: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.flutter-io.cn" + sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" + url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" shared_preferences_web: dependency: transitive description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.3" shared_preferences_windows: @@ -496,7 +584,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" sky_engine: @@ -508,56 +596,56 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.flutter-io.cn" + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.2" stack_trace: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" - url: "https://pub.flutter-io.cn" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.flutter-io.cn" + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" - url: "https://pub.flutter-io.cn" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.flutter-io.cn" + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" - url: "https://pub.flutter-io.cn" + sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" + url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.10" typed_data: dependency: transitive description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" url_launcher: @@ -565,41 +653,41 @@ packages: description: name: url_launcher sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.3.2" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "0aedad096a85b49df2e4725fa32118f9fa580f3b14af7a2d2221896a02cd5656" - url: "https://pub.flutter-io.cn" + sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" + url: "https://pub.dev" source: hosted - version: "6.3.17" + version: "6.3.30" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" - url: "https://pub.flutter-io.cn" + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" + url: "https://pub.dev" source: hosted - version: "6.3.3" + version: "6.4.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" - url: "https://pub.flutter-io.cn" + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" - url: "https://pub.flutter-io.cn" + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" source: hosted - version: "3.2.2" + version: "3.2.5" url_launcher_ohos: dependency: "direct overridden" description: @@ -614,47 +702,47 @@ packages: description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" - url: "https://pub.flutter-io.cn" + sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" + url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" - url: "https://pub.flutter-io.cn" + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.flutter-io.cn" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b - url: "https://pub.flutter-io.cn" + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "15.2.0" web: dependency: "direct main" description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" webview_flutter: @@ -670,8 +758,8 @@ packages: dependency: transitive description: path: "packages/webview_flutter/webview_flutter_android" - ref: "br_webview_flutter-v4.13.0_ohos" - resolved-ref: "8d70938aa190eb7d7cd4d66f0d16fddb3c2d03ba" + ref: de942e79c9057b32ad31106508bd87c0d60aef83 + resolved-ref: de942e79c9057b32ad31106508bd87c0d60aef83 url: "https://gitcode.com/openharmony-tpc/flutter_packages.git" source: git version: "4.7.0" @@ -679,8 +767,8 @@ packages: dependency: transitive description: path: "packages/webview_flutter/webview_flutter_ohos" - ref: "br_webview_flutter-v4.13.0_ohos" - resolved-ref: "8d70938aa190eb7d7cd4d66f0d16fddb3c2d03ba" + ref: de942e79c9057b32ad31106508bd87c0d60aef83 + resolved-ref: de942e79c9057b32ad31106508bd87c0d60aef83 url: "https://gitcode.com/openharmony-tpc/flutter_packages.git" source: git version: "4.7.0" @@ -697,8 +785,8 @@ packages: dependency: transitive description: path: "packages/webview_flutter/webview_flutter_wkwebview" - ref: "br_webview_flutter-v4.13.0_ohos" - resolved-ref: "8d70938aa190eb7d7cd4d66f0d16fddb3c2d03ba" + ref: de942e79c9057b32ad31106508bd87c0d60aef83 + resolved-ref: de942e79c9057b32ad31106508bd87c0d60aef83 url: "https://gitcode.com/openharmony-tpc/flutter_packages.git" source: git version: "3.22.0" @@ -707,41 +795,41 @@ packages: description: name: webview_win_floating sha256: "40b4f6c66554d3eb9c486952b5c072e2478f9471f64e6d63e92ddc4e527b7aa8" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.3" win32: dependency: transitive description: name: win32 - sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e - url: "https://pub.flutter-io.cn" + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" source: hosted - version: "5.10.1" + version: "5.15.0" xdg_directories: dependency: transitive description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" xml: dependency: transitive description: name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.flutter-io.cn" + sha256: "67f0aff7be013d107995e9b75bf4e7f2c3ef2dfdb2c8e68024bba0a7fd5756a4" + url: "https://pub.dev" source: hosted - version: "6.5.0" + version: "7.0.1" yaml: dependency: transitive description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.3" sdks: - dart: ">=3.6.2 <4.0.0" - flutter: ">=3.27.0" + dart: ">=3.11.0 <4.0.0" + flutter: ">=3.38.4" diff --git a/pubspec.yaml b/pubspec.yaml index 4cba3ee..fb089c1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,6 +41,7 @@ dependencies: url: https://gitcode.com/openharmony-sig/fluttertpc_flutter_secure_storage.git path: flutter_secure_storage_ohos ref: br_v9.2.2_ohos + home_widget: ^0.9.3 http: ^1.4.0 intl: ^0.20.2 open_filex: ^4.5.0 From 5287e7ffcd4182c34835b55599d92cd0912f5d87 Mon Sep 17 00:00:00 2001 From: MaoTechh Date: Thu, 11 Jun 2026 21:16:19 +0800 Subject: [PATCH 03/11] fix: dart version(widget) --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index f69e1af..6bda2bf 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -237,10 +237,10 @@ packages: dependency: "direct main" description: name: home_widget - sha256: fece84c7464099873c3ace38394ad7053509a4b0e36e57a1105a6aa31f47f23c + sha256: "7a32f7d6a3afd542126fb0004acba939a41ee57d874172926212774fbce684d3" url: "https://pub.dev" source: hosted - version: "0.9.3" + version: "0.9.2" hooks: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index fb089c1..d67fa2f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,7 +41,7 @@ dependencies: url: https://gitcode.com/openharmony-sig/fluttertpc_flutter_secure_storage.git path: flutter_secure_storage_ohos ref: br_v9.2.2_ohos - home_widget: ^0.9.3 + home_widget: 0.9.2 http: ^1.4.0 intl: ^0.20.2 open_filex: ^4.5.0 From 1717396f3d93febd78ccbe6a2dcd57fd517793c2 Mon Sep 17 00:00:00 2001 From: MaoTechh Date: Thu, 11 Jun 2026 22:37:05 +0800 Subject: [PATCH 04/11] refactor: wrap widget sync calls in unawaited to prevent blocking execution flow --- lib/services/assignment_service.dart | 2 +- lib/services/schedule_service.dart | 3 ++- lib/services/widget_sync_service.dart | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/services/assignment_service.dart b/lib/services/assignment_service.dart index 794dbaf..9ff7bd1 100644 --- a/lib/services/assignment_service.dart +++ b/lib/services/assignment_service.dart @@ -576,7 +576,7 @@ class AssignmentService extends ChangeNotifier { void _syncWidget() { try { - WidgetSyncService.syncAssignments(_assignments, _overrides); + unawaited(WidgetSyncService.syncAssignments(_assignments, _overrides)); } catch (_) {} } } diff --git a/lib/services/schedule_service.dart b/lib/services/schedule_service.dart index 9d49736..6a40b23 100644 --- a/lib/services/schedule_service.dart +++ b/lib/services/schedule_service.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'package:flutter/foundation.dart'; @@ -247,7 +248,7 @@ class ScheduleService extends ChangeNotifier { void _syncWidget() { if (_courseTable != null) { try { - WidgetSyncService.syncSchedule(_courseTable!, currentWeek()); + unawaited(WidgetSyncService.syncSchedule(_courseTable!, currentWeek())); } catch (_) {} } } diff --git a/lib/services/widget_sync_service.dart b/lib/services/widget_sync_service.dart index ea61d8c..45f1a92 100644 --- a/lib/services/widget_sync_service.dart +++ b/lib/services/widget_sync_service.dart @@ -1,9 +1,11 @@ import 'dart:convert'; + import 'package:home_widget/home_widget.dart'; -import '../models/course_table.dart'; -import '../models/course.dart'; + import '../models/assignment.dart'; import '../models/assignment_overrides.dart'; +import '../models/course.dart'; +import '../models/course_table.dart'; class WidgetSyncService { static const String _groupId = 'group.com.example.techpie'; From 4981fa7bdd5d8217503468611b392833aa5f4f79 Mon Sep 17 00:00:00 2001 From: Honahec Date: Fri, 12 Jun 2026 11:48:42 +0800 Subject: [PATCH 05/11] docs: update iOS Deployment Target version --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b36a8ff..19faf71 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -
TechPie logo @@ -78,12 +77,12 @@ export HOS_SDK_HOME="$HOME/dev/command-line-tools/sdk" - macOS - Xcode - CocoaPods -- iOS Deployment Target 13.0 +- iOS Deployment Target 14.0 ### HarmonyOS - Flutter (OHOS patch) 3.27.5-ohos-1.0.5 -- [Huawei Command Tools 6.1.1 Beta1](https://developer.huawei.com/consumer/cn/download/command-line-tools-for-hmos) +- [Huawei Command Tools 6.1.1 Beta1](https://developer.huawei.com/consumer/cn/download/command-line-tools-for-hmos) ## License From 1deaf32a9e441db12cb1a0cb942b5de3c85cf0ff Mon Sep 17 00:00:00 2001 From: MaoTechh Date: Fri, 12 Jun 2026 14:24:39 +0800 Subject: [PATCH 06/11] fix: address PR feedback and copilot suggestions --- .../NativeGlass/NativeGlassButton.swift | 7 - .../NativeGlassConfirmationButton.swift | 7 - .../NativeGlass/NativeGlassDropdownMenu.swift | 4 - .../NativeGlass/NativeGlassSelect.swift | 4 - .../NativeGlass/NativeNavigationBar.swift | 4 - ios/TechPieWidget/TechPieWidget.swift | 2 +- lib/services/assignment_service.dart | 4 +- lib/services/schedule_service.dart | 4 +- lib/services/widget_sync_service.dart | 106 ++++--- pubspec.lock | 264 ++++++------------ 10 files changed, 157 insertions(+), 249 deletions(-) diff --git a/ios/Runner/NativeGlass/NativeGlassButton.swift b/ios/Runner/NativeGlass/NativeGlassButton.swift index f5d7d0e..ed9b9d2 100644 --- a/ios/Runner/NativeGlass/NativeGlassButton.swift +++ b/ios/Runner/NativeGlass/NativeGlassButton.swift @@ -116,17 +116,10 @@ final class NativeGlassButtonPlatformView: NSObject, FlutterPlatformView { @available(iOS 26.0, *) private func applyLiquidGlassAppearance(image: UIImage?) { -#if compiler(>=7.0) var configuration = UIButton.Configuration.prominentGlass() configuration.image = image button.configuration = configuration -#else - var configuration = UIButton.Configuration.filled() - configuration.image = image - - button.configuration = configuration -#endif } @available(iOS 15.0, *) diff --git a/ios/Runner/NativeGlass/NativeGlassConfirmationButton.swift b/ios/Runner/NativeGlass/NativeGlassConfirmationButton.swift index 84a330f..71a9ab6 100644 --- a/ios/Runner/NativeGlass/NativeGlassConfirmationButton.swift +++ b/ios/Runner/NativeGlass/NativeGlassConfirmationButton.swift @@ -143,17 +143,10 @@ final class NativeGlassConfirmationButtonPlatformView: NSObject, FlutterPlatform private func applyLiquidGlassAppearance() { let image = symbolImage(named: sfSymbol) -#if compiler(>=7.0) var configuration: UIButton.Configuration = label == nil || label?.isEmpty == true ? .clearGlass() : .glass() -#else - var configuration: UIButton.Configuration = - label == nil || label?.isEmpty == true - ? .plain() - : .filled() -#endif configuration.image = image configuration.title = label if destructive { diff --git a/ios/Runner/NativeGlass/NativeGlassDropdownMenu.swift b/ios/Runner/NativeGlass/NativeGlassDropdownMenu.swift index 188f557..9ff6838 100644 --- a/ios/Runner/NativeGlass/NativeGlassDropdownMenu.swift +++ b/ios/Runner/NativeGlass/NativeGlassDropdownMenu.swift @@ -124,11 +124,7 @@ final class NativeGlassDropdownMenuPlatformView: NSObject, FlutterPlatformView { let image = symbolImage(named: sfSymbol) if #available(iOS 26.0, *) { -#if compiler(>=7.0) var configuration = UIButton.Configuration.glass() -#else - var configuration = UIButton.Configuration.filled() -#endif configuration.image = image configuration.title = label button.configuration = configuration diff --git a/ios/Runner/NativeGlass/NativeGlassSelect.swift b/ios/Runner/NativeGlass/NativeGlassSelect.swift index fb2ff11..b3ac46b 100644 --- a/ios/Runner/NativeGlass/NativeGlassSelect.swift +++ b/ios/Runner/NativeGlass/NativeGlassSelect.swift @@ -136,11 +136,7 @@ final class NativeGlassSelectPlatformView: NSObject, FlutterPlatformView { let image = symbolImage(named: sfSymbol) if #available(iOS 26.0, *) { -#if compiler(>=7.0) var configuration = UIButton.Configuration.glass() -#else - var configuration = UIButton.Configuration.filled() -#endif configuration.image = image configuration.title = selectedLabel button.configuration = configuration diff --git a/ios/Runner/NativeGlass/NativeNavigationBar.swift b/ios/Runner/NativeGlass/NativeNavigationBar.swift index 33efa9b..243ef9c 100644 --- a/ios/Runner/NativeGlass/NativeNavigationBar.swift +++ b/ios/Runner/NativeGlass/NativeNavigationBar.swift @@ -110,12 +110,10 @@ final class NativeNavigationBarPlatformView: NSObject, FlutterPlatformView { navigationItem.title = configuration.title navigationItem.largeTitleDisplayMode = configuration.largeTitleMode ? .always : .never -#if compiler(>=7.0) if #available(iOS 26.0, *) { navigationItem.subtitle = configuration.largeTitleMode ? nil : configuration.subtitle navigationItem.largeSubtitle = configuration.largeTitleMode ? configuration.subtitle : nil } -#endif if #available(iOS 16.0, *) { navigationItem.leadingItemGroups = [] @@ -167,11 +165,9 @@ final class NativeNavigationBarPlatformView: NSObject, FlutterPlatformView { if #available(iOS 16.0, *) { barButtonItem.isHidden = item.hidden } -#if compiler(>=7.0) if #available(iOS 26.0, *) { barButtonItem.identifier = item.id } -#endif return barButtonItem } diff --git a/ios/TechPieWidget/TechPieWidget.swift b/ios/TechPieWidget/TechPieWidget.swift index c813268..7704427 100644 --- a/ios/TechPieWidget/TechPieWidget.swift +++ b/ios/TechPieWidget/TechPieWidget.swift @@ -19,7 +19,7 @@ struct Provider: TimelineProvider { assignments: WidgetDataManager.shared.assignments) // Update widget occasionally or when told by Flutter - let nextUpdate = Calendar.current.date(byAdding: .minute, value: 30, to: Date())! + let nextUpdate = Calendar.current.date(byAdding: .minute, value: 30, to: Date()) ?? Date().addingTimeInterval(30 * 60) let timeline = Timeline(entries: [entry], policy: .after(nextUpdate)) completion(timeline) } diff --git a/lib/services/assignment_service.dart b/lib/services/assignment_service.dart index 9ff7bd1..2a6d090 100644 --- a/lib/services/assignment_service.dart +++ b/lib/services/assignment_service.dart @@ -575,9 +575,7 @@ class AssignmentService extends ChangeNotifier { } void _syncWidget() { - try { - unawaited(WidgetSyncService.syncAssignments(_assignments, _overrides)); - } catch (_) {} + unawaited(WidgetSyncService.syncAssignments(_assignments, _overrides).catchError((_) {})); } } diff --git a/lib/services/schedule_service.dart b/lib/services/schedule_service.dart index 6a40b23..6e64195 100644 --- a/lib/services/schedule_service.dart +++ b/lib/services/schedule_service.dart @@ -247,9 +247,7 @@ class ScheduleService extends ChangeNotifier { void _syncWidget() { if (_courseTable != null) { - try { - unawaited(WidgetSyncService.syncSchedule(_courseTable!, currentWeek())); - } catch (_) {} + unawaited(WidgetSyncService.syncSchedule(_courseTable!, currentWeek()).catchError((_) {})); } } } diff --git a/lib/services/widget_sync_service.dart b/lib/services/widget_sync_service.dart index 45f1a92..b36e30e 100644 --- a/lib/services/widget_sync_service.dart +++ b/lib/services/widget_sync_service.dart @@ -1,5 +1,7 @@ import 'dart:convert'; +import 'dart:io' show Platform; +import 'package:flutter/foundation.dart'; import 'package:home_widget/home_widget.dart'; import '../models/assignment.dart'; @@ -12,56 +14,72 @@ class WidgetSyncService { // IMPORTANT: Ensure this matches the App Group identifier configured in Xcode static Future syncSchedule(CourseTable table, int currentWeek) async { - final now = DateTime.now(); - final weekday = now.weekday; // 1 = Mon, 7 = Sun - - // Convert to display courses, filtering for current week - final displayCourses = eamsToDisplayCourses(table.courses, currentWeek); - - // Get today's active courses, sorted by period - final todayCourses = displayCourses - .where((c) => c.dayOfWeek == weekday && !c.isGhost) - .toList(); - todayCourses.sort((a, b) => a.startPeriod.compareTo(b.startPeriod)); + if (kIsWeb || (!Platform.isIOS && !Platform.isAndroid)) return; - final coursesJson = todayCourses.map((c) { - final startTime = defaultPeriods.firstWhere((p) => p.number == c.startPeriod, orElse: () => const Period(number: 0, startTime: '', endTime: '')).startTime; - final endTime = defaultPeriods.firstWhere((p) => p.number == c.endPeriod, orElse: () => const Period(number: 0, startTime: '', endTime: '')).endTime; - return { - 'name': c.name, - 'location': c.location, - 'startTime': startTime, - 'endTime': endTime, - }; - }).toList(); + try { + final now = DateTime.now(); + final weekday = now.weekday; // 1 = Mon, 7 = Sun + + // Convert to display courses, filtering for current week + final displayCourses = eamsToDisplayCourses(table.courses, currentWeek); + + // Get today's active courses, sorted by period + final todayCourses = displayCourses + .where((c) => c.dayOfWeek == weekday && !c.isGhost) + .toList(); + todayCourses.sort((a, b) => a.startPeriod.compareTo(b.startPeriod)); - await HomeWidget.setAppGroupId(_groupId); - await HomeWidget.saveWidgetData('schedule_data', jsonEncode(coursesJson)); - await HomeWidget.updateWidget(name: 'TechPieWidget', iOSName: 'TechPieWidget'); + final periods = table.periods.isNotEmpty + ? table.periods.map((p) => p.toPeriod()).toList() + : defaultPeriods; + + final coursesJson = todayCourses.map((c) { + final startTime = periods.firstWhere((p) => p.number == c.startPeriod, orElse: () => const Period(number: 0, startTime: '', endTime: '')).startTime; + final endTime = periods.firstWhere((p) => p.number == c.endPeriod, orElse: () => const Period(number: 0, startTime: '', endTime: '')).endTime; + return { + 'name': c.name, + 'location': c.location, + 'startTime': startTime, + 'endTime': endTime, + }; + }).toList(); + + await HomeWidget.setAppGroupId(_groupId); + await HomeWidget.saveWidgetData('schedule_data', jsonEncode(coursesJson)); + await HomeWidget.updateWidget(name: 'TechPieWidget', iOSName: 'TechPieWidget'); + } catch (e) { + // Swallow platform-channel errors to avoid unhandled async exceptions + } } static Future syncAssignments(List assignments, AssignmentOverrides overrides) async { - final now = DateTime.now(); - - final pending = assignments.where((a) { - if (overrides.isHidden(a)) return false; - if (overrides.effectiveCompleted(a)) return false; - return a.due.isAfter(now); - }).toList(); - - pending.sort((a, b) => a.due.compareTo(b.due)); - final topPending = pending.take(3).toList(); + if (kIsWeb || (!Platform.isIOS && !Platform.isAndroid)) return; + + try { + final now = DateTime.now(); + + final pending = assignments.where((a) { + if (overrides.isHidden(a)) return false; + if (overrides.effectiveCompleted(a)) return false; + return a.due.isAfter(now); + }).toList(); + + pending.sort((a, b) => a.due.compareTo(b.due)); + final topPending = pending.take(3).toList(); - final assignmentsJson = topPending.map((a) { - return { - 'title': a.title, - 'course': a.course, - 'due': a.due.toIso8601String(), - }; - }).toList(); + final assignmentsJson = topPending.map((a) { + return { + 'title': a.title, + 'course': a.course, + 'due': a.due.toIso8601String(), + }; + }).toList(); - await HomeWidget.setAppGroupId(_groupId); - await HomeWidget.saveWidgetData('assignment_data', jsonEncode(assignmentsJson)); - await HomeWidget.updateWidget(name: 'TechPieWidget', iOSName: 'TechPieWidget'); + await HomeWidget.setAppGroupId(_groupId); + await HomeWidget.saveWidgetData('assignment_data', jsonEncode(assignmentsJson)); + await HomeWidget.updateWidget(name: 'TechPieWidget', iOSName: 'TechPieWidget'); + } catch (e) { + // Swallow platform-channel errors to avoid unhandled async exceptions + } } } diff --git a/pubspec.lock b/pubspec.lock index 6bda2bf..40d9f92 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: "direct main" description: name: animations - sha256: "9cb469212ea51be27097f23b519d594c01171721347b55df9334fff653659e7f" + sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.0.11" archive: dependency: transitive description: @@ -29,34 +29,34 @@ packages: dependency: transitive description: name: async - sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.13.1" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" characters: dependency: transitive description: name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.3.0" checked_yaml: dependency: transitive description: name: checked_yaml - sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.0.3" cli_util: dependency: transitive description: @@ -69,42 +69,26 @@ packages: dependency: transitive description: name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - code_assets: - dependency: transitive - description: - name: code_assets - sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.1.1" collection: dependency: transitive description: name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.19.1" - crypto: - dependency: transitive - description: - name: crypto - sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" - source: hosted - version: "3.0.7" + version: "1.19.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 url: "https://pub.dev" source: hosted - version: "1.0.9" + version: "1.0.8" dynamic_color: dependency: "direct main" description: @@ -117,18 +101,18 @@ packages: dependency: transitive description: name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" url: "https://pub.dev" source: hosted - version: "1.3.3" + version: "1.3.1" ffi: dependency: transitive description: name: ffi - sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.1.3" file: dependency: transitive description: @@ -241,14 +225,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.2" - hooks: - dependency: transitive - description: - name: hooks - sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" - url: "https://pub.dev" - source: hosted - version: "2.0.2" http: dependency: "direct main" description: @@ -269,10 +245,10 @@ packages: dependency: transitive description: name: image - sha256: "6300175e00616bbc832e2fc91bfa4d776af5402c81c7151bee6905bb08473c52" + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce url: "https://pub.dev" source: hosted - version: "4.9.1" + version: "4.8.0" intl: dependency: "direct main" description: @@ -281,22 +257,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.2" - jni: - dependency: transitive - description: - name: jni - sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f - url: "https://pub.dev" - source: hosted - version: "1.0.0" - jni_flutter: - dependency: transitive - description: - name: jni_flutter - sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" - url: "https://pub.dev" - source: hosted - version: "1.0.1" js: dependency: transitive description: @@ -309,34 +269,34 @@ packages: dependency: transitive description: name: json_annotation - sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.12.0" + version: "4.9.0" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "11.0.2" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.10" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.1" lints: dependency: transitive description: @@ -345,46 +305,30 @@ packages: url: "https://pub.dev" source: hosted version: "5.1.1" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" matcher: dependency: transitive description: name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.19" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" - url: "https://pub.dev" - source: hosted - version: "1.17.0" - objective_c: - dependency: transitive - description: - name: objective_c - sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "9.4.1" + version: "1.15.0" open_filex: dependency: "direct main" description: @@ -393,14 +337,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.7.0" - package_config: - dependency: transitive - description: - name: package_config - sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.dev" - source: hosted - version: "2.2.0" package_info_plus: dependency: "direct main" description: @@ -422,10 +358,10 @@ packages: dependency: transitive description: name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.9.0" path_provider: dependency: "direct main" description: @@ -438,18 +374,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.2.17" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.4.1" path_provider_linux: dependency: transitive description: @@ -478,10 +414,10 @@ packages: dependency: transitive description: name: petitparser - sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 url: "https://pub.dev" source: hosted - version: "7.0.2" + version: "6.0.2" platform: dependency: transitive description: @@ -506,46 +442,30 @@ packages: url: "https://pub.dev" source: hosted version: "6.5.0" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - record_use: - dependency: transitive - description: - name: record_use - sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" - url: "https://pub.dev" - source: hosted - version: "0.6.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" url: "https://pub.dev" source: hosted - version: "2.5.5" + version: "2.5.3" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 + sha256: "5bcf0772a761b04f8c6bf814721713de6f3e5d9d89caf8d3fe031b02a342379e" url: "https://pub.dev" source: hosted - version: "2.4.23" + version: "2.4.11" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" url: "https://pub.dev" source: hosted - version: "2.5.6" + version: "2.5.4" shared_preferences_linux: dependency: transitive description: @@ -567,10 +487,10 @@ packages: dependency: transitive description: name: shared_preferences_platform_interface - sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.1" shared_preferences_web: dependency: transitive description: @@ -596,50 +516,50 @@ packages: dependency: transitive description: name: source_span - sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.10.2" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.12.1" + version: "1.12.0" stream_channel: dependency: transitive description: name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.2" string_scanner: dependency: transitive description: name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.3.0" term_glyph: dependency: transitive description: name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.10" + version: "0.7.3" typed_data: dependency: transitive description: @@ -660,34 +580,34 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" + sha256: "0aedad096a85b49df2e4725fa32118f9fa580f3b14af7a2d2221896a02cd5656" url: "https://pub.dev" source: hosted - version: "6.3.30" + version: "6.3.17" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" + sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "6.3.3" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" url: "https://pub.dev" source: hosted - version: "3.2.2" + version: "3.2.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" url: "https://pub.dev" source: hosted - version: "3.2.5" + version: "3.2.2" url_launcher_ohos: dependency: "direct overridden" description: @@ -709,34 +629,34 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" url: "https://pub.dev" source: hosted - version: "2.4.3" + version: "2.4.1" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.4" vector_math: dependency: transitive description: name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.1.4" vm_service: dependency: transitive description: name: vm_service - sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "15.2.0" + version: "14.3.0" web: dependency: "direct main" description: @@ -758,8 +678,8 @@ packages: dependency: transitive description: path: "packages/webview_flutter/webview_flutter_android" - ref: de942e79c9057b32ad31106508bd87c0d60aef83 - resolved-ref: de942e79c9057b32ad31106508bd87c0d60aef83 + ref: "br_webview_flutter-v4.13.0_ohos" + resolved-ref: cd84e4ca392f666bc728c32c49fb328127058826 url: "https://gitcode.com/openharmony-tpc/flutter_packages.git" source: git version: "4.7.0" @@ -767,8 +687,8 @@ packages: dependency: transitive description: path: "packages/webview_flutter/webview_flutter_ohos" - ref: de942e79c9057b32ad31106508bd87c0d60aef83 - resolved-ref: de942e79c9057b32ad31106508bd87c0d60aef83 + ref: "br_webview_flutter-v4.13.0_ohos" + resolved-ref: cd84e4ca392f666bc728c32c49fb328127058826 url: "https://gitcode.com/openharmony-tpc/flutter_packages.git" source: git version: "4.7.0" @@ -785,8 +705,8 @@ packages: dependency: transitive description: path: "packages/webview_flutter/webview_flutter_wkwebview" - ref: de942e79c9057b32ad31106508bd87c0d60aef83 - resolved-ref: de942e79c9057b32ad31106508bd87c0d60aef83 + ref: "br_webview_flutter-v4.13.0_ohos" + resolved-ref: cd84e4ca392f666bc728c32c49fb328127058826 url: "https://gitcode.com/openharmony-tpc/flutter_packages.git" source: git version: "3.22.0" @@ -802,10 +722,10 @@ packages: dependency: transitive description: name: win32 - sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e url: "https://pub.dev" source: hosted - version: "5.15.0" + version: "5.10.1" xdg_directories: dependency: transitive description: @@ -818,10 +738,10 @@ packages: dependency: transitive description: name: xml - sha256: "67f0aff7be013d107995e9b75bf4e7f2c3ef2dfdb2c8e68024bba0a7fd5756a4" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "6.5.0" yaml: dependency: transitive description: @@ -831,5 +751,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.11.0 <4.0.0" - flutter: ">=3.38.4" + dart: ">=3.6.2 <4.0.0" + flutter: ">=3.27.0" From 1842c151fb0043e7c1f6fa5553aec6a183959c96 Mon Sep 17 00:00:00 2001 From: Honahec Date: Sun, 14 Jun 2026 21:50:13 +0800 Subject: [PATCH 07/11] fix: sync widget even if cache is empty --- lib/services/assignment_service.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/services/assignment_service.dart b/lib/services/assignment_service.dart index 2a6d090..817dd39 100644 --- a/lib/services/assignment_service.dart +++ b/lib/services/assignment_service.dart @@ -92,6 +92,7 @@ class AssignmentService extends ChangeNotifier { _error = null; await _storage.clearCachedAssignments(); notifyListeners(); + _syncWidget(); } /// Hydrate from local cache so the UI doesn't flash empty on app start @@ -101,6 +102,7 @@ class AssignmentService extends ChangeNotifier { final raw = _storage.loadCachedAssignments(); if (raw.isEmpty) { notifyListeners(); + _syncWidget(); return; } _assignments = raw.map((e) => Assignment.fromJson(e)).toList() @@ -575,7 +577,7 @@ class AssignmentService extends ChangeNotifier { } void _syncWidget() { - unawaited(WidgetSyncService.syncAssignments(_assignments, _overrides).catchError((_) {})); + unawaited(WidgetSyncService.syncAssignments(_assignments, _overrides) + .catchError((_) {})); } } - From 98efb7bc0e9bc9d4977087478ffbb36064254e26 Mon Sep 17 00:00:00 2001 From: Honahec Date: Sun, 14 Jun 2026 21:52:50 +0800 Subject: [PATCH 08/11] style: format --- lib/services/assignment_service.dart | 6 +++-- lib/services/schedule_service.dart | 4 +-- lib/services/widget_sync_service.dart | 38 ++++++++++++++++++--------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/lib/services/assignment_service.dart b/lib/services/assignment_service.dart index 817dd39..39f23f9 100644 --- a/lib/services/assignment_service.dart +++ b/lib/services/assignment_service.dart @@ -577,7 +577,9 @@ class AssignmentService extends ChangeNotifier { } void _syncWidget() { - unawaited(WidgetSyncService.syncAssignments(_assignments, _overrides) - .catchError((_) {})); + unawaited( + WidgetSyncService.syncAssignments(_assignments, _overrides) + .catchError((_) {}), + ); } } diff --git a/lib/services/schedule_service.dart b/lib/services/schedule_service.dart index 6e64195..19e8811 100644 --- a/lib/services/schedule_service.dart +++ b/lib/services/schedule_service.dart @@ -247,8 +247,8 @@ class ScheduleService extends ChangeNotifier { void _syncWidget() { if (_courseTable != null) { - unawaited(WidgetSyncService.syncSchedule(_courseTable!, currentWeek()).catchError((_) {})); + unawaited(WidgetSyncService.syncSchedule(_courseTable!, currentWeek()) + .catchError((_) {})); } } } - diff --git a/lib/services/widget_sync_service.dart b/lib/services/widget_sync_service.dart index b36e30e..c6ea105 100644 --- a/lib/services/widget_sync_service.dart +++ b/lib/services/widget_sync_service.dart @@ -10,7 +10,7 @@ import '../models/course.dart'; import '../models/course_table.dart'; class WidgetSyncService { - static const String _groupId = 'group.com.example.techpie'; + static const String _groupId = 'group.com.example.techpie'; // IMPORTANT: Ensure this matches the App Group identifier configured in Xcode static Future syncSchedule(CourseTable table, int currentWeek) async { @@ -19,23 +19,31 @@ class WidgetSyncService { try { final now = DateTime.now(); final weekday = now.weekday; // 1 = Mon, 7 = Sun - + // Convert to display courses, filtering for current week final displayCourses = eamsToDisplayCourses(table.courses, currentWeek); - + // Get today's active courses, sorted by period final todayCourses = displayCourses .where((c) => c.dayOfWeek == weekday && !c.isGhost) .toList(); todayCourses.sort((a, b) => a.startPeriod.compareTo(b.startPeriod)); - final periods = table.periods.isNotEmpty - ? table.periods.map((p) => p.toPeriod()).toList() + final periods = table.periods.isNotEmpty + ? table.periods.map((p) => p.toPeriod()).toList() : defaultPeriods; final coursesJson = todayCourses.map((c) { - final startTime = periods.firstWhere((p) => p.number == c.startPeriod, orElse: () => const Period(number: 0, startTime: '', endTime: '')).startTime; - final endTime = periods.firstWhere((p) => p.number == c.endPeriod, orElse: () => const Period(number: 0, startTime: '', endTime: '')).endTime; + final startTime = periods + .firstWhere((p) => p.number == c.startPeriod, + orElse: () => + const Period(number: 0, startTime: '', endTime: '')) + .startTime; + final endTime = periods + .firstWhere((p) => p.number == c.endPeriod, + orElse: () => + const Period(number: 0, startTime: '', endTime: '')) + .endTime; return { 'name': c.name, 'location': c.location, @@ -46,24 +54,26 @@ class WidgetSyncService { await HomeWidget.setAppGroupId(_groupId); await HomeWidget.saveWidgetData('schedule_data', jsonEncode(coursesJson)); - await HomeWidget.updateWidget(name: 'TechPieWidget', iOSName: 'TechPieWidget'); + await HomeWidget.updateWidget( + name: 'TechPieWidget', iOSName: 'TechPieWidget'); } catch (e) { // Swallow platform-channel errors to avoid unhandled async exceptions } } - static Future syncAssignments(List assignments, AssignmentOverrides overrides) async { + static Future syncAssignments( + List assignments, AssignmentOverrides overrides) async { if (kIsWeb || (!Platform.isIOS && !Platform.isAndroid)) return; try { final now = DateTime.now(); - + final pending = assignments.where((a) { if (overrides.isHidden(a)) return false; if (overrides.effectiveCompleted(a)) return false; return a.due.isAfter(now); }).toList(); - + pending.sort((a, b) => a.due.compareTo(b.due)); final topPending = pending.take(3).toList(); @@ -76,8 +86,10 @@ class WidgetSyncService { }).toList(); await HomeWidget.setAppGroupId(_groupId); - await HomeWidget.saveWidgetData('assignment_data', jsonEncode(assignmentsJson)); - await HomeWidget.updateWidget(name: 'TechPieWidget', iOSName: 'TechPieWidget'); + await HomeWidget.saveWidgetData( + 'assignment_data', jsonEncode(assignmentsJson)); + await HomeWidget.updateWidget( + name: 'TechPieWidget', iOSName: 'TechPieWidget'); } catch (e) { // Swallow platform-channel errors to avoid unhandled async exceptions } From b08e199277bc3ee4a2233c040b7b4b25d746dce4 Mon Sep 17 00:00:00 2001 From: Honahec Date: Sun, 14 Jun 2026 21:53:33 +0800 Subject: [PATCH 09/11] chore: revert package url --- pubspec.lock | 162 +++++++++++++++++++++++++-------------------------- 1 file changed, 81 insertions(+), 81 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 40d9f92..baac116 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: animations sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.11" archive: @@ -14,7 +14,7 @@ packages: description: name: archive sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.9" args: @@ -22,7 +22,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.7.0" async: @@ -30,7 +30,7 @@ packages: description: name: async sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.11.0" boolean_selector: @@ -38,7 +38,7 @@ packages: description: name: boolean_selector sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" characters: @@ -46,7 +46,7 @@ packages: description: name: characters sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" checked_yaml: @@ -54,7 +54,7 @@ packages: description: name: checked_yaml sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.3" cli_util: @@ -62,7 +62,7 @@ packages: description: name: cli_util sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.4.2" clock: @@ -70,7 +70,7 @@ packages: description: name: clock sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" collection: @@ -78,7 +78,7 @@ packages: description: name: collection sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.19.0" cupertino_icons: @@ -86,7 +86,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.8" dynamic_color: @@ -94,7 +94,7 @@ packages: description: name: dynamic_color sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.7.0" fake_async: @@ -102,7 +102,7 @@ packages: description: name: fake_async sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" ffi: @@ -110,7 +110,7 @@ packages: description: name: ffi sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" file: @@ -118,7 +118,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.1" flutter: @@ -131,7 +131,7 @@ packages: description: name: flutter_launcher_icons sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.14.4" flutter_lints: @@ -139,7 +139,7 @@ packages: description: name: flutter_lints sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.0.0" flutter_secure_storage: @@ -147,7 +147,7 @@ packages: description: name: flutter_secure_storage sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "9.2.4" flutter_secure_storage_linux: @@ -155,7 +155,7 @@ packages: description: name: flutter_secure_storage_linux sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.3" flutter_secure_storage_macos: @@ -163,7 +163,7 @@ packages: description: name: flutter_secure_storage_macos sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.3" flutter_secure_storage_ohos: @@ -180,7 +180,7 @@ packages: description: name: flutter_secure_storage_platform_interface sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" flutter_secure_storage_web: @@ -188,7 +188,7 @@ packages: description: name: flutter_secure_storage_web sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" flutter_secure_storage_windows: @@ -196,7 +196,7 @@ packages: description: name: flutter_secure_storage_windows sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.2" flutter_test: @@ -214,7 +214,7 @@ packages: description: name: fullscreen_window sha256: "262a19366157542c3e1fa07232ee7e8a5c82e5223d912b04a2771c47aa6a048d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" home_widget: @@ -222,7 +222,7 @@ packages: description: name: home_widget sha256: "7a32f7d6a3afd542126fb0004acba939a41ee57d874172926212774fbce684d3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.2" http: @@ -230,7 +230,7 @@ packages: description: name: http sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.6.0" http_parser: @@ -238,7 +238,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.2" image: @@ -246,7 +246,7 @@ packages: description: name: image sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.8.0" intl: @@ -254,7 +254,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.20.2" js: @@ -262,7 +262,7 @@ packages: description: name: js sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.6.7" json_annotation: @@ -270,7 +270,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.9.0" leak_tracker: @@ -278,7 +278,7 @@ packages: description: name: leak_tracker sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "10.0.7" leak_tracker_flutter_testing: @@ -286,7 +286,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.8" leak_tracker_testing: @@ -294,7 +294,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" lints: @@ -302,7 +302,7 @@ packages: description: name: lints sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" matcher: @@ -310,7 +310,7 @@ packages: description: name: matcher sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.12.16+1" material_color_utilities: @@ -318,7 +318,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.11.1" meta: @@ -326,7 +326,7 @@ packages: description: name: meta sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.15.0" open_filex: @@ -334,7 +334,7 @@ packages: description: name: open_filex sha256: "9976da61b6a72302cf3b1efbce259200cd40232643a467aac7370addf94d6900" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.7.0" package_info_plus: @@ -351,7 +351,7 @@ packages: description: name: package_info_plus_platform_interface sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" path: @@ -359,7 +359,7 @@ packages: description: name: path sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.9.0" path_provider: @@ -367,7 +367,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.5" path_provider_android: @@ -375,7 +375,7 @@ packages: description: name: path_provider_android sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.17" path_provider_foundation: @@ -383,7 +383,7 @@ packages: description: name: path_provider_foundation sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" path_provider_linux: @@ -391,7 +391,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -399,7 +399,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" path_provider_windows: @@ -407,7 +407,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" petitparser: @@ -415,7 +415,7 @@ packages: description: name: petitparser sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.0.2" platform: @@ -423,7 +423,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.6" plugin_platform_interface: @@ -431,7 +431,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" posix: @@ -439,7 +439,7 @@ packages: description: name: posix sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.5.0" shared_preferences: @@ -447,7 +447,7 @@ packages: description: name: shared_preferences sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.3" shared_preferences_android: @@ -455,7 +455,7 @@ packages: description: name: shared_preferences_android sha256: "5bcf0772a761b04f8c6bf814721713de6f3e5d9d89caf8d3fe031b02a342379e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.11" shared_preferences_foundation: @@ -463,7 +463,7 @@ packages: description: name: shared_preferences_foundation sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.4" shared_preferences_linux: @@ -471,7 +471,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" shared_preferences_ohos: @@ -488,7 +488,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" shared_preferences_web: @@ -496,7 +496,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.3" shared_preferences_windows: @@ -504,7 +504,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" sky_engine: @@ -517,7 +517,7 @@ packages: description: name: source_span sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.10.0" stack_trace: @@ -525,7 +525,7 @@ packages: description: name: stack_trace sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.12.0" stream_channel: @@ -533,7 +533,7 @@ packages: description: name: stream_channel sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" string_scanner: @@ -541,7 +541,7 @@ packages: description: name: string_scanner sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" term_glyph: @@ -549,7 +549,7 @@ packages: description: name: term_glyph sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" test_api: @@ -557,7 +557,7 @@ packages: description: name: test_api sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.3" typed_data: @@ -565,7 +565,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" url_launcher: @@ -573,7 +573,7 @@ packages: description: name: url_launcher sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.2" url_launcher_android: @@ -581,7 +581,7 @@ packages: description: name: url_launcher_android sha256: "0aedad096a85b49df2e4725fa32118f9fa580f3b14af7a2d2221896a02cd5656" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.17" url_launcher_ios: @@ -589,7 +589,7 @@ packages: description: name: url_launcher_ios sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.3" url_launcher_linux: @@ -597,7 +597,7 @@ packages: description: name: url_launcher_linux sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.1" url_launcher_macos: @@ -605,7 +605,7 @@ packages: description: name: url_launcher_macos sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.2" url_launcher_ohos: @@ -622,7 +622,7 @@ packages: description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.2" url_launcher_web: @@ -630,7 +630,7 @@ packages: description: name: url_launcher_web sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" url_launcher_windows: @@ -638,7 +638,7 @@ packages: description: name: url_launcher_windows sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.4" vector_math: @@ -646,7 +646,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" vm_service: @@ -654,7 +654,7 @@ packages: description: name: vm_service sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "14.3.0" web: @@ -662,7 +662,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" webview_flutter: @@ -715,7 +715,7 @@ packages: description: name: webview_win_floating sha256: "40b4f6c66554d3eb9c486952b5c072e2478f9471f64e6d63e92ddc4e527b7aa8" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.3" win32: @@ -723,7 +723,7 @@ packages: description: name: win32 sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.10.1" xdg_directories: @@ -731,7 +731,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" xml: @@ -739,7 +739,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.5.0" yaml: @@ -747,7 +747,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.3" sdks: From 64ce8aebe42db06e3d6c7c5d9866fc21f180ffdf Mon Sep 17 00:00:00 2001 From: Honahec Date: Sun, 14 Jun 2026 21:56:12 +0800 Subject: [PATCH 10/11] fix: lint --- lib/services/schedule_service.dart | 6 ++++-- lib/services/widget_sync_service.dart | 30 ++++++++++++++++++--------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/services/schedule_service.dart b/lib/services/schedule_service.dart index 19e8811..d3fae9e 100644 --- a/lib/services/schedule_service.dart +++ b/lib/services/schedule_service.dart @@ -247,8 +247,10 @@ class ScheduleService extends ChangeNotifier { void _syncWidget() { if (_courseTable != null) { - unawaited(WidgetSyncService.syncSchedule(_courseTable!, currentWeek()) - .catchError((_) {})); + unawaited( + WidgetSyncService.syncSchedule(_courseTable!, currentWeek()) + .catchError((_) {}), + ); } } } diff --git a/lib/services/widget_sync_service.dart b/lib/services/widget_sync_service.dart index c6ea105..8e356f0 100644 --- a/lib/services/widget_sync_service.dart +++ b/lib/services/widget_sync_service.dart @@ -35,14 +35,16 @@ class WidgetSyncService { final coursesJson = todayCourses.map((c) { final startTime = periods - .firstWhere((p) => p.number == c.startPeriod, - orElse: () => - const Period(number: 0, startTime: '', endTime: '')) + .firstWhere( + (p) => p.number == c.startPeriod, + orElse: () => const Period(number: 0, startTime: '', endTime: ''), + ) .startTime; final endTime = periods - .firstWhere((p) => p.number == c.endPeriod, - orElse: () => - const Period(number: 0, startTime: '', endTime: '')) + .firstWhere( + (p) => p.number == c.endPeriod, + orElse: () => const Period(number: 0, startTime: '', endTime: ''), + ) .endTime; return { 'name': c.name, @@ -55,14 +57,18 @@ class WidgetSyncService { await HomeWidget.setAppGroupId(_groupId); await HomeWidget.saveWidgetData('schedule_data', jsonEncode(coursesJson)); await HomeWidget.updateWidget( - name: 'TechPieWidget', iOSName: 'TechPieWidget'); + name: 'TechPieWidget', + iOSName: 'TechPieWidget', + ); } catch (e) { // Swallow platform-channel errors to avoid unhandled async exceptions } } static Future syncAssignments( - List assignments, AssignmentOverrides overrides) async { + List assignments, + AssignmentOverrides overrides, + ) async { if (kIsWeb || (!Platform.isIOS && !Platform.isAndroid)) return; try { @@ -87,9 +93,13 @@ class WidgetSyncService { await HomeWidget.setAppGroupId(_groupId); await HomeWidget.saveWidgetData( - 'assignment_data', jsonEncode(assignmentsJson)); + 'assignment_data', + jsonEncode(assignmentsJson), + ); await HomeWidget.updateWidget( - name: 'TechPieWidget', iOSName: 'TechPieWidget'); + name: 'TechPieWidget', + iOSName: 'TechPieWidget', + ); } catch (e) { // Swallow platform-channel errors to avoid unhandled async exceptions } From 2bb3fd4216d1e466c2728ee0e1b1c16bed9080bb Mon Sep 17 00:00:00 2001 From: Honahec Date: Sun, 14 Jun 2026 22:10:02 +0800 Subject: [PATCH 11/11] chore: flutter auto generate --- ios/Podfile.lock | 13 ++++++++++--- ios/Runner.xcodeproj/project.pbxproj | 25 ++++++++++++++++--------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2fde109..ec25b3f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -8,6 +8,9 @@ PODS: - Flutter - package_info_plus (0.4.5): - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS @@ -23,6 +26,7 @@ DEPENDENCIES: - home_widget (from `.symlinks/plugins/home_widget/ios`) - open_filex (from `.symlinks/plugins/open_filex/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`) @@ -38,6 +42,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/open_filex/ios" package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" url_launcher_ios: @@ -46,13 +52,14 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin" SPEC CHECKSUMS: - Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 home_widget: 54b4f6b36ed8d64cfee594a476225c35c3e45091 open_filex: 432f3cd11432da3e39f47fcc0df2b1603854eff1 package_info_plus: 566e1b7a2f3900e4b0020914ad3fc051dcc95596 - shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb - url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + url_launcher_ios: 694010445543906933d732453a59da0a173ae33d webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2 PODFILE CHECKSUM: e30f02f9d1c72c47bb6344a0a748c9d268180865 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 47048bb..ae58d88 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 70; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -122,7 +122,7 @@ /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - AE1A353D2FDAC804007C86E7 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + AE1A353D2FDAC804007C86E7 /* Exceptions for "TechPieWidget" folder in "TechPieWidgetExtension" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( Info.plist, @@ -132,7 +132,18 @@ /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ - AE1A35282FDAC803007C86E7 /* TechPieWidget */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (AE1A353D2FDAC804007C86E7 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = TechPieWidget; sourceTree = ""; }; + AE1A35282FDAC803007C86E7 /* TechPieWidget */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + AE1A353D2FDAC804007C86E7 /* Exceptions for "TechPieWidget" folder in "TechPieWidgetExtension" target */, + ); + explicitFileTypes = { + }; + explicitFolders = ( + ); + path = TechPieWidget; + sourceTree = ""; + }; /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ @@ -373,7 +384,7 @@ ); mainGroup = 97C146E51CF9000F007C117D; packageReferences = ( - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; @@ -423,14 +434,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; @@ -1035,7 +1042,7 @@ /* End XCConfigurationList section */ /* Begin XCLocalSwiftPackageReference section */ - 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { isa = XCLocalSwiftPackageReference; relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; };