-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ci: update labeler #62
Conversation
WalkthroughThis pull request introduces significant architectural changes to a Flutter project template, focusing on removing Freezed code generation and transitioning to more explicit class definitions. The changes span multiple files, updating import statements, modifying class structures, and standardizing error handling. Key modifications include updating the Flutter SDK version, refactoring failure and state classes, and simplifying code generation processes. Changes
Sequence DiagramsequenceDiagram
participant App
participant FlashCubit
participant FlashState
App->>FlashCubit: Initialize
FlashCubit->>FlashState: Create initial state
App->>FlashCubit: Trigger message
FlashCubit->>FlashState: Update to FlashAppeared
FlashState-->>App: Display message
Possibly related PRs
Suggested labels
Poem
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🧹 Nitpick comments (13)
.github/workflows/pr-labeler.yaml (1)
Line range hint
7-7
: Consider reducing permission scope.The
permissions: write-all
grants broad access. Consider limiting it to only the required permissions for labeling:- permissions: write-all + permissions: + pull-requests: write.github/workflows/main.yaml (1)
23-23
: Consider splitting the setup command into separate stepsThe current setup command combines multiple operations into a single line. For better maintainability and debugging, consider splitting this into distinct steps in the workflow.
Here's a suggested refactor:
- setup: "flutter pub global activate very_good_cli && export PATH=$PATH:$HOME/.pub-cache/bin && dart run build_runner build --delete-conflicting-outputs" + steps: + - name: Install Very Good CLI + run: flutter pub global activate very_good_cli + - name: Add pub cache to PATH + run: echo "$HOME/.pub-cache/bin" >> $GITHUB_PATH + - name: Run build runner + run: dart run build_runner build --delete-conflicting-outputsThis approach:
- Makes each step's purpose clear
- Uses
GITHUB_PATH
instead ofexport PATH
for better persistence across steps- Improves error tracking by separating concerns
test/core/domain/failures/value_failure.codegen_test.dart (1)
54-56
: Avoid repeating casts multiple times in the same block.
Consider casting once into a local variable to avoid repetition:- expect((failure as ValueFailureNotInRange).failedValue, 0); - expect((failure as ValueFailureNotInRange).minimum, 1); - expect((failure as ValueFailureNotInRange).maximum, 10); + final notInRangeFailure = failure as ValueFailureNotInRange; + expect(notInRangeFailure.failedValue, 0); + expect(notInRangeFailure.minimum, 1); + expect(notInRangeFailure.maximum, 10);lib/shared/flash/presentation/blocs/cubit/flash_state.dart (1)
9-11
: Consider Adding Documentation
FlashDisappeared
is self-explanatory in naming, but adding a short description clarifying when this state is used (such as after a flash message is dismissed) can improve readability and future maintainability.lib/core/domain/failures/failure.dart (2)
8-11
: LocalFailure HandlingStoring a
String message
inLocalFailure
is direct and effective. Adding domain-level reasons or error codes might aid debugging and user messaging, but for now, this is appropriate.
13-16
: ServerFailure HandlingSimilar to
LocalFailure
, theServerFailure
includes aString message
. If you foresee more complex failure reasons (e.g., HTTP status codes, server error codes), ensure the class can be extended or refactored to accommodate them in the future.test/app/view/app_test.dart (1)
25-25
: Use named routes or route constants for future maintainability
Switching from a predefined route constant to'/'
is acceptable, but using string path literals across the codebase can increase the chance of typos and reduce clarity. Consider storing route names in a central place (e.g.,AppRouter.homeRoute
) for clarity and to prevent route mismatches in the future.lib/core/domain/failures/value_failure.dart (1)
9-11
: Granular unique ID failure
This factory constructor clarifies handling of invalid unique IDs. Check that other parts of the codebase handle additional ID formats (e.g., numeric IDs, composite IDs) or domain-specific constraints if needed.lib/app/view/app.dart (1)
35-42
: Ensure all states are handled
The switch expression correctly covers both states (FlashDisappeared
andFlashAppeared
). If you introduce new variants ofFlashState
in the future, remember to update this switch to handle them. You might also consider providing a default branch to avoid runtime errors or ignoring unhandled states.android/settings.gradle (1)
1-8
: Reading Flutter SDK path fromlocal.properties
.Using an assertion for
flutter.sdk
ensures clarity and prevents misconfiguration at build time. Consider providing a more descriptive error message to guide developers if it’s missing.- assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + assert flutterSdkPath != null, "Error: flutter.sdk is missing in local.properties. Please set the path to your Flutter SDK."android/app/build.gradle (1)
111-113
: Consider specifying exact multidex versionWhile defining the version in a variable is common practice, for better reproducibility, consider using the exact version in the implementation statement.
- def multidex_version = "2.0.1" - implementation "androidx.multidex:multidex:$multidex_version" + implementation "androidx.multidex:multidex:2.0.1"README.md (2)
359-359
: Fix grammar in migration guideThe sentence structure can be improved for better clarity.
-If you were depending on those builders, consider using alternative solutions or re-adding them as needed. +If you rely on those builders, consider using alternative solutions or re-adding them as needed.🧰 Tools
🪛 LanguageTool
[grammar] ~359-~359: The verb ‘depend’ can be stative. If ‘depending’ describes a state, change the sentence structure and use the base form of the verb.
Context: ...or Freezed or JSON serializable. If you were depending on those builders, consider using alter...(PROGRESSIVE_VERBS)
332-334
: Add code examples for migration stepsConsider enhancing this section with before/after code examples to make the migration process clearer.
Example addition:
Before: ```dart @freezed class Failure with _$Failure { const factory Failure.server() = ServerFailure; }After:
sealed class Failure { const factory Failure.server() = ServerFailure; }</blockquote></details> </blockquote></details> <details> <summary>📜 Review details</summary> **Configuration used: CodeRabbit UI** **Review profile: CHILL** **Plan: Pro** <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between d9697868f222d491268b5175f2161e5b4b90138d and 545f39377cbdfd7b2d2696b36a012dc856559f54. </details> <details> <summary>⛔ Files ignored due to path filters (1)</summary> * `pubspec.lock` is excluded by `!**/*.lock` </details> <details> <summary>📒 Files selected for processing (32)</summary> * `.fvmrc` (1 hunks) * `.github/labeler.yml` (1 hunks) * `.github/workflows/main.yaml` (1 hunks) * `.github/workflows/pr-labeler.yaml` (1 hunks) * `README.md` (9 hunks) * `android/app/build.gradle` (4 hunks) * `android/build.gradle` (1 hunks) * `android/gradle/wrapper/gradle-wrapper.properties` (1 hunks) * `android/settings.gradle` (1 hunks) * `build.yaml` (0 hunks) * `lib/app/view/app.dart` (1 hunks) * `lib/core/domain/entities/value_object.dart` (1 hunks) * `lib/core/domain/entities/value_validators.dart` (1 hunks) * `lib/core/domain/failures/errors.dart` (1 hunks) * `lib/core/domain/failures/failure.codegen.dart` (0 hunks) * `lib/core/domain/failures/failure.dart` (1 hunks) * `lib/core/domain/failures/value_failure.codegen.dart` (0 hunks) * `lib/core/domain/failures/value_failure.dart` (1 hunks) * `lib/core/domain/usecases/use_case.dart` (1 hunks) * `lib/core/presentation/mixins/failure_message_handler.dart` (1 hunks) * `lib/shared/domain/entities/value_objects.dart` (1 hunks) * `lib/shared/flash/presentation/blocs/cubit/flash_cubit.dart` (0 hunks) * `lib/shared/flash/presentation/blocs/cubit/flash_state.dart` (1 hunks) * `pubspec.yaml` (1 hunks) * `test/app/view/app_test.dart` (1 hunks) * `test/core/domain/entities/value_object_test.dart` (1 hunks) * `test/core/domain/entities/value_validators_test.dart` (2 hunks) * `test/core/domain/failures/errors_test.dart` (1 hunks) * `test/core/domain/failures/failure.codegen_test.dart` (1 hunks) * `test/core/domain/failures/value_failure.codegen_test.dart` (5 hunks) * `test/core/domain/usecases/use_case_test.dart` (1 hunks) * `test/shared/domain/entities/value_objects_test.dart` (2 hunks) </details> <details> <summary>💤 Files with no reviewable changes (4)</summary> * lib/core/domain/failures/failure.codegen.dart * lib/core/domain/failures/value_failure.codegen.dart * lib/shared/flash/presentation/blocs/cubit/flash_cubit.dart * build.yaml </details> <details> <summary>✅ Files skipped from review due to trivial changes (11)</summary> * .fvmrc * lib/shared/domain/entities/value_objects.dart * android/gradle/wrapper/gradle-wrapper.properties * test/core/domain/entities/value_object_test.dart * lib/core/domain/failures/errors.dart * lib/core/domain/usecases/use_case.dart * test/core/domain/usecases/use_case_test.dart * test/core/domain/failures/failure.codegen_test.dart * lib/core/domain/entities/value_validators.dart * test/core/domain/failures/errors_test.dart * .github/labeler.yml </details> <details> <summary>🧰 Additional context used</summary> <details> <summary>🪛 LanguageTool</summary> <details> <summary>README.md</summary> [grammar] ~359-~359: The verb ‘depend’ can be stative. If ‘depending’ describes a state, change the sentence structure and use the base form of the verb. Context: ...or Freezed or JSON serializable. If you were depending on those builders, consider using alter... (PROGRESSIVE_VERBS) </details> </details> </details> <details> <summary>🔇 Additional comments (36)</summary> <details> <summary>.github/workflows/pr-labeler.yaml (1)</summary> `11-11`: **Verify compatibility with labeler v5.** The upgrade from `actions/labeler@v4` to `v5` might introduce breaking changes. Please ensure your `.github/labeler.yml` configuration is compatible with the new version. Run this script to check the labeler configuration: <details> <summary>✅ Verification successful</summary> **The labeler configuration is compatible with v5** The labeler configuration uses the `any-glob-to-any-file` syntax which is fully supported in actions/labeler v5. The configuration is well-structured and follows the correct format for path-based labeling rules. All the defined patterns are valid glob patterns that will work correctly with v5. </details> <details> <summary>🏁 Scripts executed</summary> The following scripts were executed for the analysis: Script: ```shell #!/bin/bash # Description: Verify labeler configuration compatibility # Check if labeler config exists and validate its syntax if [ -f ".github/labeler.yml" ]; then echo "Labeler config found. Checking content..." cat .github/labeler.yml else echo "Warning: .github/labeler.yml not found!" fi
Length of output: 785
.github/workflows/main.yaml (2)
Line range hint 1-22
: LGTM! Well-structured workflow configuration
The workflow configuration follows good practices:
- Uses reusable workflows from VeryGoodOpenSource
- Properly configures concurrency to prevent redundant runs
- Has appropriate trigger conditions for main/master branches
23-23
: Verify PATH modification persists across steps
The current PATH modification using export
might not persist across steps in GitHub Actions.
Let's verify if the very_good_cli commands are accessible after the setup:
test/core/domain/failures/value_failure.codegen_test.dart (4)
2-2
: Switched import from code-generated file to new standard Failures file.
This import update ensures consistency with the new ValueFailure
class definitions. Double-check that all references to the old code-generated file have been removed throughout the codebase.
14-14
: Casting to subclass is proper for verifying specific properties.
This ensures stronger type safety. Good approach!
29-29
: Consistent subclass casting.
Maintains clarity in verifying the correct subclass-specific properties.
75-75
: Consistent explicit cast for verifying the correct subclass.
This maintains readability and clarity in testing property values.
lib/shared/flash/presentation/blocs/cubit/flash_state.dart (2)
3-8
: Transition from Freezed to Sealed Class Looks Good
The migration from Freezed to a sealed class ensures a more explicit structure and reduces reliance on generated code. The disappeared
and appeared
factory constructors remain readable and maintain the original intent.
13-16
: Ensure Consistent Field Access
FlashAppeared
includes a message
field. If future expansions need additional data, consider adding them consistently (e.g., an optional severity, or timestamp). For now, the design is solid and straightforward.
lib/core/domain/failures/failure.dart (1)
1-6
: Sealed Class for Failures is a Good Move
Using a sealed class for Failure
offers clarity on the types of errors supported by your app. Keep an eye on whether future error types (e.g., NetworkFailure
, UnexpectedFailure
) might require new factory constructors or separate classes.
lib/core/presentation/mixins/failure_message_handler.dart (2)
2-2
: Import Update is Aligned with Refactor
The import now correctly points to the new failure.dart
instead of the removed code generation file, aligning with the transition away from Freezed.
8-13
: Switch Pattern Matching is Readable
Switch-based pattern matching on Failure
subclasses is concise. You might consider an exhaustive check if more failure types are added. Currently, this covers existing local/server failures well.
lib/core/domain/entities/value_object.dart (2)
2-2
: Replacing freezed_annotation
with meta
is Appropriate
Since you’re no longer using Freezed, importing meta
for @immutable
usage is a clean approach. This keeps the class immutable without requiring additional macros.
4-4
: Value Failure Import Updated
The updated import path for value_failure.dart
ensures consistency with the new sealed class approach. No further changes are needed here.
lib/core/domain/failures/value_failure.dart (7)
1-2
: Good introduction of a sealed class
The sealed class approach effectively enforces exhaustive handling of potential failures at compile time. This design improves maintainability and discoverability for new developers. No issues found here.
3-7
: Comprehensive constructor for range validation
Accepting the failedValue
, minimum
, and maximum
explicitly clarifies the parameters needed for range validation. Ensure you test edge cases (equal to boundaries, invalid min/max ordering, etc.).
12-15
: Empty and multiLine constructors
Introducing explicit failures for empty and multiline values improves domain-driven design. This helps clarify data constraints and user feedback.
18-26
: ValueFailureEmpty class
Clear definition of failedValue
for the empty scenario. This leverages a descriptive toString
override for debugging.
28-36
: ValueFailureMultiLine class
Same structure as the empty scenario. This consistency promotes straightforward usage.
38-53
: ValueFailureNotInRange class
All necessary fields (failedValue
, minimum
, maximum
) are properly captured. No suggestions at present.
55-63
: ValueFailureInvalidUniqueId class
Well-defined for invalid unique ID failures. The overridden toString
method makes debugging or logging more clear.
test/core/domain/entities/value_validators_test.dart (1)
56-56
: Correct update to the new failure type
Replacing ValueInvalidUniqueId<String>
with ValueFailureInvalidUniqueId<String>
correctly references the new class name. Tests are aligned with the updated failure structure.
test/shared/domain/entities/value_objects_test.dart (2)
2-2
: Direct import usage looks consistent.
Switching from value_failure.codegen.dart
to value_failure.dart
aligns with the new approach of removing code generation. Ensure any other references to the codegen file are also removed throughout the codebase.
56-56
: Updated failure class name is consistent with the new refactor.
This change from ValueInvalidUniqueId<String>
to ValueFailureInvalidUniqueId<String>
matches the updated naming convention. Verify that all references to ValueInvalidUniqueId
have been removed or updated elsewhere.
✅ Verification successful
All references to ValueInvalidUniqueId
have been properly updated
The codebase search reveals only two occurrences of ValueInvalidUniqueId
:
- One in a test description string which is just descriptive text and doesn't affect functionality
- One in the README.md that actually documents this exact change from
ValueInvalidUniqueId
toValueFailureInvalidUniqueId
Let's verify the actual implementation to ensure we're not missing anything:
The refactoring of ValueInvalidUniqueId
to ValueFailureInvalidUniqueId
is complete and consistent
The search results confirm that:
- The class is properly defined in
lib/core/domain/failures/value_failure.dart
- All usages in test files are using the new
ValueFailureInvalidUniqueId
name - There are no remaining references to the old
ValueInvalidUniqueId
class except in descriptive text - The change is documented in README.md as part of the migration guide
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Searching for any stale references to ValueInvalidUniqueId
rg --context 3 'ValueInvalidUniqueId'
Length of output: 1111
Script:
#!/bin/bash
# Search for the actual implementation and usage of ValueFailureInvalidUniqueId
ast-grep --pattern 'class ValueFailureInvalidUniqueId'
rg --context 3 'ValueFailureInvalidUniqueId'
Length of output: 3444
android/build.gradle (1)
14-14
: Migration to tasks.register
is a recommended Gradle best practice.
This enhances incremental build performance and project clarity.
android/settings.gradle (4)
10-10
: Include Build for Flutter tools.
Loading Flutter Gradle scripts using the newly defined flutterSdkPath
seems consistent.
12-17
: Centralized repository configuration.
Defining google()
, mavenCentral()
, and gradlePluginPortal()
inside the pluginManagement
block is a clean, modern approach. No issues found.
25-25
: New module inclusion.
Retaining include ":app"
is appropriate; no issues identified.
19-23
: Plugin declarations moved to the plugins
block.
Modernizes Gradle config. Ensure the declared plugin versions (Flutter plugin loader, Android, Kotlin) align with your project’s requirements.
✅ Verification successful
The previous ast-grep pattern didn't work well with Gradle files. Let's try a different approach by examining all Gradle files and buildscript blocks to verify plugin declarations and their versions.
Plugin versions are properly aligned and consistent
The verification shows that:
- The Kotlin version in dependencies (1.9.20) matches the Kotlin plugin version
- The Flutter plugin loader (1.0.0) and Android plugin (8.2.1) versions are up-to-date
- The plugin declarations are properly moved to the modern
plugins
block insettings.gradle
- The plugin versions are consistent with typical Flutter Android project requirements
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Verify plugin versions across the codebase to ensure consistency
ast-grep --pattern $'plugins {\n $$$\n}'
Length of output: 40
Script:
#!/bin/bash
# Search for plugin declarations in Gradle files
fd -e gradle -e kts | xargs cat
# Additionally search for buildscript blocks that might contain plugin declarations
rg -U "buildscript\s*{[^}]*}" --type groovy
Length of output: 4680
pubspec.yaml (2)
37-39
: Refreshed dev dependencies.
Verify build/test commands to ensure these updated versions (e.g., build_runner
, injectable_generator
, etc.) introduce no regressions.
Also applies to: 42-44
46-49
: Dependency overrides.
Overrides can force specific versions, which may cause unexpected conflicts if transitive dependencies expect other versions. Confirm the overrides do not conflict with updated dependencies.
✅ Verification successful
Dependency overrides are consistent with direct dependencies
After analyzing the pubspec.yaml file, I can confirm that the dependency overrides are safe in this case because:
- The overridden versions match exactly with the versions specified in the direct dependencies:
collection: ^1.19.1
(same version in both places)intl: ^0.20.1
(same version in both places)meta: ^1.16.0
(same version in both places)
Since the overrides are enforcing the same versions that are already declared in the direct dependencies, this won't cause version conflicts. The overrides appear to be used here as a safeguard to ensure consistent versions across the dependency tree.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for explicit dependency version conflicts
flutter pub deps
Length of output: 116
Script:
#!/bin/bash
# Let's check the pubspec.yaml for dependencies and their versions
cat pubspec.yaml
Length of output: 1309
Script:
#!/bin/bash
# Search for any other pubspec.yaml files in the repository
fd pubspec.yaml
Length of output: 30
Script:
#!/bin/bash
# Look for dependency declarations in pubspec.yaml files
rg "^ [a-z].*: \^?[\d\.]+" -g "pubspec.yaml"
Length of output: 1138
android/app/build.gradle (3)
1-5
: LGTM: Plugin configuration follows standard Flutter practices
The plugin configuration is correctly structured and includes all necessary plugins for a Flutter Android application.
31-31
: LGTM: Android namespace and NDK configuration
The namespace is properly defined and the NDK version is correctly referenced from Flutter configuration.
Also applies to: 33-33
36-37
: Verify Java 17 compatibility across the development team
The upgrade to Java 17 is a significant change that requires all developers to have JDK 17 installed.
Also applies to: 41-41
README.md (2)
321-324
: LGTM: Clear introduction to migration guide
The migration guide's introduction effectively sets expectations for the breaking changes.
368-371
: LGTM: Comprehensive post-migration checklist
The post-migration checklist effectively covers all necessary verification steps.
@@ -4,44 +4,49 @@ version: 1.0.0+1 | |||
publish_to: none | |||
|
|||
environment: | |||
sdk: ">=3.1.0 <4.0.0" | |||
sdk: ">=3.6.0 <4.0.0" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Flutter version update is documented but version manager file is missing
The codebase documentation indicates that a .fvmrc
file should be present to lock the Flutter version, but this file is missing. According to the README:
- FVM is the recommended version manager
- The project should be locked to the stable channel
- Flutter SDK should be 3.6.x or higher (matching pubspec.yaml)
Action items:
- Create
.fvmrc
file with the stable channel specification - Run
fvm use
to ensure the correct Flutter version is used
🔗 Analysis chain
Updated Dart SDK version requires verification.
Ensure Flutter version in .fvmrc
or any other version manager aligns with sdk: ">=3.6.0 <4.0.0"
.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Verify consistency with .fvmrc (if exists)
fd ".fvmrc" --exec cat {}
Length of output: 27
Script:
#!/bin/bash
# Check for other common Flutter version management files
fd -e yaml -e json -e txt -e config ".*flutter.*version.*|.*fvm.*" --exec cat {}
# Also check for .tool-versions (asdf version manager)
fd ".tool-versions" --exec cat {}
# Check for any GitHub workflow files that might specify Flutter version
fd -g ".github/workflows/*.y*ml" --exec cat {}
Length of output: 379
Script:
#!/bin/bash
# Check for hidden files with -H flag
fd -H -e yaml -e json -e txt -e config ".*flutter.*version.*|.*fvm.*" --exec cat {}
# Check README or similar docs for Flutter version requirements
fd -i "readme|getting.*started" --exec cat {} | grep -i "flutter.*version\|dart.*version" -A 2 -B 2
Length of output: 1296
bloc: ^8.1.4 | ||
change_case: ^2.1.0 | ||
collection: ^1.19.1 | ||
crypto: ^3.0.6 | ||
cupertino_icons: ^1.0.8 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
cupertino_icons
package is not being used and should be removed
The verification shows that:
- The
meta
package is properly used in the codebase (imported inlib/core/domain/entities/value_object.dart
) - However, there are no usages of Cupertino-style widgets or icons in any of the Dart files, despite this being a Flutter project
- The
cupertino_icons
package appears to be an unused dependency
🔗 Analysis chain
Upgraded dependencies and new additions.
It’s good practice to check for breaking changes in major or minor releases. Confirm that the newly added cupertino_icons
and meta
packages are indeed used.
Also applies to: 16-16, 19-19, 22-34
Let me verify the usage of cupertino_icons further to ensure it's actually being used in the code.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for usage of cupertino_icons and meta
rg --context 2 'cupertino_icons'
rg --context 2 'import.*meta'
Length of output: 947
Script:
#!/bin/bash
# Search for any Cupertino-style widgets or icons in the codebase
rg --type dart "CupertinoIcons\.|Cupertino[A-Z][a-zA-Z]+"
# List all Dart files to understand if this is a Flutter project
fd "\.dart$"
Length of output: 2199
Description
What:
How:
Why:
Type of Change
Code Checklist
Summary by CodeRabbit
Based on the comprehensive changes, here are the release notes:
Release Notes
Migration Guide
New Features
.fvmrc
file for Flutter version managementDependency Updates
cupertino_icons
,meta
Android Configuration
Code Structure
Workflow Improvements