From 8e9f5ccc06736dfdc1b269de784b330d999d9d54 Mon Sep 17 00:00:00 2001 From: koukibadr Date: Mon, 31 Aug 2026 10:48:24 +0300 Subject: [PATCH] config: upgrade flutter version to support flutter decoupling --- .../workflows/pr_verification_pipeline.yml | 3 ++ analysis_options.yaml | 3 ++ example/analysis_options.yaml | 9 ++++++ example/ios/Podfile | 2 +- example/ios/Runner.xcodeproj/project.pbxproj | 28 +++++++++++++++++-- .../xcshareddata/xcschemes/Runner.xcscheme | 18 ++++++++++++ example/lib/main.dart | 4 +-- example/lib/pages/home_page.dart | 2 +- example/lib/widgets/movie_card.dart | 2 +- .../lib/widgets/movie_details_sidebar.dart | 2 +- example/pubspec.yaml | 1 + example/test/widget_test.dart | 2 +- lib/extensions/color_scheme_extensions.dart | 2 +- lib/flutter_skin.dart | 10 +++++-- lib/models/skin_model.dart | 2 +- lib/remote/fskin_remote_config.dart | 7 ++++- lib/services/cache_service.dart | 6 ++++ lib/services/skin_service.dart | 8 +++++- pubspec.yaml | 1 + test/flutter_skin/flutter_skin_init_test.dart | 2 +- ...flutter_skin_integration_with_service.dart | 2 +- test/mocks/skin_model_mocks.dart | 2 +- 22 files changed, 99 insertions(+), 19 deletions(-) diff --git a/.github/workflows/pr_verification_pipeline.yml b/.github/workflows/pr_verification_pipeline.yml index 8d51d2d..cffe5c0 100644 --- a/.github/workflows/pr_verification_pipeline.yml +++ b/.github/workflows/pr_verification_pipeline.yml @@ -60,5 +60,8 @@ jobs: - name: Install dependencies run: flutter pub get + - name: Reset any SDK-generated file changes + run: git checkout -- . + - name: Check Publish Warnings run: dart pub publish --dry-run \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml index a5744c1..e46654b 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,3 +1,6 @@ +analyzer: + exclude: + - build/** include: package:flutter_lints/flutter.yaml # Additional information about this file can be found at diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml index 0d29021..bf8d421 100644 --- a/example/analysis_options.yaml +++ b/example/analysis_options.yaml @@ -7,6 +7,15 @@ # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. +analyzer: + exclude: + - build/** + - android/** + - ios/** + - web/** + - windows/** + - macos/** + - linux/** include: package:flutter_lints/flutter.yaml linter: diff --git a/example/ios/Podfile b/example/ios/Podfile index 620e46e..9d7ef08 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '13.0' +# platform :ios, '15.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index d5b2739..68b0dc8 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; A6CEB19D45174FAD8627F6EF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB21A82C055B99627B9A9FF1 /* Pods_Runner.framework */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -67,6 +68,7 @@ DB21A82C055B99627B9A9FF1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E17ECB82541B3AD5B0B83257 /* 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 = ""; }; F4789DB4686CF01C18DE7F81 /* 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 PBXFrameworksBuildPhase section */ @@ -74,6 +76,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, A6CEB19D45174FAD8627F6EF /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -109,6 +112,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -191,6 +195,9 @@ productType = "com.apple.product-type.bundle.unit-test"; }; 97C146ED1CF9000F007C117D /* Runner */ = { + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( @@ -215,6 +222,9 @@ /* Begin PBXProject section */ 97C146E61CF9000F007C117D /* Project object */ = { + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + ); isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; @@ -441,7 +451,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 = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -570,7 +580,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 = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -621,7 +631,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 = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -709,6 +719,18 @@ 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; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e3773d4..c3fedb2 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -5,6 +5,24 @@ + + + + + + + + + + map) { diff --git a/lib/flutter_skin.dart b/lib/flutter_skin.dart index 84f316a..cd54629 100644 --- a/lib/flutter_skin.dart +++ b/lib/flutter_skin.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart' show ThemeData, ColorScheme; +import 'package:material_ui/material_ui.dart' show ThemeData, ColorScheme; import 'package:flutter/widgets.dart'; import 'package:flutter_skin/constants/fskin_constants.dart'; import 'package:flutter_skin/models/project_config.dart'; @@ -45,6 +45,7 @@ class FlutterSkin with WidgetsBindingObserver { } else { FlutterSkin.remoteConfig = await FskinRemoteConfig.init(apiKey: apiKey); } + _startStream(); return _instance!; } @@ -65,7 +66,12 @@ class FlutterSkin with WidgetsBindingObserver { ); _sse.listen( apiKey: _instance!.apiKey, - onSkinUpdated: remoteConfig.fetchConfig, + onSkinUpdated: () async { + _logger.logMessage( + 'Skin update event received. Fetching latest config.', + ); + await remoteConfig.clearCacheAndFetchConfig(); + }, ); } diff --git a/lib/models/skin_model.dart b/lib/models/skin_model.dart index e777e69..3de0660 100644 --- a/lib/models/skin_model.dart +++ b/lib/models/skin_model.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:flutter_skin/extensions/color_scheme_extensions.dart'; class SkinModel { diff --git a/lib/remote/fskin_remote_config.dart b/lib/remote/fskin_remote_config.dart index deeacfb..8f1ef0a 100644 --- a/lib/remote/fskin_remote_config.dart +++ b/lib/remote/fskin_remote_config.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:flutter_skin/constants/fskin_constants.dart'; import 'package:flutter_skin/models/project_config.dart'; import 'package:flutter_skin/services/cache_service.dart'; @@ -70,6 +70,11 @@ class FskinRemoteConfig { return _instance!; } + Future clearCacheAndFetchConfig() async { + await cacheService.clearCache(); + await fetchConfig(); + } + Future fetchConfig() async { // Call the skin service to fetch skin for developer and project //final skin = await SkinService().getSkin(apiKey); diff --git a/lib/services/cache_service.dart b/lib/services/cache_service.dart index 8d9c91b..aa49e07 100644 --- a/lib/services/cache_service.dart +++ b/lib/services/cache_service.dart @@ -47,4 +47,10 @@ class CacheService { final value = prefs.getString('lastUpdated'); return value != null ? DateTime.parse(value) : null; } + + Future clearCache() async { + final prefs = await sharedPreferences; + await prefs.remove('projectConfig'); + await prefs.remove('lastUpdated'); + } } diff --git a/lib/services/skin_service.dart b/lib/services/skin_service.dart index 3f196c5..97d0e43 100644 --- a/lib/services/skin_service.dart +++ b/lib/services/skin_service.dart @@ -35,7 +35,13 @@ class SkinService { _logger.logMessage( 'Received response with status code: ${response.statusCode}', ); - if (response.statusCode != 200) { + + if (response.statusCode == 404) { + _logger.logMessage( + 'No skin configuration found for the provided apiKey.', + ); + return null; + } else if (response.statusCode != 200) { _logger.logError( 'Error fetching skin configuration: ${response.statusCode}', errorObject: response, diff --git a/pubspec.yaml b/pubspec.yaml index 6481d01..c44dcab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,6 +18,7 @@ dependencies: google_fonts: ^8.2.1 shared_preferences: ^2.5.5 + material_ui: ^1.1.0 dev_dependencies: flutter_test: sdk: flutter diff --git a/test/flutter_skin/flutter_skin_init_test.dart b/test/flutter_skin/flutter_skin_init_test.dart index 90fe727..913020b 100644 --- a/test/flutter_skin/flutter_skin_init_test.dart +++ b/test/flutter_skin/flutter_skin_init_test.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:flutter_skin/flutter_skin.dart'; import 'package:flutter_skin/models/project_config.dart'; import 'package:flutter_skin/remote/fskin_remote_config.dart'; diff --git a/test/flutter_skin/flutter_skin_integration_with_service.dart b/test/flutter_skin/flutter_skin_integration_with_service.dart index f224161..59fb09d 100644 --- a/test/flutter_skin/flutter_skin_integration_with_service.dart +++ b/test/flutter_skin/flutter_skin_integration_with_service.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:flutter_skin/flutter_skin.dart'; import 'package:flutter_skin/models/project_config.dart'; import 'package:flutter_skin/remote/fskin_remote_config.dart'; diff --git a/test/mocks/skin_model_mocks.dart b/test/mocks/skin_model_mocks.dart index 235d7c1..63fbb23 100644 --- a/test/mocks/skin_model_mocks.dart +++ b/test/mocks/skin_model_mocks.dart @@ -1,6 +1,6 @@ // ignore_for_file: deprecated_member_use -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:flutter_skin/models/skin_model.dart'; var skinModelMock = SkinModel(