From 7be54d0507b490879800c1f208ff651f962f45a0 Mon Sep 17 00:00:00 2001 From: Dao Hoang Son Date: Sun, 13 Jul 2025 01:53:07 +0700 Subject: [PATCH 01/11] Implement `AndroidWebViewController.setUseWideViewPort` --- packages/fwfh_webview/test/mock_webview_platform.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/fwfh_webview/test/mock_webview_platform.dart b/packages/fwfh_webview/test/mock_webview_platform.dart index fb8e604cd..d4610abcc 100644 --- a/packages/fwfh_webview/test/mock_webview_platform.dart +++ b/packages/fwfh_webview/test/mock_webview_platform.dart @@ -213,6 +213,9 @@ class __FakeAndroidWebViewController extends FakeWebViewController @override Future setTextZoom(int textZoom) => throw UnimplementedError(); + @override + Future setUseWideViewPort(bool use) => throw UnimplementedError(); + @override int get webViewIdentifier => throw UnimplementedError(); } From e6e20b310feaf48c6da23a93b5353e14b616ff2f Mon Sep 17 00:00:00 2001 From: Dao Hoang Son Date: Sun, 13 Jul 2025 01:58:47 +0700 Subject: [PATCH 02/11] Implement `VideoPlayerPlatform.xxxWithOptions` --- packages/fwfh_chewie/test/mock_video_player_platform.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/fwfh_chewie/test/mock_video_player_platform.dart b/packages/fwfh_chewie/test/mock_video_player_platform.dart index 851b6be2e..c85f6095d 100644 --- a/packages/fwfh_chewie/test/mock_video_player_platform.dart +++ b/packages/fwfh_chewie/test/mock_video_player_platform.dart @@ -20,14 +20,14 @@ class _FakeVideoPlayerPlatform extends Fake } @override - Widget buildView(int textureId) { + Widget buildViewWithOptions(VideoViewOptions options) { return const Placeholder(); } @override - Future create(DataSource dataSource) async { + Future createWithOptions(VideoCreationOptions options) async { final textureId = _nextTextureId++; - uris[textureId] = dataSource.uri; + uris[textureId] = options.dataSource.uri; return textureId; } From 817183bea49ff16e4440ef005c786d241993352a Mon Sep 17 00:00:00 2001 From: Dao Hoang Son Date: Sun, 13 Jul 2025 02:54:27 +0700 Subject: [PATCH 03/11] `./tool/update-demo_app-files.sh` --- demo_app/.metadata | 22 +- demo_app/android/.gitignore | 1 + .../app/{build.gradle => build.gradle.kts} | 18 +- demo_app/android/build.gradle | 18 -- demo_app/android/build.gradle.kts | 21 ++ demo_app/android/gradle.properties | 2 +- demo_app/android/settings.gradle | 25 -- demo_app/android/settings.gradle.kts | 25 ++ demo_app/ios/Podfile | 1 - demo_app/ios/Podfile.lock | 6 +- demo_app/ios/Runner.xcodeproj/project.pbxproj | 45 ---- .../xcshareddata/xcschemes/Runner.xcscheme | 2 + .../AppIcon.appiconset/Contents.json | 41 +--- .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 856 -> 0 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 1358 -> 0 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 940 -> 0 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 1501 -> 0 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 1048 -> 0 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 1776 -> 0 bytes demo_app/macos/Podfile | 1 - demo_app/macos/Podfile.lock | 4 +- .../macos/Runner.xcodeproj/project.pbxproj | 94 +++---- .../AppIcon.appiconset/Contents.json | 10 +- .../macos/Runner/Configs/AppInfo.xcconfig | 2 +- demo_app/pubspec.lock | 232 +++++++++--------- demo_app/web/index.html | 2 +- 26 files changed, 253 insertions(+), 319 deletions(-) rename demo_app/android/app/{build.gradle => build.gradle.kts} (76%) delete mode 100644 demo_app/android/build.gradle create mode 100644 demo_app/android/build.gradle.kts delete mode 100644 demo_app/android/settings.gradle create mode 100644 demo_app/android/settings.gradle.kts delete mode 100644 demo_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png delete mode 100644 demo_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png delete mode 100644 demo_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png delete mode 100644 demo_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png delete mode 100644 demo_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png delete mode 100644 demo_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png diff --git a/demo_app/.metadata b/demo_app/.metadata index 38bb5b8bf..b5cae2d1b 100644 --- a/demo_app/.metadata +++ b/demo_app/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819" + revision: "077b4a4ce10a07b82caa6897f0c626f9c0a3ac90" channel: "stable" project_type: app @@ -13,20 +13,20 @@ project_type: app migration: platforms: - platform: root - create_revision: 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 - base_revision: 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 + create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 + base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - platform: android - create_revision: 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 - base_revision: 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 + create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 + base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - platform: ios - create_revision: 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 - base_revision: 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 + create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 + base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - platform: macos - create_revision: 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 - base_revision: 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 + create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 + base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 - platform: web - create_revision: 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 - base_revision: 80c2e84975bbd28ecf5f8d4bd4ca5a2490bfc819 + create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 + base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90 # User provided section diff --git a/demo_app/android/.gitignore b/demo_app/android/.gitignore index 55afd919c..be3943c96 100644 --- a/demo_app/android/.gitignore +++ b/demo_app/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/demo_app/android/app/build.gradle b/demo_app/android/app/build.gradle.kts similarity index 76% rename from demo_app/android/app/build.gradle rename to demo_app/android/app/build.gradle.kts index a4a41fd06..456c92e9e 100644 --- a/demo_app/android/app/build.gradle +++ b/demo_app/android/app/build.gradle.kts @@ -1,8 +1,8 @@ plugins { - id "com.android.application" - id "kotlin-android" + id("com.android.application") + id("kotlin-android") // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" + id("dev.flutter.flutter-gradle-plugin") } android { @@ -14,12 +14,12 @@ android { ndkVersion = "27.0.12077973" compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 + jvmTarget = JavaVersion.VERSION_11.toString() } defaultConfig { @@ -32,8 +32,8 @@ android { versionName = flutter.versionName // https://patrol.leancode.co/getting-started - testInstrumentationRunner "pl.leancode.patrol.PatrolJUnitRunner" - testInstrumentationRunnerArguments clearPackageData: "true" + testInstrumentationRunner = "pl.leancode.patrol.PatrolJUnitRunner" + testInstrumentationRunnerArguments["clearPackageData"] = "true" } signingConfigs { @@ -56,7 +56,7 @@ android { testOptions { // https://patrol.leancode.co/getting-started - execution "ANDROIDX_TEST_ORCHESTRATOR" + execution = "ANDROIDX_TEST_ORCHESTRATOR" } } diff --git a/demo_app/android/build.gradle b/demo_app/android/build.gradle deleted file mode 100644 index d2ffbffa4..000000000 --- a/demo_app/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/demo_app/android/build.gradle.kts b/demo_app/android/build.gradle.kts new file mode 100644 index 000000000..89176ef44 --- /dev/null +++ b/demo_app/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/demo_app/android/gradle.properties b/demo_app/android/gradle.properties index 259717082..f018a6181 100644 --- a/demo_app/android/gradle.properties +++ b/demo_app/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/demo_app/android/settings.gradle b/demo_app/android/settings.gradle deleted file mode 100644 index ad3470b89..000000000 --- a/demo_app/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.9.1" apply false - id "org.jetbrains.kotlin.android" version "2.1.20" apply false -} - -include ":app" diff --git a/demo_app/android/settings.gradle.kts b/demo_app/android/settings.gradle.kts new file mode 100644 index 000000000..ab39a10a2 --- /dev/null +++ b/demo_app/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.3" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/demo_app/ios/Podfile b/demo_app/ios/Podfile index 1e9f30311..2db47a34b 100644 --- a/demo_app/ios/Podfile +++ b/demo_app/ios/Podfile @@ -28,7 +28,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/demo_app/ios/Podfile.lock b/demo_app/ios/Podfile.lock index ef5364bb1..ded1762be 100644 --- a/demo_app/ios/Podfile.lock +++ b/demo_app/ios/Podfile.lock @@ -77,13 +77,13 @@ SPEC CHECKSUMS: just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - patrol: dd82ffedfee3aba87c1d0ed2daad0b77bfb8ee1f + patrol: 51b76cc7c11a2933ee3e72482d930c75b9d4ec73 sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 url_launcher_ios: 694010445543906933d732453a59da0a173ae33d video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b - wakelock_plus: 04623e3f525556020ebd4034310f20fe7fda8b49 + wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556 webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2 -PODFILE CHECKSUM: 4047b237a92efec4e335c96f6d2daf630bacba96 +PODFILE CHECKSUM: 4305caec6b40dde0ae97be1573c53de1882a07e5 COCOAPODS: 1.16.2 diff --git a/demo_app/ios/Runner.xcodeproj/project.pbxproj b/demo_app/ios/Runner.xcodeproj/project.pbxproj index 192004e95..54f84e5be 100644 --- a/demo_app/ios/Runner.xcodeproj/project.pbxproj +++ b/demo_app/ios/Runner.xcodeproj/project.pbxproj @@ -16,7 +16,6 @@ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 9F1A45147FD0DBE6CF860034 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A8D997B989E7638102ACA728 /* Pods_Runner.framework */; }; CEE01D58FCABD4F31F096C9C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 178E1D4C2D7566D2808A367F /* Pods_RunnerTests.framework */; }; - D3B2729C3B98CFEE7892E89B /* Pods_Runner_RunnerUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1499334AEBB4778F5448902 /* Pods_Runner_RunnerUITests.framework */; }; DB9207632BE7F15900D6B3E1 /* RunnerUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = DB9207622BE7F15900D6B3E1 /* RunnerUITests.m */; }; /* End PBXBuildFile section */ @@ -74,7 +73,6 @@ A8D997B989E7638102ACA728 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AAF976A02150E8B1F5BD5729 /* 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 = ""; }; BF066D85124559E6F9EE6EED /* Pods-Runner-RunnerUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner-RunnerUITests.release.xcconfig"; path = "Target Support Files/Pods-Runner-RunnerUITests/Pods-Runner-RunnerUITests.release.xcconfig"; sourceTree = ""; }; - C1499334AEBB4778F5448902 /* Pods_Runner_RunnerUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner_RunnerUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D25BBEAC0A481DE6132762CB /* Pods-Runner-RunnerUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner-RunnerUITests.debug.xcconfig"; path = "Target Support Files/Pods-Runner-RunnerUITests/Pods-Runner-RunnerUITests.debug.xcconfig"; sourceTree = ""; }; D8E6F301E12A65460B32AC47 /* 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 = ""; }; DB9207602BE7F15900D6B3E1 /* RunnerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -103,7 +101,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D3B2729C3B98CFEE7892E89B /* Pods_Runner_RunnerUITests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -115,7 +112,6 @@ children = ( A8D997B989E7638102ACA728 /* Pods_Runner.framework */, 178E1D4C2D7566D2808A367F /* Pods_RunnerTests.framework */, - C1499334AEBB4778F5448902 /* Pods_Runner_RunnerUITests.framework */, ); name = Frameworks; sourceTree = ""; @@ -249,12 +245,10 @@ isa = PBXNativeTarget; buildConfigurationList = DB92076B2BE7F15900D6B3E1 /* Build configuration list for PBXNativeTarget "RunnerUITests" */; buildPhases = ( - BDE9AD6DBA2291B48C045BD6 /* [CP] Check Pods Manifest.lock */, DB4BA53B2BE7F2C50075A260 /* xcode_backend build */, DB92075C2BE7F15900D6B3E1 /* Sources */, DB92075D2BE7F15900D6B3E1 /* Frameworks */, DB92075E2BE7F15900D6B3E1 /* Resources */, - A70D1F9952B2B81C2BB1F50C /* [CP] Embed Pods Frameworks */, DB4BA53C2BE7F2ED0075A260 /* xcode_backend embed_and_thin */, ); buildRules = ( @@ -432,45 +426,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - A70D1F9952B2B81C2BB1F50C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner-RunnerUITests/Pods-Runner-RunnerUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner-RunnerUITests/Pods-Runner-RunnerUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner-RunnerUITests/Pods-Runner-RunnerUITests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - BDE9AD6DBA2291B48C045BD6 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-RunnerUITests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; DB4BA53B2BE7F2C50075A260 /* xcode_backend build */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/demo_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/demo_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e3976e8e5..6852b88e3 100644 --- a/demo_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/demo_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -26,6 +26,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit" shouldUseLaunchSchemeArgsEnv = "YES"> 6nP)0?usiF{4~CoH8IeUC`2KSVckm_2_J|HL|Lz`>}qNC89KSyhjikd?mugIyUvE5k06zrZvMLjM_F|7M80#Eh&U zQu1Gt3?hy5=HfZbX8-2YP;{~?R;p;RFZ zt^)sbxlo#cSOG5!LxmEGIr_XpHT?q3bUWHhQtKAd=YkUw_hO9=-G86S6XSQErH{_V3?6Yt}5dI43736`X|$ zu0DQ0aqHDme?7QJ+q#QrZlWR}A#HVUy6kT%uO`J0WS_hDX3CChG;$LINzVH5`)}5q zV>@d+{{R1N^VvPThGud(Vx}KYm|+^qxizf&h{Wh{o0DfB*eQSRG}6 zWM_T-iKBNxRWPKAQ#7D1#V^due(dHeG;w!*=?f3uz5MunV4TIo$T&02#-e)D*B^)& zFVl=DPB=g(bUvLk+T>X8KG-J!79o}M30>UKym>QZly#Ecc6hGRc`s4$ZJRmz`4Af zthn?~PqqH}`!AfUDFfA&o}TXE;X%-P6%`c{oTV(m2Sfx71p;SXDXikUU_gusBsgop i!KkxH0i(_$1pok4pWn7D(y^ET0000l?#9LK-5*7aaSxJ7YEYjwJH6wW9#E;Dh6mN7s3F_fgpuPBt$xTUS7LX1(Y zd`bDS?ZLw^;}p6zL(PxoZ1pt_?GuGZKR^{XU2)yrcMDldRd0*8cnlaNmMVRYKr`Bq= zBKA2+6{ove63?WTQjHk9l5(gSu!B7z+J0v88{etXUHSM713951!7C>=+-oIA!Z|lP}#?s1f)G^Ne9f0NnL} zJ1`(rWj%@fJuT1=YoZ(5w}ai`-6?mCx^dmwK@New;EfzsaWW=KfHGX}10woV**Qbx zw~XNu$2|9MoV>PbeYU&i^-#)W^0pYq?832c>v=@kX-2C0XekYkw|KEVY?kM-{49+@|VZHDXW+th$&i8O?zzvIG7O=LvNQff${1q@{SCU z$PU{n+}J+6f5X4~@bs$*IFl|Gj9wm|^VZ@BbwR%8)z@#YwX#Ree5fl7MjvLD>~X$*`D$eAyf{DAtR-elnGi5OaA##D>8`-B zG^k3{+S=M1J#0~6qmDr@Vz@?ek2~&xBadF+Z7VU`ym+yHu*g=E-5{W{l#gJ1IPAzi zl0VZh_u!|{w5E)7#Z;D$&R0b!XY}*W#ur{ymUX7KOJ+jyNh=Y4m{qJe>GF*7slDC> zLNi(RYiu>Et~W2t!lal~YdtDEkpPX<^9GgD*Lhik*DukWWt4mpxBQt6~d;4Pd#v)K_k zqXqvv!UcOW#{)?#L;f^aYKiHUaT~-YKmCX91a4gMa%;4br8U~!W~QDCM&Z+&;|DZ( zm-c?2v*?#6DqSsQ&xx|Tf0_isP~C(lF5wihV9>TF9~=?8mHT-!Tr91_KDf=m#U0$` z*=(*rnrhZptXLGzduj^x7r_mjV}`e;#=2y`DUH}~>5M~(TpSQicJY96D9dV8y9z>&rU=S13*TJzkO@}Q<5iv}OxE>z*h{lrFe%!#1^&X_!yW9g}Q zL&q@ScJP3DiKwdhQ+-O$YiQA&Txx(LOUg*xQ)c0zvgigIgkU}~!a{Yfp$pxF874B$ zGu0}_`dOAbC&6+NdA#SAVOslUUruvP%C)%qMUm= zO{!5mpd@-m;gXVEUEv2*RqO#oa=Y~caZZ$WV0JPA@EVjw$8r4Y65Ta5j;sg&7uwdC aQ9{Gy*f#AP@bKE71e_g@Vc8A=*Zu^;aERCd diff --git a/demo_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/demo_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png deleted file mode 100644 index 0a04b0dc13530477b912d8fa1d43b00432e72402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmV;d15^BoP)luz4?Q2(Q77T5hjpZ|00Wg`pbZ(1_(4c|3ch)=Nm)c z19Vw}pj7dnA>V(jQo|w*3_>vKR@wm4-1_h*3is7-e2Tf58I-yH|NqbMkAVS50`tq; z-wa>>qLd6AO#fv#P;?36b`c3~1zMSTkC}M&R)P#WO#UH@l;31r_Y%de8r%%44gWC^ z2ZnDN7+5gsR@#7J>Q-O|?vh7o54`@(*!7I$8lP-Hnp?HGP(+^o!rsWB5g4XvV8Fqs zTWJGux>c0rzY#Y|*1^p1?2HU(YJh+jcauSlo54m9MLn=_LzFYY0H<5cc!7vOt3rg8 zp+%0^mIn|d%lro-;?<*pVUY#~A;9U@HOKF_ufK>UI6ckUOhpt^ao5I6E05ko6I@&B ztRTt@WXzpAx4*w1SxP}cVat{+RCDWxZ@+H8_=F~yGw0ahW*>G|lo=umlgAL#!fBycMM@j`}`g6m=VQ*1h;arvCK%bc5m7F z?>|ZaDv9wng&P6gN^Q5H1Jcr~xvE&6m)3->h+M_Q2x=s7bFfm|VORjkd8<0eVAsW` z*PeWUaC1DhE!D(GHRSf~+X4atSfv^o8VU*uuu75aR$#+rW}3BQ^`y1>rJ(JzzUZOJ(qHpn9KqC9vEnv!G*Y%U^;hzoE+7~bCAGBPqm zI!Iq%AD0wPx2j0+0TGcF00EvPp#=uS8-)uDi!?9@!Khnl14i9S8vp=1{QweSAf1)~ O0000v^oGFQVch_j0_W+$46LYUsGZhY_v0yp9rWU@lv+vcG<^LI(2`R+`CQuCB=ri|)Fehxx>Zz*7`+Qlv>o z2`lcL44es0xKSDOz;K}a&oZb)>Jp2nm`A{>p4@%uhhq__5{T=nibpW}Ol8y7wfvY@ z$J2B)@jENf=1lp9N$zyCZP7rF%V+|Zk)2$+XOXp8Apc^JL>GwNQ#3unR<*r*MFwG@ z;<-aW*JVztEufy8a8_6*naV&fYTzxe>J~Oi24}BNwR+b}Ft%k* z&{D6ks_gXC)OAuy0|*52s&k4-V?oo%-;WAFfpZH0%h>UcI%n*3f(?|1LGkGRfM-kBhe1o;kW% z6Ut}5-(H@HIGs2ds2Is*yFz@IFM=l;)E3$MS^}&jY|_N*&f=W*4W}Jn*DMYfav%|) zO_=&RufHb2_9sta_b$%m!kVz;s@szE`(@AD2m5KR{e5kn;|_QHH_!efF;D&PHH1or z$mYJvq4g-s3VR>@PZPFkM+_3|!pi#SL4_O3+MI(9 zL7XEk7IV@q%7-c-q{6H)VI?PO)x+)1!6iFOD$WgWA2D818}LqK8Sx9E0!7NOf*i;i z`SoqAUz=U<3Bme@j0uTQRjI>Mjw^Gyo9>-ENNERPz`c_SxghUxnMzJg*Kz_MtoUL~ ztJS!aT|l*e=AzQFJ=t1IL=tUWt>BzHw-)&yvxIo(n!RWP@f|v_A|kQJQ;&vZFqx(0 z<=sPRVVYt_oAOcQwQVgiUsYF&)Kk+XX2D%(rN+_sBO~0aa;0|N$8uk*b91tG`#{Uc zw>gd<%dwe}=|dD7nO8>*eX} z4$C*`8D(~MwolDj)=d}cNQMqH@MtC?wVs$Dq6ZlR)zZR`T6qae3jc(9-}w~RBJ_6> V=Fu^4hTk`A!%eMCs*K!X{smes-h}`F diff --git a/demo_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/demo_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png deleted file mode 100644 index cee97e14988d4d1f9a9cac0f011fc1ad1a599368..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048 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 /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - CE3C1E2DA1BBE87E644A674A /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - EFCDF60FA68941F256F55D38 /* [CP] Check Pods Manifest.lock */ = { + B669817BFBC9075344187513 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E78E7E90549725D324559B16 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 50E11C4CA5F6A16757CFB6B2 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 147F880C8600B29DFFB0E857 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = FF3A14EC8C72B5B007D195E4 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6723C24391A323DFBC020B3A /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D53CE00331D45ABEB647DACD /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/demo_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/demo_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index e0ca4e056..60e60c947 100644 --- a/demo_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/demo_app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,8 +1,4 @@ { - "info": { - "version": 1, - "author": "xcode" - }, "images": [ { "size": "16x16", @@ -64,5 +60,9 @@ "filename": "app_icon_1024.png", "scale": "2x" } - ] + ], + "info": { + "version": 1, + "author": "xcode" + } } diff --git a/demo_app/macos/Runner/Configs/AppInfo.xcconfig b/demo_app/macos/Runner/Configs/AppInfo.xcconfig index 945c28a9a..fbac189e0 100644 --- a/demo_app/macos/Runner/Configs/AppInfo.xcconfig +++ b/demo_app/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = demo_app PRODUCT_BUNDLE_IDENTIFIER = dev.fwfh.demoApp // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 dev.fwfh. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 dev.fwfh. All rights reserved. diff --git a/demo_app/pubspec.lock b/demo_app/pubspec.lock index c8fa787de..d61ea9cc5 100644 --- a/demo_app/pubspec.lock +++ b/demo_app/pubspec.lock @@ -5,42 +5,42 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f url: "https://pub.dev" source: hosted - version: "80.0.0" + version: "85.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + sha256: de617bfdc64f3d8b00835ec2957441ceca0a29cdf7881f7ab231bc14f71159c0 url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "7.5.6" archive: dependency: transitive description: name: archive - sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.7" args: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.7.0" async: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" audio_session: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: "direct main" description: name: carousel_slider - sha256: "7b006ec356205054af5beaef62e2221160ea36b90fb70a35e4deacd49d0349ae" + sha256: bcc61735345c9ab5cb81073896579e735f81e35fd588907a393143ea986be8ff url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.1.1" characters: dependency: transitive description: @@ -101,18 +101,26 @@ packages: dependency: transitive description: name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.4" chewie: dependency: transitive description: name: chewie - sha256: "645fbca3f22309381edb5af59a4c8aa544a3d3872d7b7b7c986c2b18b3bdd265" + sha256: "19b93a1e60e4ba640a792208a6543f1c7d5b124d011ce0199e2f18802199d984" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.1" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" cli_util: dependency: transitive description: @@ -149,10 +157,10 @@ packages: dependency: transitive description: name: coverage - sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43 + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.15.0" crypto: dependency: transitive description: @@ -205,10 +213,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" ffi: dependency: transitive description: @@ -237,18 +245,18 @@ packages: dependency: "direct main" description: name: flex_color_scheme - sha256: ae638050fceb35b6040a43cf67892f9b956022068e736284919d93322fdd4ba2 + sha256: "3344f8f6536c6ce0473b98e9f084ef80ca89024ad3b454f9c32cf840206f4387" url: "https://pub.dev" source: hosted - version: "8.1.1" + version: "8.2.0" flex_seed_scheme: dependency: transitive description: name: flex_seed_scheme - sha256: d3ba3c5c92d2d79d45e94b4c6c71d01fac3c15017da1545880c53864da5dfeb0 + sha256: b06d8b367b84cbf7ca5c5603c858fa5edae88486c4e4da79ac1044d73b6c62ec url: "https://pub.dev" source: hosted - version: "3.5.0" + version: "3.5.1" flutter: dependency: "direct main" description: flutter @@ -266,18 +274,18 @@ packages: dependency: "direct dev" description: name: flutter_launcher_icons - sha256: bfa04787c85d80ecb3f8777bde5fc10c3de809240c48fa061a2c2bf15ea5211c + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" url: "https://pub.dev" source: hosted - version: "0.14.3" + version: "0.14.4" flutter_svg: dependency: transitive description: name: flutter_svg - sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b + sha256: cd57f7969b4679317c17af6fd16ee233c1e60a82ed209d8a475c54fd6fd6f845 url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.2.0" flutter_test: dependency: "direct dev" description: flutter @@ -372,18 +380,18 @@ packages: dependency: "direct main" description: name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" url: "https://pub.dev" source: hosted - version: "0.15.5" + version: "0.15.6" http: dependency: "direct main" description: name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" http_multi_server: dependency: transitive description: @@ -404,10 +412,10 @@ packages: dependency: transitive description: name: image - sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6" + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" url: "https://pub.dev" source: hosted - version: "4.5.2" + version: "4.5.4" io: dependency: transitive description: @@ -444,26 +452,26 @@ packages: dependency: transitive description: name: just_audio_platform_interface - sha256: "271b93b484c6f494ecd72a107fffbdb26b425f170c665b9777a0a24a726f2f24" + sha256: "4cd94536af0219fa306205a58e78d67e02b0555283c1c094ee41e402a14a5c4a" url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.5.0" just_audio_web: dependency: transitive description: name: just_audio_web - sha256: "58915be64509a7683c44bf11cd1a23c15a48de104927bee116e3c63c8eeea0d4" + sha256: "6ba8a2a7e87d57d32f0f7b42856ade3d6a9fbe0f1a11fabae0a4f00bb73f0663" url: "https://pub.dev" source: hosted - version: "0.4.14" + version: "0.4.16" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.9" leak_tracker_flutter_testing: dependency: transitive description: @@ -484,10 +492,10 @@ packages: dependency: "direct dev" description: name: lint - sha256: "68d71111816dc7c1de358281e506efe574bb5072eae4a19f8a57484bf96825f5" + sha256: "3cd03646de313481336500ba02eb34d07c590535525f154aae7fda7362aa07a9" url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.8.0" logging: dependency: "direct main" description: @@ -564,26 +572,26 @@ packages: dependency: transitive description: name: package_config - sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" package_info_plus: dependency: transitive description: name: package_info_plus - sha256: "67eae327b1b0faf761964a1d2e5d323c797f3799db0e85aa232db8d9e922bc35" + sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191" url: "https://pub.dev" source: hosted - version: "8.2.1" + version: "8.3.0" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: "205ec83335c2ab9107bbba3f8997f9356d72ca3c715d2f038fc773d0366b4c76" + sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.0" path: dependency: transitive description: @@ -612,10 +620,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 url: "https://pub.dev" source: hosted - version: "2.2.15" + version: "2.2.17" path_provider_foundation: dependency: transitive description: @@ -652,26 +660,26 @@ packages: dependency: "direct dev" description: name: patrol - sha256: "2bb991db06b5e1eb2ec5c803067c41316d94d01dda93ddf16f5342073d791a20" + sha256: "21e36c6c5b8371bfa561b2632c665758e6e79f93a25590db450cb61c13469b69" url: "https://pub.dev" source: hosted - version: "3.14.0" + version: "3.17.0" patrol_finders: dependency: "direct dev" description: name: patrol_finders - sha256: "4c6d78e00362fd15d7c21cfac110e501d08ada7d77000bad139b0c3c2e27ccaf" + sha256: "95e4a8592c27c2cf39871f0c5f80d251a4347a3a61d117646089631459ce299b" url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.8.2" patrol_log: dependency: transitive description: name: patrol_log - sha256: "98b2701400c7a00b11533ab942bdeb44c3c714746e7cdb12e6cb93b6d06361da" + sha256: "49c25a41ad5ed7df6ff550c964798ed86cb112cbe2ca4f4d728d85c413b779a8" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.4.0" petitparser: dependency: transitive description: @@ -716,26 +724,26 @@ packages: dependency: transitive description: name: posix - sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a + sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" url: "https://pub.dev" source: hosted - version: "6.0.1" + version: "6.0.3" provider: dependency: "direct main" description: name: provider - sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.5" pub_semver: dependency: transitive description: name: pub_semver - sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.2.0" rxdart: dependency: transitive description: @@ -881,10 +889,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.0" term_glyph: dependency: transitive description: @@ -929,26 +937,26 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.2" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" + sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" url: "https://pub.dev" source: hosted - version: "6.3.14" + version: "6.3.16" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" + sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" url: "https://pub.dev" source: hosted - version: "6.3.2" + version: "6.3.3" url_launcher_linux: dependency: transitive description: @@ -977,10 +985,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" url_launcher_windows: dependency: transitive description: @@ -1001,10 +1009,10 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" + sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 url: "https://pub.dev" source: hosted - version: "1.1.18" + version: "1.1.19" vector_graphics_codec: dependency: transitive description: @@ -1017,10 +1025,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + sha256: "557a315b7d2a6dbb0aaaff84d857967ce6bdc96a63dc6ee2a57ce5a6ee5d3331" url: "https://pub.dev" source: hosted - version: "1.1.16" + version: "1.1.17" vector_math: dependency: transitive description: @@ -1033,98 +1041,98 @@ packages: dependency: transitive description: name: video_player - sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17" + sha256: "0d55b1f1a31e5ad4c4967bfaa8ade0240b07d20ee4af1dfef5f531056512961a" url: "https://pub.dev" source: hosted - version: "2.9.2" + version: "2.10.0" video_player_android: dependency: transitive description: name: video_player_android - sha256: "7018dbcb395e2bca0b9a898e73989e67c0c4a5db269528e1b036ca38bcca0d0b" + sha256: "4a5135754a62dbc827a64a42ef1f8ed72c962e191c97e2d48744225c2b9ebb73" url: "https://pub.dev" source: hosted - version: "2.7.17" + version: "2.8.7" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: "84b4752745eeccb6e75865c9aab39b3d28eb27ba5726d352d45db8297fbd75bc" + sha256: "9fedd55023249f3a02738c195c906b4e530956191febf0838e37d0dac912f953" url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.8.0" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - sha256: df534476c341ab2c6a835078066fc681b8265048addd853a1e3c78740316a844 + sha256: cf2a1d29a284db648fd66cbd18aacc157f9862d77d2cc790f6f9678a46c1db5a url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.4.0" video_player_web: dependency: transitive description: name: video_player_web - sha256: "3ef40ea6d72434edbfdba4624b90fd3a80a0740d260667d91e7ecd2d79e13476" + sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" url: "https://pub.dev" source: hosted - version: "2.3.4" + version: "2.4.0" vm_service: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.0.0" wakelock_plus: dependency: transitive description: name: wakelock_plus - sha256: "36c88af0b930121941345306d259ec4cc4ecca3b151c02e3a9e71aede83c615e" + sha256: a474e314c3e8fb5adef1f9ae2d247e57467ad557fa7483a2b895bc1b421c5678 url: "https://pub.dev" source: hosted - version: "1.2.10" + version: "1.3.2" wakelock_plus_platform_interface: dependency: transitive description: name: wakelock_plus_platform_interface - sha256: "70e780bc99796e1db82fe764b1e7dcb89a86f1e5b3afb1db354de50f2e41eb7a" + sha256: e10444072e50dbc4999d7316fd303f7ea53d31c824aa5eb05d7ccbdd98985207 url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.3" watcher: dependency: transitive description: name: watcher - sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" web: dependency: transitive description: name: web - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" web_socket: dependency: transitive description: name: web_socket - sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" url: "https://pub.dev" source: hosted - version: "0.1.6" + version: "1.0.1" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" webkit_inspection_protocol: dependency: transitive description: @@ -1137,42 +1145,42 @@ packages: dependency: transitive description: name: webview_flutter - sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec" + sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba url: "https://pub.dev" source: hosted - version: "4.10.0" + version: "4.13.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: "512c26ccc5b8a571fd5d13ec994b7509f142ff6faf85835e243dde3538fdc713" + sha256: f6e6afef6e234801da77170f7a1847ded8450778caf2fe13979d140484be3678 url: "https://pub.dev" source: hosted - version: "4.3.2" + version: "4.7.0" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d + sha256: f0dc2dc3a2b1e3a6abdd6801b9355ebfeb3b8f6cde6b9dc7c9235909c4a1f147 url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.13.1" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "7310de7efa4e6df8b3d2ff14aef3f290bc00b43363f2d0028845e6de46507fc9" + sha256: a3d461fe3467014e05f3ac4962e5fdde2a4bf44c561cb53e9ae5c586600fdbc3 url: "https://pub.dev" source: hosted - version: "3.18.1" + version: "3.22.0" win32: dependency: transitive description: name: win32 - sha256: b89e6e24d1454e149ab20fbb225af58660f0c0bf4475544650700d8e2da54aef + sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" url: "https://pub.dev" source: hosted - version: "5.11.0" + version: "5.14.0" xdg_directories: dependency: transitive description: @@ -1198,5 +1206,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.7.0 <4.0.0" - flutter: ">=3.27.0" + dart: ">=3.8.0 <4.0.0" + flutter: ">=3.32.0" diff --git a/demo_app/web/index.html b/demo_app/web/index.html index 339f2cfcd..992e1c4d1 100644 --- a/demo_app/web/index.html +++ b/demo_app/web/index.html @@ -21,7 +21,7 @@ - + From e8b85df4f39a1a3cf5a8fbd5141d99159ca3ef5e Mon Sep 17 00:00:00 2001 From: Dao Hoang Son Date: Sun, 13 Jul 2025 03:04:01 +0700 Subject: [PATCH 04/11] Update pubspec.yaml --- demo_app/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo_app/pubspec.yaml b/demo_app/pubspec.yaml index 19ab7a70b..a0cc528c2 100644 --- a/demo_app/pubspec.yaml +++ b/demo_app/pubspec.yaml @@ -49,8 +49,8 @@ dev_dependencies: golden_toolkit: ^0.15.0 lint: any measurer: ^2.1.1 - patrol: ^3.14.0 - patrol_finders: ^2.7.0 + patrol: ^3.17.0 + patrol_finders: ^2.8.2 test: any flutter: From 8c9b2b3e914ef177d5baea45168ab7b1125b8b94 Mon Sep 17 00:00:00 2001 From: Dao Hoang Son Date: Sun, 13 Jul 2025 03:08:07 +0700 Subject: [PATCH 05/11] Fix build.gradle.kts --- demo_app/android/app/build.gradle.kts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/demo_app/android/app/build.gradle.kts b/demo_app/android/app/build.gradle.kts index 456c92e9e..a7e58d61c 100644 --- a/demo_app/android/app/build.gradle.kts +++ b/demo_app/android/app/build.gradle.kts @@ -37,20 +37,20 @@ android { } signingConfigs { - demo { - storeFile file("../keystore") - storePassword "storepass" - keyAlias "alias" - keyPassword "keypass" + create("demo") { + storeFile = file("../keystore") + storePassword = "storepass" + keyAlias = "alias" + keyPassword = "keypass" } } buildTypes { debug { - signingConfig = signingConfigs.demo + signingConfig = signingConfigs.getByName("demo") } release { - signingConfig = signingConfigs.demo + signingConfig = signingConfigs.getByName("demo") } } @@ -66,5 +66,5 @@ flutter { dependencies { // https://patrol.leancode.co/getting-started - androidTestUtil "androidx.test:orchestrator:1.5.1" + androidTestUtil("androidx.test:orchestrator:1.5.1") } From 342df89ba3f0d03902892d19ec01fa2483498864 Mon Sep 17 00:00:00 2001 From: Dao Hoang Son Date: Sun, 13 Jul 2025 03:16:16 +0700 Subject: [PATCH 06/11] Fix fwfh_chewie backward compatible --- .../test/mock_video_player_platform.dart | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/fwfh_chewie/test/mock_video_player_platform.dart b/packages/fwfh_chewie/test/mock_video_player_platform.dart index c85f6095d..95d396f8b 100644 --- a/packages/fwfh_chewie/test/mock_video_player_platform.dart +++ b/packages/fwfh_chewie/test/mock_video_player_platform.dart @@ -20,14 +20,33 @@ class _FakeVideoPlayerPlatform extends Fake } @override - Widget buildViewWithOptions(VideoViewOptions options) { + Widget buildView(int textureId) { + // TODO: remove this method when we bump chewie minimum version return const Placeholder(); } @override - Future createWithOptions(VideoCreationOptions options) async { + // TODO: remove lint ignore when we bump chewie minimum version + // ignore: type_annotate_public_apis + Widget buildViewWithOptions(options) { + return const Placeholder(); + } + + @override + Future create(DataSource dataSource) async { + final textureId = _nextTextureId++; + uris[textureId] = dataSource.uri; + return textureId; + } + + @override + // TODO: remove lint ignore when we bump chewie minimum version + // ignore: type_annotate_public_apis + Future createWithOptions(options) async { final textureId = _nextTextureId++; - uris[textureId] = options.dataSource.uri; + // TODO: remove lint ignore when we bump chewie minimum version + // ignore: unnecessary_cast + uris[textureId] = options.dataSource.uri as String?; return textureId; } From eca833b8c05714dacf4713a74da9654d65432fc6 Mon Sep 17 00:00:00 2001 From: Dao Hoang Son Date: Mon, 14 Jul 2025 10:31:48 +0700 Subject: [PATCH 07/11] Use our own `HtmlLayoutBuilder` to avoid test failures --- demo_app/devtools_options.yaml | 3 + packages/core/lib/src/core_helpers.dart | 1 + .../core/lib/src/core_widget_factory.dart | 2 +- .../core/lib/src/internal/ops/tag_table.dart | 2 +- .../lib/src/widgets/html_layout_builder.dart | 85 +++++++++++++++++++ packages/core/test/_.dart | 7 +- 6 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 demo_app/devtools_options.yaml create mode 100644 packages/core/lib/src/widgets/html_layout_builder.dart diff --git a/demo_app/devtools_options.yaml b/demo_app/devtools_options.yaml new file mode 100644 index 000000000..fa0b357c4 --- /dev/null +++ b/demo_app/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/packages/core/lib/src/core_helpers.dart b/packages/core/lib/src/core_helpers.dart index 79b99ccd9..1803ad8b9 100644 --- a/packages/core/lib/src/core_helpers.dart +++ b/packages/core/lib/src/core_helpers.dart @@ -15,6 +15,7 @@ export 'widgets/css_sizing.dart'; export 'widgets/horizontal_margin.dart'; export 'widgets/html_details.dart'; export 'widgets/html_flex.dart'; +export 'widgets/html_layout_builder.dart'; export 'widgets/html_list_item.dart'; export 'widgets/html_list_marker.dart'; export 'widgets/html_ruby.dart'; diff --git a/packages/core/lib/src/core_widget_factory.dart b/packages/core/lib/src/core_widget_factory.dart index d2239f325..f316c794d 100644 --- a/packages/core/lib/src/core_widget_factory.dart +++ b/packages/core/lib/src/core_widget_factory.dart @@ -233,7 +233,7 @@ class WidgetFactory extends WidgetFactoryResetter with AnchorWidgetFactory { TextBaseline textBaseline = TextBaseline.alphabetic, TextDirection textDirection = TextDirection.ltr, }) { - return LayoutBuilder( + return HtmlLayoutBuilder( builder: (_, bc) { Widget built = HtmlFlex( crossAxisAlignment: crossAxisAlignment, diff --git a/packages/core/lib/src/internal/ops/tag_table.dart b/packages/core/lib/src/internal/ops/tag_table.dart index 5f53c2d69..bdf066e16 100644 --- a/packages/core/lib/src/internal/ops/tag_table.dart +++ b/packages/core/lib/src/internal/ops/tag_table.dart @@ -83,7 +83,7 @@ class TagTable { ? tryParseCssLength(borderSpacingExpression) : null; - final layoutBuilder = LayoutBuilder( + final layoutBuilder = HtmlLayoutBuilder( builder: (context, bc) { final resolved = tableTree.inheritanceResolvers.resolve(context); Widget built = ValignBaselineContainer( diff --git a/packages/core/lib/src/widgets/html_layout_builder.dart b/packages/core/lib/src/widgets/html_layout_builder.dart new file mode 100644 index 000000000..23f0b05e6 --- /dev/null +++ b/packages/core/lib/src/widgets/html_layout_builder.dart @@ -0,0 +1,85 @@ +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; + +/// Builds a widget tree that can depend on the parent widget's size. +/// +/// The difference from [LayoutBuilder] is that this widget does not +/// perform any assertions during the build phase. +class HtmlLayoutBuilder extends ConstrainedLayoutBuilder { + /// Creates a widget that defers its building until layout. + const HtmlLayoutBuilder({super.key, required super.builder}); + + @override + RenderAbstractLayoutBuilderMixin + createRenderObject( + BuildContext context, + ) => + _RenderLayoutBuilder(); +} + +class _RenderLayoutBuilder extends RenderBox + with + RenderObjectWithChildMixin, + RenderObjectWithLayoutCallbackMixin, + RenderAbstractLayoutBuilderMixin { + @override + double? computeDistanceToActualBaseline(TextBaseline baseline) { + return child?.getDistanceToActualBaseline(baseline) ?? + super.computeDistanceToActualBaseline(baseline); + } + + @override + double? computeDryBaseline( + BoxConstraints constraints, TextBaseline baseline) { + return null; + } + + @override + Size computeDryLayout(BoxConstraints constraints) { + return Size.zero; + } + + @override + double computeMaxIntrinsicHeight(double width) { + return 0.0; + } + + @override + double computeMaxIntrinsicWidth(double height) { + return 0.0; + } + + @override + double computeMinIntrinsicHeight(double width) { + return 0.0; + } + + @override + double computeMinIntrinsicWidth(double height) { + return 0.0; + } + + @override + bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { + return child?.hitTest(result, position: position) ?? false; + } + + @override + void paint(PaintingContext context, Offset offset) { + if (child != null) { + context.paintChild(child!, offset); + } + } + + @override + void performLayout() { + final constraints = this.constraints; + runLayoutCallback(); + if (child != null) { + child!.layout(constraints, parentUsesSize: true); + size = constraints.constrain(child!.size); + } else { + size = constraints.biggest; + } + } +} diff --git a/packages/core/test/_.dart b/packages/core/test/_.dart index 6638200be..89c357068 100644 --- a/packages/core/test/_.dart +++ b/packages/core/test/_.dart @@ -607,15 +607,16 @@ class Explainer { return _widget(widget.builder(context)); } - if (widget is LayoutBuilder) { + if (widget is LayoutBuilder || + widget.runtimeType.toString() == 'HtmlLayoutBuilder') { return _widget( - widget.builder( + (widget as dynamic).builder( context, BoxConstraints.loose( TestWidgetsFlutterBinding .instance.platformDispatcher.implicitView!.physicalSize, ), - ), + ) as Widget, ); } From e091dd40b8c39fedc5678661cae25b7d15d3520b Mon Sep 17 00:00:00 2001 From: Cirrus CI Date: Mon, 14 Jul 2025 03:38:47 +0000 Subject: [PATCH 08/11] `./tool/update-goldens.sh` --- demo_app/test/goldens/VIDEO.png | Bin 37093 -> 32118 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/demo_app/test/goldens/VIDEO.png b/demo_app/test/goldens/VIDEO.png index 3ef3b292e5fdf5712b27cfaf43433965628190b5..1f7d8eec3d2d1c920864b53f21b88c67ca2540f9 100644 GIT binary patch delta 14606 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⁢?X4R<_$&K+&ip8$zAHe%5;xy@mG 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 G`TQT#wx|RE delta 19620 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 From 58b06cacfe999157181d7dda9e65ab8ed9c77549 Mon Sep 17 00:00:00 2001 From: Dao Hoang Son Date: Mon, 14 Jul 2025 11:21:47 +0700 Subject: [PATCH 09/11] Package core now requires Flutter 3.32 --- packages/core/example/main.dart | 8 ++++-- packages/core/lib/src/widgets/html_flex.dart | 28 +++---------------- .../lib/src/widgets/html_list_marker.dart | 4 --- packages/core/pubspec.yaml | 2 +- packages/core/test/_.dart | 19 ++++--------- packages/core/test/src/core_legacy_test.dart | 1 - packages/core/test/tag_li_test.dart | 10 +++---- 7 files changed, 19 insertions(+), 53 deletions(-) diff --git a/packages/core/example/main.dart b/packages/core/example/main.dart index 32ce4aaa3..c5b847100 100644 --- a/packages/core/example/main.dart +++ b/packages/core/example/main.dart @@ -1,18 +1,20 @@ import 'package:flutter/material.dart'; import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart'; -void main() => runApp(MyApp()); +void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { + const MyApp({super.key}); + @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Widget from HTML (core)', home: Scaffold( appBar: AppBar( - title: Text('Flutter Widget from HTML (core)'), + title: const Text('Flutter Widget from HTML (core)'), ), - body: Center( + body: const Center( child: HtmlWidget('Hello World!'), ), ), diff --git a/packages/core/lib/src/widgets/html_flex.dart b/packages/core/lib/src/widgets/html_flex.dart index 1919c4f04..c64e9f558 100644 --- a/packages/core/lib/src/widgets/html_flex.dart +++ b/packages/core/lib/src/widgets/html_flex.dart @@ -327,26 +327,6 @@ extension on MainAxisAlignment { } } -double? _getChildBaseline( - RenderBox child, - BoxConstraints constraints, - TextBaseline baseline, -) { - // TODO: use ChildLayoutHelper.getBaseline when minimum Flutter version >= 3.24 - assert(!child.debugNeedsLayout); - assert(child.constraints == constraints); - return child.getDistanceToBaseline(baseline, onlyReal: true); -} - -double? _getChildBaselineDry( - RenderBox child, - BoxConstraints constraints, - TextBaseline baseline, -) { - // TODO: use ChildLayoutHelper.getDryBaseline when minimum Flutter version >= 3.24 - return child.getDryBaseline(constraints, baseline); -} - class RenderHtmlFlex extends RenderBox with ContainerRenderObjectMixin, @@ -564,7 +544,7 @@ class RenderHtmlFlex extends RenderBox ? BoxConstraints(maxWidth: extent) : BoxConstraints(maxHeight: extent), layoutChild: layoutChild, - getBaseline: _getChildBaselineDry, + getBaseline: ChildLayoutHelper.getDryBaseline, ).axisSize.crossAxisExtent; } } @@ -748,7 +728,7 @@ class RenderHtmlFlex extends RenderBox final _LayoutSizes sizes = _computeSizes( constraints: constraints, layoutChild: ChildLayoutHelper.dryLayoutChild, - getBaseline: _getChildBaselineDry, + getBaseline: ChildLayoutHelper.getDryBaseline, ); if (_isBaselineAligned) { @@ -836,7 +816,7 @@ class RenderHtmlFlex extends RenderBox return _computeSizes( constraints: constraints, layoutChild: ChildLayoutHelper.dryLayoutChild, - getBaseline: _getChildBaselineDry, + getBaseline: ChildLayoutHelper.getDryBaseline, ).axisSize.toSize(direction); } @@ -1101,7 +1081,7 @@ class RenderHtmlFlex extends RenderBox final _LayoutSizes sizes = _computeSizes( constraints: constraints, layoutChild: ChildLayoutHelper.layoutChild, - getBaseline: _getChildBaseline, + getBaseline: ChildLayoutHelper.getBaseline, ); final double crossAxisExtent = sizes.axisSize.crossAxisExtent; diff --git a/packages/core/lib/src/widgets/html_list_marker.dart b/packages/core/lib/src/widgets/html_list_marker.dart index b3211a5f1..5c0df70a7 100644 --- a/packages/core/lib/src/widgets/html_list_marker.dart +++ b/packages/core/lib/src/widgets/html_list_marker.dart @@ -1,7 +1,3 @@ -// TODO: remove lint ignore when our minimum Flutter version >= 3.19 -// ignore: unnecessary_import -import 'dart:ui'; - import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 5569e06cd..4114e0e36 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -4,7 +4,7 @@ description: Flutter package to render html as widgets that focuses on correctne homepage: https://github.com/daohoangson/flutter_widget_from_html/tree/master/packages/core environment: - flutter: ">=3.22.0" + flutter: ">=3.32.0" sdk: ">=3.4.0 <4.0.0" dependencies: diff --git a/packages/core/test/_.dart b/packages/core/test/_.dart index 89c357068..a905a587d 100644 --- a/packages/core/test/_.dart +++ b/packages/core/test/_.dart @@ -306,20 +306,11 @@ class Explainer { return attr; } - // TODO: remove lint ignore when our minimum Flutter version >= 3.24 - // ignore: deprecated_member_use - String _color(Color c) => '#${_colorHex(c.alpha)}' - // TODO: remove lint ignore when our minimum Flutter version >= 3.24 - // ignore: deprecated_member_use - '${_colorHex(c.red)}' - // TODO: remove lint ignore when our minimum Flutter version >= 3.24 - // ignore: deprecated_member_use - '${_colorHex(c.green)}' - // TODO: remove lint ignore when our minimum Flutter version >= 3.24 - // ignore: deprecated_member_use - '${_colorHex(c.blue)}'; - - String _colorHex(int i) { + String _color(Color c) => + '#${_colorHex(c.a)}${_colorHex(c.r)}${_colorHex(c.g)}${_colorHex(c.b)}'; + + String _colorHex(double d) { + final i = (d * 255.0).round() & 0xff; final h = i.toRadixString(16).toUpperCase(); return h.length == 1 ? '0$h' : h; } diff --git a/packages/core/test/src/core_legacy_test.dart b/packages/core/test/src/core_legacy_test.dart index 731750543..17af3dc00 100644 --- a/packages/core/test/src/core_legacy_test.dart +++ b/packages/core/test/src/core_legacy_test.dart @@ -86,7 +86,6 @@ void main() { useExplainer: false, ); - // TODO: use hard coded value when our minimum Flutter version > 3.24 final abcdefString = abcdef.toString().replaceAll('ColorSpace.', ''); expect(explained, contains(abcdefString)); }); diff --git a/packages/core/test/tag_li_test.dart b/packages/core/test/tag_li_test.dart index edfe65ff3..8fe8ab3de 100644 --- a/packages/core/test/tag_li_test.dart +++ b/packages/core/test/tag_li_test.dart @@ -1001,9 +1001,8 @@ Future main() async { useExplainer: false, ); - // TODO: use hard coded value when our minimum Flutter version > 3.24 - const red = Color(0xffff0000); - expect(disc, contains(red.toString().replaceAll('ColorSpace.', ''))); + expect(disc, + contains('alpha: 1.0000, red: 1.0000, green: 0.0000, blue: 0.0000')); final circle = await explain( tester, @@ -1011,9 +1010,8 @@ Future main() async { useExplainer: false, ); - // TODO: use hard coded value when our minimum Flutter version > 3.24 - const green = Color(0xff00ff00); - expect(circle, contains(green.toString().replaceAll('ColorSpace.', ''))); + expect(circle, + contains('alpha: 1.0000, red: 0.0000, green: 1.0000, blue: 0.0000')); }); }); } From df20e6e5429702a2a0ef6b7593c2878f2abe9789 Mon Sep 17 00:00:00 2001 From: Dao Hoang Son Date: Mon, 14 Jul 2025 11:24:26 +0700 Subject: [PATCH 10/11] Revert changes to `packages/core/test/_.dart` --- packages/core/test/_.dart | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/core/test/_.dart b/packages/core/test/_.dart index a905a587d..89c357068 100644 --- a/packages/core/test/_.dart +++ b/packages/core/test/_.dart @@ -306,11 +306,20 @@ class Explainer { return attr; } - String _color(Color c) => - '#${_colorHex(c.a)}${_colorHex(c.r)}${_colorHex(c.g)}${_colorHex(c.b)}'; - - String _colorHex(double d) { - final i = (d * 255.0).round() & 0xff; + // TODO: remove lint ignore when our minimum Flutter version >= 3.24 + // ignore: deprecated_member_use + String _color(Color c) => '#${_colorHex(c.alpha)}' + // TODO: remove lint ignore when our minimum Flutter version >= 3.24 + // ignore: deprecated_member_use + '${_colorHex(c.red)}' + // TODO: remove lint ignore when our minimum Flutter version >= 3.24 + // ignore: deprecated_member_use + '${_colorHex(c.green)}' + // TODO: remove lint ignore when our minimum Flutter version >= 3.24 + // ignore: deprecated_member_use + '${_colorHex(c.blue)}'; + + String _colorHex(int i) { final h = i.toRadixString(16).toUpperCase(); return h.length == 1 ? '0$h' : h; } From 79f74bad423c193929eb8b47dbbe6ea2f8275bff Mon Sep 17 00:00:00 2001 From: Dao Hoang Son Date: Mon, 14 Jul 2025 11:31:25 +0700 Subject: [PATCH 11/11] Package enhanced now requires Flutter 3.32 --- packages/enhanced/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/enhanced/pubspec.yaml b/packages/enhanced/pubspec.yaml index 5d79c0d97..98b7fedb7 100644 --- a/packages/enhanced/pubspec.yaml +++ b/packages/enhanced/pubspec.yaml @@ -4,7 +4,7 @@ description: Flutter package to render html as widgets that supports hyperlink, homepage: https://github.com/daohoangson/flutter_widget_from_html environment: - flutter: ">=3.22.0" + flutter: ">=3.32.0" sdk: ">=3.4.0 <4.0.0" dependencies: