diff --git a/.agents/agents/bare-agent/agent.json b/.agents/agents/bare-agent/agent.json new file mode 100644 index 0000000000..08178a6fa6 --- /dev/null +++ b/.agents/agents/bare-agent/agent.json @@ -0,0 +1,7 @@ +{ + "name": "bare-agent", + "description": "An agent that only inherits MCP servers and only includes proven reliable skills.", + "configPath": { + "relativePathToConfig": "config.yaml" + } +} diff --git a/.agents/agents/bare-agent/config.yaml b/.agents/agents/bare-agent/config.yaml new file mode 100644 index 0000000000..356ccf36e8 --- /dev/null +++ b/.agents/agents/bare-agent/config.yaml @@ -0,0 +1,9 @@ +coding_agent: + agentic_mode: true + google_mode: false + +customization_config: + customization_discovery_config: + skills: + inherit_user: false + skills_paths: [] diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 3128a27fe9..b2a80e2199 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,7 +33,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@68bde559dea0fdcac2102bfdf6230c5f70eb485e + uses: github/codeql-action/init@9e0d7b8d25671d64c341c19c0152d693099fb5ba with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -44,7 +44,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@68bde559dea0fdcac2102bfdf6230c5f70eb485e + uses: github/codeql-action/autobuild@9e0d7b8d25671d64c341c19c0152d693099fb5ba # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -58,4 +58,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@68bde559dea0fdcac2102bfdf6230c5f70eb485e + uses: github/codeql-action/analyze@9e0d7b8d25671d64c341c19c0152d693099fb5ba diff --git a/cloud_build/firebase-ghcli/Dockerfile b/cloud_build/firebase-ghcli/Dockerfile index 996d730b67..cc32168a1f 100644 --- a/cloud_build/firebase-ghcli/Dockerfile +++ b/cloud_build/firebase-ghcli/Dockerfile @@ -1,4 +1,4 @@ -FROM dart:3.12.0-327.4.beta@sha256:5306c1008b585f0fbcf23aa0d7145b8f65cd7bd8c63dce4b8038684c11c79833 +FROM dart:3.12.0@sha256:3d1b19886b288807b42020ede8f1f9ea7753c91c17c27479ee9e7bf584289a34 RUN apt-get update && apt-get install -y --no-install-recommends curl gpg ca-certificates \ # Install the GitHub CLI. \ diff --git a/cloud_build/firebase-ghcli/README.md b/cloud_build/firebase-ghcli/README.md index b02ec4669f..9978b3ee1c 100644 --- a/cloud_build/firebase-ghcli/README.md +++ b/cloud_build/firebase-ghcli/README.md @@ -8,7 +8,7 @@ to comment staged site links on GitHub PRs. ## Installed tools -* Dart SDK Beta +* Dart SDK * GitHub CLI * Firebase Tools diff --git a/examples/_animation/basic_hero_animation/pubspec.yaml b/examples/_animation/basic_hero_animation/pubspec.yaml index 452cb540e7..c7c6f716d9 100644 --- a/examples/_animation/basic_hero_animation/pubspec.yaml +++ b/examples/_animation/basic_hero_animation/pubspec.yaml @@ -5,7 +5,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/basic_radial_hero_animation/pubspec.yaml b/examples/_animation/basic_radial_hero_animation/pubspec.yaml index e09286c618..f7734ebdc0 100644 --- a/examples/_animation/basic_radial_hero_animation/pubspec.yaml +++ b/examples/_animation/basic_radial_hero_animation/pubspec.yaml @@ -6,7 +6,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/basic_staggered_animation/pubspec.yaml b/examples/_animation/basic_staggered_animation/pubspec.yaml index e5eadb49c2..21d9d66382 100644 --- a/examples/_animation/basic_staggered_animation/pubspec.yaml +++ b/examples/_animation/basic_staggered_animation/pubspec.yaml @@ -4,7 +4,7 @@ description: An introductory example to staggered animations. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/hero_animation/pubspec.yaml b/examples/_animation/hero_animation/pubspec.yaml index 8e00c7d92b..07a1215608 100644 --- a/examples/_animation/hero_animation/pubspec.yaml +++ b/examples/_animation/hero_animation/pubspec.yaml @@ -4,7 +4,7 @@ description: Shows how to create a simple Hero transition. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/radial_hero_animation/pubspec.yaml b/examples/_animation/radial_hero_animation/pubspec.yaml index f0a50efef7..4bc3d29712 100644 --- a/examples/_animation/radial_hero_animation/pubspec.yaml +++ b/examples/_animation/radial_hero_animation/pubspec.yaml @@ -6,7 +6,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/radial_hero_animation_animate_rectclip/pubspec.yaml b/examples/_animation/radial_hero_animation_animate_rectclip/pubspec.yaml index 140956d18b..c23d465690 100644 --- a/examples/_animation/radial_hero_animation_animate_rectclip/pubspec.yaml +++ b/examples/_animation/radial_hero_animation_animate_rectclip/pubspec.yaml @@ -6,7 +6,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/_animation/staggered_pic_selection/pubspec.yaml b/examples/_animation/staggered_pic_selection/pubspec.yaml index 0b86b29dec..2b64c84e2d 100644 --- a/examples/_animation/staggered_pic_selection/pubspec.yaml +++ b/examples/_animation/staggered_pic_selection/pubspec.yaml @@ -4,7 +4,7 @@ description: A more complex staggered animation example. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/accessibility/pubspec.yaml b/examples/accessibility/pubspec.yaml index 08ac73ef9b..c47638aebf 100644 --- a/examples/accessibility/pubspec.yaml +++ b/examples/accessibility/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/analysis_options.yaml b/examples/analysis_options.yaml index a53c0054de..ec6294795d 100644 --- a/examples/analysis_options.yaml +++ b/examples/analysis_options.yaml @@ -37,6 +37,7 @@ linter: - prefer_final_fields - prefer_relative_imports - prefer_single_quotes + - simple_directive_paths - simplify_variable_pattern - sort_unnamed_constructors_first - specify_nonobvious_property_types diff --git a/examples/animation/animate0/pubspec.yaml b/examples/animation/animate0/pubspec.yaml index c7bd2694c8..606c5f67bc 100644 --- a/examples/animation/animate0/pubspec.yaml +++ b/examples/animation/animate0/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/animation/animate1/pubspec.yaml b/examples/animation/animate1/pubspec.yaml index 026e6dde10..784949a177 100644 --- a/examples/animation/animate1/pubspec.yaml +++ b/examples/animation/animate1/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/animation/animate2/pubspec.yaml b/examples/animation/animate2/pubspec.yaml index 2c85add160..b306b52496 100644 --- a/examples/animation/animate2/pubspec.yaml +++ b/examples/animation/animate2/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/animation/animate3/pubspec.yaml b/examples/animation/animate3/pubspec.yaml index 99639d6afb..9c40576590 100644 --- a/examples/animation/animate3/pubspec.yaml +++ b/examples/animation/animate3/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/animation/animate4/pubspec.yaml b/examples/animation/animate4/pubspec.yaml index add514f1ff..d2dc77d8a4 100644 --- a/examples/animation/animate4/pubspec.yaml +++ b/examples/animation/animate4/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/animation/animate5/pubspec.yaml b/examples/animation/animate5/pubspec.yaml index b5aa9b8e78..483d6f720c 100644 --- a/examples/animation/animate5/pubspec.yaml +++ b/examples/animation/animate5/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/app-architecture/command/pubspec.yaml b/examples/app-architecture/command/pubspec.yaml index 9d3625d102..e0ff955350 100644 --- a/examples/app-architecture/command/pubspec.yaml +++ b/examples/app-architecture/command/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for command cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/app-architecture/offline_first/lib/data/repositories/user_profile_repository.dart b/examples/app-architecture/offline_first/lib/data/repositories/user_profile_repository.dart index b0ae409cdc..dfc6f8e940 100644 --- a/examples/app-architecture/offline_first/lib/data/repositories/user_profile_repository.dart +++ b/examples/app-architecture/offline_first/lib/data/repositories/user_profile_repository.dart @@ -6,10 +6,9 @@ import '../services/database_service.dart'; class UserProfileRepository { UserProfileRepository({ - required ApiClientService apiClientService, - required DatabaseService databaseService, - }) : _apiClientService = apiClientService, - _databaseService = databaseService { + required this._apiClientService, + required this._databaseService, + }) { // #docregion Timer Timer.periodic(const Duration(minutes: 5), (timer) => sync()); // #enddocregion Timer diff --git a/examples/app-architecture/offline_first/lib/ui/user_profile/user_profile_viewmodel.dart b/examples/app-architecture/offline_first/lib/ui/user_profile/user_profile_viewmodel.dart index 6a96c891bf..6ec62646d5 100644 --- a/examples/app-architecture/offline_first/lib/ui/user_profile/user_profile_viewmodel.dart +++ b/examples/app-architecture/offline_first/lib/ui/user_profile/user_profile_viewmodel.dart @@ -5,8 +5,7 @@ import '../../domain/model/user_profile.dart'; // #docregion UserProfileViewModel class UserProfileViewModel extends ChangeNotifier { // #enddocregion UserProfileViewModel - UserProfileViewModel({required UserProfileRepository userProfileRepository}) - : _userProfileRepository = userProfileRepository { + UserProfileViewModel({required this._userProfileRepository}) { load(); } diff --git a/examples/app-architecture/offline_first/pubspec.yaml b/examples/app-architecture/offline_first/pubspec.yaml index 1042384780..5b93387f3b 100644 --- a/examples/app-architecture/offline_first/pubspec.yaml +++ b/examples/app-architecture/offline_first/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for offline_first cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: @@ -13,8 +13,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - build_runner: ^2.6.0 - freezed: ^3.2.0 + build_runner: ^2.15.0 + freezed: ^3.2.5 flutter: uses-material-design: true diff --git a/examples/app-architecture/optimistic_state/pubspec.yaml b/examples/app-architecture/optimistic_state/pubspec.yaml index 0bbe011daf..576b5eb80e 100644 --- a/examples/app-architecture/optimistic_state/pubspec.yaml +++ b/examples/app-architecture/optimistic_state/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for optimistic_state cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/app-architecture/result/pubspec.yaml b/examples/app-architecture/result/pubspec.yaml index 5357989125..22490b9a90 100644 --- a/examples/app-architecture/result/pubspec.yaml +++ b/examples/app-architecture/result/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for result cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/app-architecture/todo_data_service/lib/business/model/todo.freezed.dart b/examples/app-architecture/todo_data_service/lib/business/model/todo.freezed.dart index 840b4b2a2e..7151521ca5 100644 --- a/examples/app-architecture/todo_data_service/lib/business/model/todo.freezed.dart +++ b/examples/app-architecture/todo_data_service/lib/business/model/todo.freezed.dart @@ -1,6 +1,5 @@ -// dart format width=80 -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -76,6 +75,136 @@ as String, } +/// Adds pattern-matching-related methods to [Todo]. +extension TodoPatterns on Todo { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _Todo value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _Todo() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _Todo value) $default,){ +final _that = this; +switch (_that) { +case _Todo(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _Todo value)? $default,){ +final _that = this; +switch (_that) { +case _Todo() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( int id, String task)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _Todo() when $default != null: +return $default(_that.id,_that.task);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( int id, String task) $default,) {final _that = this; +switch (_that) { +case _Todo(): +return $default(_that.id,_that.task);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( int id, String task)? $default,) {final _that = this; +switch (_that) { +case _Todo() when $default != null: +return $default(_that.id,_that.task);case _: + return null; + +} +} + +} + /// @nodoc diff --git a/examples/app-architecture/todo_data_service/lib/data/repositories/todo_repository.dart b/examples/app-architecture/todo_data_service/lib/data/repositories/todo_repository.dart index d66a80fb2d..d836daa205 100644 --- a/examples/app-architecture/todo_data_service/lib/data/repositories/todo_repository.dart +++ b/examples/app-architecture/todo_data_service/lib/data/repositories/todo_repository.dart @@ -4,7 +4,7 @@ import '../services/database_service.dart'; // #docregion TodoRepository class TodoRepository { - TodoRepository({required DatabaseService database}) : _database = database; + TodoRepository({required this._database}); final DatabaseService _database; diff --git a/examples/app-architecture/todo_data_service/lib/ui/todo_list/viewmodel/todo_list_viewmodel.dart b/examples/app-architecture/todo_data_service/lib/ui/todo_list/viewmodel/todo_list_viewmodel.dart index c7ed7c8161..e76dd81d99 100644 --- a/examples/app-architecture/todo_data_service/lib/ui/todo_list/viewmodel/todo_list_viewmodel.dart +++ b/examples/app-architecture/todo_data_service/lib/ui/todo_list/viewmodel/todo_list_viewmodel.dart @@ -6,8 +6,7 @@ import '../../../utils/command.dart'; import '../../../utils/result.dart'; class TodoListViewModel extends ChangeNotifier { - TodoListViewModel({required TodoRepository todoRepository}) - : _todoRepository = todoRepository { + TodoListViewModel({required this._todoRepository}) { load = Command0(_load)..execute(); add = Command1(_add); delete = Command1(_delete); diff --git a/examples/app-architecture/todo_data_service/pubspec.yaml b/examples/app-architecture/todo_data_service/pubspec.yaml index d20f780132..86d5d239ca 100644 --- a/examples/app-architecture/todo_data_service/pubspec.yaml +++ b/examples/app-architecture/todo_data_service/pubspec.yaml @@ -3,24 +3,24 @@ description: Example for key_value_data cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter freezed_annotation: ^3.1.0 - json_annotation: ^4.9.0 + json_annotation: ^4.12.0 path: ^1.9.1 - shared_preferences: ^2.5.3 - sqflite: ^2.4.2 - sqflite_common_ffi: ^2.3.6 + shared_preferences: ^2.5.5 + sqflite: ^2.4.2+1 + sqflite_common_ffi: ^2.4.0+3 dev_dependencies: flutter_test: sdk: flutter - build_runner: ^2.6.0 - freezed: ^3.2.0 - json_serializable: ^6.10.0 + build_runner: ^2.15.0 + freezed: ^3.2.5 + json_serializable: ^6.14.0 flutter: uses-material-design: true diff --git a/examples/cookbook/animation/animated_container/pubspec.yaml b/examples/cookbook/animation/animated_container/pubspec.yaml index f43c4febd7..7e86ba1357 100644 --- a/examples/cookbook/animation/animated_container/pubspec.yaml +++ b/examples/cookbook/animation/animated_container/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for cookbook. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/animation/opacity_animation/pubspec.yaml b/examples/cookbook/animation/opacity_animation/pubspec.yaml index ae343964a5..d265804e55 100644 --- a/examples/cookbook/animation/opacity_animation/pubspec.yaml +++ b/examples/cookbook/animation/opacity_animation/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for cookbook. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/animation/page_route_animation/pubspec.yaml b/examples/cookbook/animation/page_route_animation/pubspec.yaml index 647f1aefe8..532d9a75f7 100644 --- a/examples/cookbook/animation/page_route_animation/pubspec.yaml +++ b/examples/cookbook/animation/page_route_animation/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for cookbook. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/animation/physics_simulation/pubspec.yaml b/examples/cookbook/animation/physics_simulation/pubspec.yaml index 3355fc0989..a6e728cdd8 100644 --- a/examples/cookbook/animation/physics_simulation/pubspec.yaml +++ b/examples/cookbook/animation/physics_simulation/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for cookbook. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/cupertino_sheets/lib/main.dart b/examples/cookbook/design/cupertino_sheets/lib/main.dart index 5a6e681191..535d500d73 100644 --- a/examples/cookbook/design/cupertino_sheets/lib/main.dart +++ b/examples/cookbook/design/cupertino_sheets/lib/main.dart @@ -31,8 +31,9 @@ class CupertinoSheetPage extends StatelessWidget { // #docregion ShowCupertinoSheet showCupertinoSheet( context: context, - builder: (context) { + scrollableBuilder: (context, scrollController) { return SingleChildScrollView( + controller: scrollController, child: Center( child: Column( mainAxisSize: MainAxisSize.min, diff --git a/examples/cookbook/design/cupertino_sheets/pubspec.yaml b/examples/cookbook/design/cupertino_sheets/pubspec.yaml index 8b957bbf00..73ea2fa241 100644 --- a/examples/cookbook/design/cupertino_sheets/pubspec.yaml +++ b/examples/cookbook/design/cupertino_sheets/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for cupertino sheets cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/drawer/pubspec.yaml b/examples/cookbook/design/drawer/pubspec.yaml index 11b935bdb4..6bd1dc6d21 100644 --- a/examples/cookbook/design/drawer/pubspec.yaml +++ b/examples/cookbook/design/drawer/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for drawer cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/fonts/pubspec.yaml b/examples/cookbook/design/fonts/pubspec.yaml index d329b5580c..6685d34613 100644 --- a/examples/cookbook/design/fonts/pubspec.yaml +++ b/examples/cookbook/design/fonts/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/design/orientation/pubspec.yaml b/examples/cookbook/design/orientation/pubspec.yaml index b7c0810548..e79dfa7477 100644 --- a/examples/cookbook/design/orientation/pubspec.yaml +++ b/examples/cookbook/design/orientation/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for orientation cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/package_fonts/pubspec.yaml b/examples/cookbook/design/package_fonts/pubspec.yaml index 750cb218bd..c3949e7ff5 100644 --- a/examples/cookbook/design/package_fonts/pubspec.yaml +++ b/examples/cookbook/design/package_fonts/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/design/snackbars/pubspec.yaml b/examples/cookbook/design/snackbars/pubspec.yaml index 049b7568ca..ecdbd12849 100644 --- a/examples/cookbook/design/snackbars/pubspec.yaml +++ b/examples/cookbook/design/snackbars/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for snackbars cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/tabs/pubspec.yaml b/examples/cookbook/design/tabs/pubspec.yaml index dd805ef130..8872dda7f7 100644 --- a/examples/cookbook/design/tabs/pubspec.yaml +++ b/examples/cookbook/design/tabs/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for tabs cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/design/themes/pubspec.yaml b/examples/cookbook/design/themes/pubspec.yaml index 1aae8bf2e8..05b9397ddd 100644 --- a/examples/cookbook/design/themes/pubspec.yaml +++ b/examples/cookbook/design/themes/pubspec.yaml @@ -3,12 +3,12 @@ description: Sample code for themes cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - google_fonts: ^8.0.0 + google_fonts: ^8.1.0 flutter: uses-material-design: true diff --git a/examples/cookbook/effects/download_button/lib/main.dart b/examples/cookbook/effects/download_button/lib/main.dart index d8a1bec416..a22876e272 100644 --- a/examples/cookbook/effects/download_button/lib/main.dart +++ b/examples/cookbook/effects/download_button/lib/main.dart @@ -130,12 +130,10 @@ abstract class DownloadController implements ChangeNotifier { class SimulatedDownloadController extends DownloadController with ChangeNotifier { SimulatedDownloadController({ - DownloadStatus downloadStatus = DownloadStatus.notDownloaded, - double progress = 0.0, - required VoidCallback onOpenDownload, - }) : _downloadStatus = downloadStatus, - _progress = progress, - _onOpenDownload = onOpenDownload; + this._downloadStatus = DownloadStatus.notDownloaded, + this._progress = 0.0, + required this._onOpenDownload, + }); DownloadStatus _downloadStatus; @override diff --git a/examples/cookbook/effects/download_button/pubspec.yaml b/examples/cookbook/effects/download_button/pubspec.yaml index 5d1a3aff6f..6ac260ae42 100644 --- a/examples/cookbook/effects/download_button/pubspec.yaml +++ b/examples/cookbook/effects/download_button/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/drag_a_widget/pubspec.yaml b/examples/cookbook/effects/drag_a_widget/pubspec.yaml index 401a966e75..139a72b759 100644 --- a/examples/cookbook/effects/drag_a_widget/pubspec.yaml +++ b/examples/cookbook/effects/drag_a_widget/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/expandable_fab/pubspec.yaml b/examples/cookbook/effects/expandable_fab/pubspec.yaml index 7963d1092f..c107a25475 100644 --- a/examples/cookbook/effects/expandable_fab/pubspec.yaml +++ b/examples/cookbook/effects/expandable_fab/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/nested_nav/pubspec.yaml b/examples/cookbook/effects/nested_nav/pubspec.yaml index fe6c2cd61d..53d9054141 100644 --- a/examples/cookbook/effects/nested_nav/pubspec.yaml +++ b/examples/cookbook/effects/nested_nav/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/parallax_scrolling/lib/main.dart b/examples/cookbook/effects/parallax_scrolling/lib/main.dart index 7b318f5b77..f523039ff6 100644 --- a/examples/cookbook/effects/parallax_scrolling/lib/main.dart +++ b/examples/cookbook/effects/parallax_scrolling/lib/main.dart @@ -223,8 +223,7 @@ class ParallaxParentData extends ContainerBoxParentData {} class RenderParallax extends RenderBox with RenderObjectWithChildMixin, RenderProxyBoxMixin { - RenderParallax({required ScrollableState scrollable}) - : _scrollable = scrollable; + RenderParallax({required this._scrollable}); ScrollableState _scrollable; diff --git a/examples/cookbook/effects/parallax_scrolling/pubspec.yaml b/examples/cookbook/effects/parallax_scrolling/pubspec.yaml index 3d8b960b57..cf8a6a9d65 100644 --- a/examples/cookbook/effects/parallax_scrolling/pubspec.yaml +++ b/examples/cookbook/effects/parallax_scrolling/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/shimmer_loading/pubspec.yaml b/examples/cookbook/effects/shimmer_loading/pubspec.yaml index 601103143c..673f281952 100644 --- a/examples/cookbook/effects/shimmer_loading/pubspec.yaml +++ b/examples/cookbook/effects/shimmer_loading/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml b/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml index 5efea85222..5cfee6b71e 100644 --- a/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml +++ b/examples/cookbook/effects/staggered_menu_animation/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/forms/focus/pubspec.yaml b/examples/cookbook/forms/focus/pubspec.yaml index 1ad5e388e0..e5ceceded7 100644 --- a/examples/cookbook/forms/focus/pubspec.yaml +++ b/examples/cookbook/forms/focus/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for focus cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/forms/retrieve_input/pubspec.yaml b/examples/cookbook/forms/retrieve_input/pubspec.yaml index baf3ca5866..9dde2284c6 100644 --- a/examples/cookbook/forms/retrieve_input/pubspec.yaml +++ b/examples/cookbook/forms/retrieve_input/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for retrieve_input cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/forms/text_field_changes/pubspec.yaml b/examples/cookbook/forms/text_field_changes/pubspec.yaml index efb7cc39fd..9566630d5e 100644 --- a/examples/cookbook/forms/text_field_changes/pubspec.yaml +++ b/examples/cookbook/forms/text_field_changes/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for text_field_changes resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/forms/text_input/pubspec.yaml b/examples/cookbook/forms/text_input/pubspec.yaml index ef20a53503..eb79f031f7 100644 --- a/examples/cookbook/forms/text_input/pubspec.yaml +++ b/examples/cookbook/forms/text_input/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/forms/validation/pubspec.yaml b/examples/cookbook/forms/validation/pubspec.yaml index 70b41e7748..b92ec8943b 100644 --- a/examples/cookbook/forms/validation/pubspec.yaml +++ b/examples/cookbook/forms/validation/pubspec.yaml @@ -3,7 +3,7 @@ description: Use Form widget to perform form validation. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/games/achievements_leaderboards/pubspec.yaml b/examples/cookbook/games/achievements_leaderboards/pubspec.yaml index bd37990e9b..cdc85a2052 100644 --- a/examples/cookbook/games/achievements_leaderboards/pubspec.yaml +++ b/examples/cookbook/games/achievements_leaderboards/pubspec.yaml @@ -3,7 +3,7 @@ description: Games services resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/games/firestore_multiplayer/pubspec.yaml b/examples/cookbook/games/firestore_multiplayer/pubspec.yaml index 0ab6675f30..b3e8e0fb52 100644 --- a/examples/cookbook/games/firestore_multiplayer/pubspec.yaml +++ b/examples/cookbook/games/firestore_multiplayer/pubspec.yaml @@ -3,17 +3,17 @@ description: Firestore multiplayer resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - async: ^2.13.0 - cloud_firestore: ^6.0.0 - firebase_core: ^4.0.0 + async: ^2.13.1 + cloud_firestore: ^6.4.1 + firebase_core: ^4.9.0 logging: ^1.3.0 - provider: ^6.1.5 + provider: ^6.1.5+1 flutter: uses-material-design: true diff --git a/examples/cookbook/gestures/dismissible/pubspec.yaml b/examples/cookbook/gestures/dismissible/pubspec.yaml index 378e6d9658..2cee70eb0b 100644 --- a/examples/cookbook/gestures/dismissible/pubspec.yaml +++ b/examples/cookbook/gestures/dismissible/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for dismissible cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/gestures/handling_taps/pubspec.yaml b/examples/cookbook/gestures/handling_taps/pubspec.yaml index 95eaa9232f..d3e4c32ecf 100644 --- a/examples/cookbook/gestures/handling_taps/pubspec.yaml +++ b/examples/cookbook/gestures/handling_taps/pubspec.yaml @@ -3,7 +3,7 @@ description: Example on handling_taps cookbook recipe. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/gestures/ripples/pubspec.yaml b/examples/cookbook/gestures/ripples/pubspec.yaml index a82c2f06ed..0e996979d6 100644 --- a/examples/cookbook/gestures/ripples/pubspec.yaml +++ b/examples/cookbook/gestures/ripples/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for ripples cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/images/cached_images/pubspec.yaml b/examples/cookbook/images/cached_images/pubspec.yaml index a092e575bc..8f26a95ee8 100644 --- a/examples/cookbook/images/cached_images/pubspec.yaml +++ b/examples/cookbook/images/cached_images/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 cached_network_image: ^3.4.1 dev_dependencies: diff --git a/examples/cookbook/images/fading_in_images/pubspec.yaml b/examples/cookbook/images/fading_in_images/pubspec.yaml index 3011f28a21..9c30c8c2e9 100644 --- a/examples/cookbook/images/fading_in_images/pubspec.yaml +++ b/examples/cookbook/images/fading_in_images/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 transparent_image: ^2.0.1 dev_dependencies: diff --git a/examples/cookbook/images/network_image/pubspec.yaml b/examples/cookbook/images/network_image/pubspec.yaml index f3a207ebc9..13346df44b 100644 --- a/examples/cookbook/images/network_image/pubspec.yaml +++ b/examples/cookbook/images/network_image/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/lists/basic_list/pubspec.yaml b/examples/cookbook/lists/basic_list/pubspec.yaml index 0620ad3b5b..9e9666adcc 100644 --- a/examples/cookbook/lists/basic_list/pubspec.yaml +++ b/examples/cookbook/lists/basic_list/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/lists/floating_app_bar/pubspec.yaml b/examples/cookbook/lists/floating_app_bar/pubspec.yaml index d297055c43..da693b8611 100644 --- a/examples/cookbook/lists/floating_app_bar/pubspec.yaml +++ b/examples/cookbook/lists/floating_app_bar/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for floating_app_bar cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/lists/grid_lists/pubspec.yaml b/examples/cookbook/lists/grid_lists/pubspec.yaml index 35a02544f3..dc47eb46b0 100644 --- a/examples/cookbook/lists/grid_lists/pubspec.yaml +++ b/examples/cookbook/lists/grid_lists/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/lists/horizontal_list/pubspec.yaml b/examples/cookbook/lists/horizontal_list/pubspec.yaml index be94a25b14..e9518893cd 100644 --- a/examples/cookbook/lists/horizontal_list/pubspec.yaml +++ b/examples/cookbook/lists/horizontal_list/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/lists/long_lists/pubspec.yaml b/examples/cookbook/lists/long_lists/pubspec.yaml index 63957af6bb..75b7dfb829 100644 --- a/examples/cookbook/lists/long_lists/pubspec.yaml +++ b/examples/cookbook/lists/long_lists/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for long_lists cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/lists/mixed_list/pubspec.yaml b/examples/cookbook/lists/mixed_list/pubspec.yaml index d7b17f2772..67ffd18e1b 100644 --- a/examples/cookbook/lists/mixed_list/pubspec.yaml +++ b/examples/cookbook/lists/mixed_list/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for mixed_lists cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/lists/spaced_items/pubspec.yaml b/examples/cookbook/lists/spaced_items/pubspec.yaml index fc02c27a95..4086f0dc97 100644 --- a/examples/cookbook/lists/spaced_items/pubspec.yaml +++ b/examples/cookbook/lists/spaced_items/pubspec.yaml @@ -3,7 +3,7 @@ description: Example for spaced_items cookbook recipe resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/maintenance/error_reporting/pubspec.yaml b/examples/cookbook/maintenance/error_reporting/pubspec.yaml index 5a84312410..bc1e80665b 100644 --- a/examples/cookbook/maintenance/error_reporting/pubspec.yaml +++ b/examples/cookbook/maintenance/error_reporting/pubspec.yaml @@ -4,12 +4,12 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - sentry_flutter: ^9.6.0 + sentry_flutter: ^9.20.0 dev_dependencies: flutter_test: diff --git a/examples/cookbook/navigation/hero_animations/pubspec.yaml b/examples/cookbook/navigation/hero_animations/pubspec.yaml index 8871b0abf0..ad0c36178e 100644 --- a/examples/cookbook/navigation/hero_animations/pubspec.yaml +++ b/examples/cookbook/navigation/hero_animations/pubspec.yaml @@ -3,7 +3,7 @@ description: Hero animations resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/navigation/named_routes/pubspec.yaml b/examples/cookbook/navigation/named_routes/pubspec.yaml index 37f509b98a..1aa58c3223 100644 --- a/examples/cookbook/navigation/named_routes/pubspec.yaml +++ b/examples/cookbook/navigation/named_routes/pubspec.yaml @@ -3,7 +3,7 @@ description: Named route example snippets. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/navigation/navigate_with_arguments/pubspec.yaml b/examples/cookbook/navigation/navigate_with_arguments/pubspec.yaml index d4cf141d03..ef19dcc7b8 100644 --- a/examples/cookbook/navigation/navigate_with_arguments/pubspec.yaml +++ b/examples/cookbook/navigation/navigate_with_arguments/pubspec.yaml @@ -3,7 +3,7 @@ description: Use Form widget to perform form validation. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/navigation/navigation_basics/pubspec.yaml b/examples/cookbook/navigation/navigation_basics/pubspec.yaml index ba4cd9fef0..3e61b15e6f 100644 --- a/examples/cookbook/navigation/navigation_basics/pubspec.yaml +++ b/examples/cookbook/navigation/navigation_basics/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/cookbook/navigation/passing_data/pubspec.yaml b/examples/cookbook/navigation/passing_data/pubspec.yaml index 1018d69883..697a87ed8a 100644 --- a/examples/cookbook/navigation/passing_data/pubspec.yaml +++ b/examples/cookbook/navigation/passing_data/pubspec.yaml @@ -3,7 +3,7 @@ description: Passing data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/navigation/returning_data/pubspec.yaml b/examples/cookbook/navigation/returning_data/pubspec.yaml index 2801c4ef58..c00e4df488 100644 --- a/examples/cookbook/navigation/returning_data/pubspec.yaml +++ b/examples/cookbook/navigation/returning_data/pubspec.yaml @@ -3,7 +3,7 @@ description: Returning data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/networking/authenticated_requests/pubspec.yaml b/examples/cookbook/networking/authenticated_requests/pubspec.yaml index 374a94f401..ce188788cb 100644 --- a/examples/cookbook/networking/authenticated_requests/pubspec.yaml +++ b/examples/cookbook/networking/authenticated_requests/pubspec.yaml @@ -3,12 +3,12 @@ description: Authenticated HTTP request example snippets. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/background_parsing/pubspec.yaml b/examples/cookbook/networking/background_parsing/pubspec.yaml index eea62c3f94..a85058b286 100644 --- a/examples/cookbook/networking/background_parsing/pubspec.yaml +++ b/examples/cookbook/networking/background_parsing/pubspec.yaml @@ -3,12 +3,12 @@ description: Background parsing resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/delete_data/pubspec.yaml b/examples/cookbook/networking/delete_data/pubspec.yaml index 44776f17d3..3620c6fb75 100644 --- a/examples/cookbook/networking/delete_data/pubspec.yaml +++ b/examples/cookbook/networking/delete_data/pubspec.yaml @@ -3,12 +3,12 @@ description: Delete Data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/fetch_data/pubspec.yaml b/examples/cookbook/networking/fetch_data/pubspec.yaml index 25493bff61..3f0dab6f68 100644 --- a/examples/cookbook/networking/fetch_data/pubspec.yaml +++ b/examples/cookbook/networking/fetch_data/pubspec.yaml @@ -3,12 +3,12 @@ description: Fetch Data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/send_data/pubspec.yaml b/examples/cookbook/networking/send_data/pubspec.yaml index 4272b5efe1..e53eae437a 100644 --- a/examples/cookbook/networking/send_data/pubspec.yaml +++ b/examples/cookbook/networking/send_data/pubspec.yaml @@ -3,12 +3,12 @@ description: Send data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/update_data/pubspec.yaml b/examples/cookbook/networking/update_data/pubspec.yaml index fc33f66c24..121ca36058 100644 --- a/examples/cookbook/networking/update_data/pubspec.yaml +++ b/examples/cookbook/networking/update_data/pubspec.yaml @@ -3,12 +3,12 @@ description: Update Data resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 flutter: uses-material-design: true diff --git a/examples/cookbook/networking/web_sockets/pubspec.yaml b/examples/cookbook/networking/web_sockets/pubspec.yaml index 560d1ff952..0d6fbcff57 100644 --- a/examples/cookbook/networking/web_sockets/pubspec.yaml +++ b/examples/cookbook/networking/web_sockets/pubspec.yaml @@ -3,7 +3,7 @@ description: Web Sockets resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/persistence/key_value/pubspec.yaml b/examples/cookbook/persistence/key_value/pubspec.yaml index 0af68667a0..1b00dd5191 100644 --- a/examples/cookbook/persistence/key_value/pubspec.yaml +++ b/examples/cookbook/persistence/key_value/pubspec.yaml @@ -6,12 +6,12 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - shared_preferences: ^2.5.3 + shared_preferences: ^2.5.5 flutter_test: sdk: flutter diff --git a/examples/cookbook/persistence/reading_writing_files/pubspec.yaml b/examples/cookbook/persistence/reading_writing_files/pubspec.yaml index 27d994ee97..cce71675ec 100644 --- a/examples/cookbook/persistence/reading_writing_files/pubspec.yaml +++ b/examples/cookbook/persistence/reading_writing_files/pubspec.yaml @@ -3,7 +3,7 @@ description: Reading and Writing Files resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/persistence/sqlite/pubspec.yaml b/examples/cookbook/persistence/sqlite/pubspec.yaml index 5f450f1135..e7398cea5c 100644 --- a/examples/cookbook/persistence/sqlite/pubspec.yaml +++ b/examples/cookbook/persistence/sqlite/pubspec.yaml @@ -3,12 +3,12 @@ description: Example of using sqflite plugin to access SQLite database. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - sqflite: ^2.4.2 + sqflite: ^2.4.2+1 path: ^1.9.1 dev_dependencies: diff --git a/examples/cookbook/plugins/google_mobile_ads/pubspec.yaml b/examples/cookbook/plugins/google_mobile_ads/pubspec.yaml index 8e46d6236e..6db3d9051c 100644 --- a/examples/cookbook/plugins/google_mobile_ads/pubspec.yaml +++ b/examples/cookbook/plugins/google_mobile_ads/pubspec.yaml @@ -3,7 +3,7 @@ description: Google mobile ads resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/plugins/picture_using_camera/pubspec.yaml b/examples/cookbook/plugins/picture_using_camera/pubspec.yaml index 7f217a355e..e519adfcde 100644 --- a/examples/cookbook/plugins/picture_using_camera/pubspec.yaml +++ b/examples/cookbook/plugins/picture_using_camera/pubspec.yaml @@ -3,12 +3,12 @@ description: A new Flutter project. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - camera: ^0.12.0 + camera: ^0.12.0+1 path_provider: ^2.1.5 path: ^1.9.1 diff --git a/examples/cookbook/plugins/play_video/pubspec.yaml b/examples/cookbook/plugins/play_video/pubspec.yaml index 525487a2d5..ade76e8df4 100644 --- a/examples/cookbook/plugins/play_video/pubspec.yaml +++ b/examples/cookbook/plugins/play_video/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - video_player: ^2.10.0 + video_player: ^2.11.1 dev_dependencies: flutter_test: diff --git a/examples/cookbook/testing/integration/introduction/pubspec.yaml b/examples/cookbook/testing/integration/introduction/pubspec.yaml index 6c2ef6efbb..c9e9e5552e 100644 --- a/examples/cookbook/testing/integration/introduction/pubspec.yaml +++ b/examples/cookbook/testing/integration/introduction/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: @@ -15,7 +15,7 @@ dependencies: sdk: flutter dev_dependencies: - test: ^1.26.2 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/cookbook/testing/integration/profiling/pubspec.yaml b/examples/cookbook/testing/integration/profiling/pubspec.yaml index 3117c9620c..f9171d89a0 100644 --- a/examples/cookbook/testing/integration/profiling/pubspec.yaml +++ b/examples/cookbook/testing/integration/profiling/pubspec.yaml @@ -3,7 +3,7 @@ description: Integration test profiling examples. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/unit/counter_app/pubspec.yaml b/examples/cookbook/testing/unit/counter_app/pubspec.yaml index 00cfb02445..edd3ec855a 100644 --- a/examples/cookbook/testing/unit/counter_app/pubspec.yaml +++ b/examples/cookbook/testing/unit/counter_app/pubspec.yaml @@ -6,13 +6,13 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 - test: ^1.26.2 + cupertino_icons: ^1.0.9 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/cookbook/testing/unit/mocking/pubspec.yaml b/examples/cookbook/testing/unit/mocking/pubspec.yaml index 1df7c0a0ba..6081bdac1c 100644 --- a/examples/cookbook/testing/unit/mocking/pubspec.yaml +++ b/examples/cookbook/testing/unit/mocking/pubspec.yaml @@ -3,20 +3,20 @@ description: Use the Mockito package to mimic the behavior of services for testi resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter - http: ^1.5.0 + http: ^1.6.0 dev_dependencies: flutter_test: sdk: flutter - mockito: ^5.5.0 - build_runner: ^2.6.0 + mockito: ^5.6.4 + build_runner: ^2.15.0 flutter: uses-material-design: true diff --git a/examples/cookbook/testing/unit/mocking/test/fetch_album_test.mocks.dart b/examples/cookbook/testing/unit/mocking/test/fetch_album_test.mocks.dart index 30be28abbb..2e3518715f 100644 --- a/examples/cookbook/testing/unit/mocking/test/fetch_album_test.mocks.dart +++ b/examples/cookbook/testing/unit/mocking/test/fetch_album_test.mocks.dart @@ -24,6 +24,7 @@ import 'package:mockito/src/dummies.dart' as _i5; // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types // ignore_for_file: subtype_of_sealed_class +// ignore_for_file: invalid_use_of_internal_member class _FakeResponse_0 extends _i1.SmartFake implements _i2.Response { _FakeResponse_0(Object parent, Invocation parentInvocation) diff --git a/examples/cookbook/testing/widget/finders/pubspec.yaml b/examples/cookbook/testing/widget/finders/pubspec.yaml index 463e61ce66..e687327c0a 100644 --- a/examples/cookbook/testing/widget/finders/pubspec.yaml +++ b/examples/cookbook/testing/widget/finders/pubspec.yaml @@ -3,7 +3,7 @@ description: A new Flutter project. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/widget/introduction/pubspec.yaml b/examples/cookbook/testing/widget/introduction/pubspec.yaml index d5d3c4ecd0..e5091fb3ae 100644 --- a/examples/cookbook/testing/widget/introduction/pubspec.yaml +++ b/examples/cookbook/testing/widget/introduction/pubspec.yaml @@ -3,7 +3,7 @@ description: Widget testing example snippets. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/widget/orientation_tests/pubspec.yaml b/examples/cookbook/testing/widget/orientation_tests/pubspec.yaml index 6f873bd68d..6e0d01f487 100644 --- a/examples/cookbook/testing/widget/orientation_tests/pubspec.yaml +++ b/examples/cookbook/testing/widget/orientation_tests/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/widget/scrolling/pubspec.yaml b/examples/cookbook/testing/widget/scrolling/pubspec.yaml index e5df2a0574..c5f706bbf0 100644 --- a/examples/cookbook/testing/widget/scrolling/pubspec.yaml +++ b/examples/cookbook/testing/widget/scrolling/pubspec.yaml @@ -3,7 +3,7 @@ description: Scrollable widget testing. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/cookbook/testing/widget/tap_drag/pubspec.yaml b/examples/cookbook/testing/widget/tap_drag/pubspec.yaml index 0ae2f1e6ad..eba8d8f068 100644 --- a/examples/cookbook/testing/widget/tap_drag/pubspec.yaml +++ b/examples/cookbook/testing/widget/tap_drag/pubspec.yaml @@ -3,7 +3,7 @@ description: Tap drag widget testing examples. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/data-and-backend/json/pubspec.yaml b/examples/data-and-backend/json/pubspec.yaml index dadd5faedb..1b150d7704 100644 --- a/examples/data-and-backend/json/pubspec.yaml +++ b/examples/data-and-backend/json/pubspec.yaml @@ -6,11 +6,11 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: - json_annotation: ^4.9.0 + json_annotation: ^4.12.0 dev_dependencies: - build_runner: ^2.6.0 - json_serializable: ^6.10.0 + build_runner: ^2.15.0 + json_serializable: ^6.14.0 diff --git a/examples/deployment/obfuscate/pubspec.yaml b/examples/deployment/obfuscate/pubspec.yaml index 2eaa2f5b5a..24365047ac 100644 --- a/examples/deployment/obfuscate/pubspec.yaml +++ b/examples/deployment/obfuscate/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 flutter_test: sdk: flutter diff --git a/examples/fwe/birdle/pubspec.yaml b/examples/fwe/birdle/pubspec.yaml index 09999ff4de..d2bebbbc06 100644 --- a/examples/fwe/birdle/pubspec.yaml +++ b/examples/fwe/birdle/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/fwe/rolodex/pubspec.yaml b/examples/fwe/rolodex/pubspec.yaml index f3d3493932..da4ea72c6d 100644 --- a/examples/fwe/rolodex/pubspec.yaml +++ b/examples/fwe/rolodex/pubspec.yaml @@ -5,12 +5,12 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/fwe/wikipedia_reader/pubspec.yaml b/examples/fwe/wikipedia_reader/pubspec.yaml index 3910df1240..30ee9cca22 100644 --- a/examples/fwe/wikipedia_reader/pubspec.yaml +++ b/examples/fwe/wikipedia_reader/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/get-started/flutter-for/android_devs/pubspec.yaml b/examples/get-started/flutter-for/android_devs/pubspec.yaml index d7571df761..e423f51600 100644 --- a/examples/get-started/flutter-for/android_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/android_devs/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: @@ -15,9 +15,9 @@ dependencies: flutter_localizations: sdk: flutter - cupertino_icons: ^1.0.8 - http: ^1.5.0 - shared_preferences: ^2.5.3 + cupertino_icons: ^1.0.9 + http: ^1.6.0 + shared_preferences: ^2.5.5 intl: any dev_dependencies: diff --git a/examples/get-started/flutter-for/declarative/pubspec.yaml b/examples/get-started/flutter-for/declarative/pubspec.yaml index 426207fca2..5c58c1079b 100644 --- a/examples/get-started/flutter-for/declarative/pubspec.yaml +++ b/examples/get-started/flutter-for/declarative/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/get-started/flutter-for/ios_devs/pubspec.yaml b/examples/get-started/flutter-for/ios_devs/pubspec.yaml index ff56336dac..134e71d64e 100644 --- a/examples/get-started/flutter-for/ios_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/ios_devs/pubspec.yaml @@ -6,16 +6,16 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter - cupertino_icons: ^1.0.8 - http: ^1.5.0 - shared_preferences: ^2.5.3 + cupertino_icons: ^1.0.9 + http: ^1.6.0 + shared_preferences: ^2.5.5 url_launcher: ^6.3.2 dev_dependencies: diff --git a/examples/get-started/flutter-for/react_native_devs/my_widgets/pubspec.yaml b/examples/get-started/flutter-for/react_native_devs/my_widgets/pubspec.yaml index 2f17ed340a..8e22875a2f 100644 --- a/examples/get-started/flutter-for/react_native_devs/my_widgets/pubspec.yaml +++ b/examples/get-started/flutter-for/react_native_devs/my_widgets/pubspec.yaml @@ -4,4 +4,4 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 diff --git a/examples/get-started/flutter-for/react_native_devs/pubspec.yaml b/examples/get-started/flutter-for/react_native_devs/pubspec.yaml index 40e12dcbcd..5acae0562e 100644 --- a/examples/get-started/flutter-for/react_native_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/react_native_devs/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 workspace: - my_widgets @@ -14,9 +14,9 @@ workspace: dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 - http: ^1.5.0 - shared_preferences: ^2.5.3 + cupertino_icons: ^1.0.9 + http: ^1.6.0 + shared_preferences: ^2.5.5 my_widgets: path: my_widgets diff --git a/examples/get-started/flutter-for/web_devs/pubspec.yaml b/examples/get-started/flutter-for/web_devs/pubspec.yaml index ecf0bcaa1c..87e5ece55a 100644 --- a/examples/get-started/flutter-for/web_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/web_devs/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml b/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml index bf0c113be1..0b2cb0d6d4 100644 --- a/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml +++ b/examples/get-started/flutter-for/xamarin_devs/pubspec.yaml @@ -6,15 +6,15 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter - cupertino_icons: ^1.0.8 - http: ^1.5.0 + cupertino_icons: ^1.0.9 + http: ^1.6.0 dev_dependencies: flutter_test: diff --git a/examples/googleapis/pubspec.yaml b/examples/googleapis/pubspec.yaml index 035d0e01c3..005e78bce4 100644 --- a/examples/googleapis/pubspec.yaml +++ b/examples/googleapis/pubspec.yaml @@ -3,7 +3,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: collection: any # Pull the version of package:collection from Flutter. @@ -12,4 +12,4 @@ dependencies: sdk: flutter google_sign_in: ^7.2.0 googleapis: ^16.0.0 - http: ^1.5.0 + http: ^1.6.0 diff --git a/examples/integration_test/pubspec.yaml b/examples/integration_test/pubspec.yaml index d6156628b4..055fa53b41 100644 --- a/examples/integration_test/pubspec.yaml +++ b/examples/integration_test/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: @@ -17,7 +17,7 @@ dev_dependencies: sdk: flutter flutter_driver: sdk: flutter - test: ^1.26.2 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/integration_test_migration/pubspec.yaml b/examples/integration_test_migration/pubspec.yaml index 6015641ad9..4d02e377bd 100644 --- a/examples/integration_test_migration/pubspec.yaml +++ b/examples/integration_test_migration/pubspec.yaml @@ -6,7 +6,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: @@ -19,7 +19,7 @@ dev_dependencies: sdk: flutter flutter_driver: sdk: flutter - test: ^1.26.2 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/internationalization/add_language/pubspec.yaml b/examples/internationalization/add_language/pubspec.yaml index 0243772c46..f323ca8021 100644 --- a/examples/internationalization/add_language/pubspec.yaml +++ b/examples/internationalization/add_language/pubspec.yaml @@ -3,7 +3,7 @@ description: An i18n app example that adds a supported language resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/internationalization/gen_l10n_example/pubspec.yaml b/examples/internationalization/gen_l10n_example/pubspec.yaml index f30b1e4d4a..af3ec816f9 100644 --- a/examples/internationalization/gen_l10n_example/pubspec.yaml +++ b/examples/internationalization/gen_l10n_example/pubspec.yaml @@ -5,7 +5,7 @@ description: >- resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 # #docregion flutter-localizations dependencies: diff --git a/examples/internationalization/intl_example/pubspec.yaml b/examples/internationalization/intl_example/pubspec.yaml index c267678a67..d4d93df67b 100644 --- a/examples/internationalization/intl_example/pubspec.yaml +++ b/examples/internationalization/intl_example/pubspec.yaml @@ -3,7 +3,7 @@ description: Example of a Flutter app using the intl library services. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/internationalization/minimal/pubspec.yaml b/examples/internationalization/minimal/pubspec.yaml index eb845ff4f2..92814c098a 100644 --- a/examples/internationalization/minimal/pubspec.yaml +++ b/examples/internationalization/minimal/pubspec.yaml @@ -3,7 +3,7 @@ description: A minimal example of a localized Flutter app resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/base/pubspec.yaml b/examples/layout/base/pubspec.yaml index e430dad6b4..029f159825 100644 --- a/examples/layout/base/pubspec.yaml +++ b/examples/layout/base/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/card_and_stack/pubspec.yaml b/examples/layout/card_and_stack/pubspec.yaml index f855ee91cd..d775e9e3c1 100644 --- a/examples/layout/card_and_stack/pubspec.yaml +++ b/examples/layout/card_and_stack/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/constraints/pubspec.yaml b/examples/layout/constraints/pubspec.yaml index 6df5d7b51a..1458d69ed8 100644 --- a/examples/layout/constraints/pubspec.yaml +++ b/examples/layout/constraints/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/layout/container/pubspec.yaml b/examples/layout/container/pubspec.yaml index e7eaa85278..97f63169ae 100644 --- a/examples/layout/container/pubspec.yaml +++ b/examples/layout/container/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/gallery/pubspec.yaml b/examples/layout/gallery/pubspec.yaml index 5e63b7e161..7d1545c9d9 100644 --- a/examples/layout/gallery/pubspec.yaml +++ b/examples/layout/gallery/pubspec.yaml @@ -6,10 +6,10 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: - animations: ^2.0.11 + animations: ^2.2.0 flutter: sdk: flutter diff --git a/examples/layout/grid_and_list/pubspec.yaml b/examples/layout/grid_and_list/pubspec.yaml index 8e0179ee44..8ba47bae7a 100644 --- a/examples/layout/grid_and_list/pubspec.yaml +++ b/examples/layout/grid_and_list/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/interactive/pubspec.yaml b/examples/layout/lakes/interactive/pubspec.yaml index 989669353a..db3f3eb818 100644 --- a/examples/layout/lakes/interactive/pubspec.yaml +++ b/examples/layout/lakes/interactive/pubspec.yaml @@ -6,12 +6,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/step2/pubspec.yaml b/examples/layout/lakes/step2/pubspec.yaml index ac5bdd470a..f083a0e7b5 100644 --- a/examples/layout/lakes/step2/pubspec.yaml +++ b/examples/layout/lakes/step2/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/step3/pubspec.yaml b/examples/layout/lakes/step3/pubspec.yaml index 0f6d17dded..acbb36e3e3 100644 --- a/examples/layout/lakes/step3/pubspec.yaml +++ b/examples/layout/lakes/step3/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/step4/pubspec.yaml b/examples/layout/lakes/step4/pubspec.yaml index d331ae3b05..48b7a0aad5 100644 --- a/examples/layout/lakes/step4/pubspec.yaml +++ b/examples/layout/lakes/step4/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/step5/pubspec.yaml b/examples/layout/lakes/step5/pubspec.yaml index ce0445c4af..7bcc3b504a 100644 --- a/examples/layout/lakes/step5/pubspec.yaml +++ b/examples/layout/lakes/step5/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/lakes/step6/pubspec.yaml b/examples/layout/lakes/step6/pubspec.yaml index 930535164b..1327769a4d 100644 --- a/examples/layout/lakes/step6/pubspec.yaml +++ b/examples/layout/lakes/step6/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/non_material/pubspec.yaml b/examples/layout/non_material/pubspec.yaml index 76d2b91d09..406ef25a34 100644 --- a/examples/layout/non_material/pubspec.yaml +++ b/examples/layout/non_material/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/pavlova/pubspec.yaml b/examples/layout/pavlova/pubspec.yaml index e968a1a306..9a0cbcaca8 100644 --- a/examples/layout/pavlova/pubspec.yaml +++ b/examples/layout/pavlova/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/row_column/pubspec.yaml b/examples/layout/row_column/pubspec.yaml index 97630e1095..771b19f8af 100644 --- a/examples/layout/row_column/pubspec.yaml +++ b/examples/layout/row_column/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/layout/sizing/pubspec.yaml b/examples/layout/sizing/pubspec.yaml index 490a2aae36..b8ca0cff6b 100644 --- a/examples/layout/sizing/pubspec.yaml +++ b/examples/layout/sizing/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/perf/concurrency/isolates/pubspec.yaml b/examples/perf/concurrency/isolates/pubspec.yaml index 1765394076..2df2ee6698 100644 --- a/examples/perf/concurrency/isolates/pubspec.yaml +++ b/examples/perf/concurrency/isolates/pubspec.yaml @@ -6,9 +6,9 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - shared_preferences: ^2.5.3 + shared_preferences: ^2.5.5 diff --git a/examples/perf/deferred_components/pubspec.yaml b/examples/perf/deferred_components/pubspec.yaml index 086db23498..c22b64e569 100644 --- a/examples/perf/deferred_components/pubspec.yaml +++ b/examples/perf/deferred_components/pubspec.yaml @@ -4,18 +4,18 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - provider: ^6.1.5 + provider: ^6.1.5+1 dev_dependencies: flutter_test: sdk: flutter - test: ^1.26.2 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/platform_integration/compose_activities/pubspec.yaml b/examples/platform_integration/compose_activities/pubspec.yaml index eff123fc1c..af13b81e6e 100644 --- a/examples/platform_integration/compose_activities/pubspec.yaml +++ b/examples/platform_integration/compose_activities/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/platform_integration/pigeon/lib/generated_pigeon.dart b/examples/platform_integration/pigeon/lib/generated_pigeon.dart index ee150cc112..8ab7de5d03 100644 --- a/examples/platform_integration/pigeon/lib/generated_pigeon.dart +++ b/examples/platform_integration/pigeon/lib/generated_pigeon.dart @@ -1,21 +1,49 @@ -// Autogenerated from Pigeon (v26.0.0), do not edit directly. +// Autogenerated from Pigeon (v26.3.4), do not edit directly. // See also: https://pub.dev/packages/pigeon -// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers, avoid_types_on_closure_parameters +// ignore_for_file: unused_import, unused_shown_name +// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, omit_local_variable_types, omit_obvious_local_variable_types import 'dart:async'; -import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; +import 'dart:typed_data' show Float64List, Int32List, Int64List; -import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer; import 'package:flutter/services.dart'; - -PlatformException _createConnectionError(String channelName) { - return PlatformException( - code: 'channel-error', - message: 'Unable to establish connection on channel: "$channelName".', - ); +import 'package:meta/meta.dart' show immutable, protected, visibleForTesting; + +Object? _extractReplyValueOrThrow( + List? replyList, + String channelName, { + required bool isNullValid, +}) { + if (replyList == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel: "$channelName".', + ); + } else if (replyList.length > 1) { + throw PlatformException( + code: replyList[0]! as String, + message: replyList[1] as String?, + details: replyList[2], + ); + } else if (!isNullValid && (replyList.isNotEmpty && replyList[0] == null)) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } + return replyList.firstOrNull; } bool _deepEquals(Object? a, Object? b) { + if (identical(a, b)) { + return true; + } + if (a is double && b is double) { + if (a.isNaN && b.isNaN) { + return true; + } + return a == b; + } if (a is List && b is List) { return a.length == b.length && a.indexed.every( @@ -23,16 +51,52 @@ bool _deepEquals(Object? a, Object? b) { ); } if (a is Map && b is Map) { - return a.length == b.length && - a.entries.every( - (MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key]), - ); + if (a.length != b.length) { + return false; + } + for (final MapEntry entryA in a.entries) { + bool found = false; + for (final MapEntry entryB in b.entries) { + if (_deepEquals(entryA.key, entryB.key)) { + if (_deepEquals(entryA.value, entryB.value)) { + found = true; + break; + } else { + return false; + } + } + } + if (!found) { + return false; + } + } + return true; } return a == b; } +int _deepHash(Object? value) { + if (value is List) { + return Object.hashAll(value.map(_deepHash)); + } + if (value is Map) { + int result = 0; + for (final MapEntry entry in value.entries) { + result += (_deepHash(entry.key) * 31) ^ _deepHash(entry.value); + } + return result; + } + if (value is double && value.isNaN) { + // Normalize NaN to a consistent hash. + return 0x7FF8000000000000.hashCode; + } + if (value is double && value == 0.0) { + // Normalize -0.0 to 0.0 so they have the same hash code. + return 0.0.hashCode; + } + return value.hashCode; +} + class SearchRequest { SearchRequest({required this.query}); @@ -60,12 +124,12 @@ class SearchRequest { if (identical(this, other)) { return true; } - return _deepEquals(encode(), other.encode()); + return _deepEquals(query, other.query); } @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => _deepHash([runtimeType, ..._toList()]); } class SearchReply { @@ -95,12 +159,12 @@ class SearchReply { if (identical(this, other)) { return true; } - return _deepEquals(encode(), other.encode()); + return _deepEquals(result, other.result); } @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()); + int get hashCode => _deepHash([runtimeType, ..._toList()]); } class _PigeonCodec extends StandardMessageCodec { @@ -150,34 +214,23 @@ class Api { final String pigeonVar_messageChannelSuffix; Future search(SearchRequest request) async { - final String pigeonVar_channelName = + final pigeonVar_channelName = 'dev.flutter.pigeon.pigeon_examples.Api.search$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = - BasicMessageChannel( - pigeonVar_channelName, - pigeonChannelCodec, - binaryMessenger: pigeonVar_binaryMessenger, - ); + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); final Future pigeonVar_sendFuture = pigeonVar_channel.send( [request], ); - final List? pigeonVar_replyList = - await pigeonVar_sendFuture as List?; - if (pigeonVar_replyList == null) { - throw _createConnectionError(pigeonVar_channelName); - } else if (pigeonVar_replyList.length > 1) { - throw PlatformException( - code: pigeonVar_replyList[0]! as String, - message: pigeonVar_replyList[1] as String?, - details: pigeonVar_replyList[2], - ); - } else if (pigeonVar_replyList[0] == null) { - throw PlatformException( - code: 'null-error', - message: 'Host platform returned null value for non-null return value.', - ); - } else { - return (pigeonVar_replyList[0] as SearchReply?)!; - } + final pigeonVar_replyList = await pigeonVar_sendFuture as List?; + + final Object? pigeonVar_replyValue = _extractReplyValueOrThrow( + pigeonVar_replyList, + pigeonVar_channelName, + isNullValid: false, + ); + return pigeonVar_replyValue! as SearchReply; } } diff --git a/examples/platform_integration/pigeon/pubspec.yaml b/examples/platform_integration/pigeon/pubspec.yaml index 61bb624e33..9748359c6e 100644 --- a/examples/platform_integration/pigeon/pubspec.yaml +++ b/examples/platform_integration/pigeon/pubspec.yaml @@ -7,12 +7,13 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - pigeon: ^26.0.0 + meta: any + pigeon: ^26.3.4 dev_dependencies: flutter_test: diff --git a/examples/platform_integration/platform_channels/pubspec.yaml b/examples/platform_integration/platform_channels/pubspec.yaml index e6c350f14b..85f5f37306 100644 --- a/examples/platform_integration/platform_channels/pubspec.yaml +++ b/examples/platform_integration/platform_channels/pubspec.yaml @@ -9,7 +9,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/platform_integration/platform_views/pubspec.yaml b/examples/platform_integration/platform_views/pubspec.yaml index f697fca2e2..c37f5028c3 100644 --- a/examples/platform_integration/platform_views/pubspec.yaml +++ b/examples/platform_integration/platform_views/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/platform_integration/plugin_api_migration/pubspec.yaml b/examples/platform_integration/plugin_api_migration/pubspec.yaml index b7966e5253..b706b92d88 100644 --- a/examples/platform_integration/plugin_api_migration/pubspec.yaml +++ b/examples/platform_integration/plugin_api_migration/pubspec.yaml @@ -7,7 +7,7 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/pubspec.yaml b/examples/pubspec.yaml index cb57c6b650..3c3dc5334e 100644 --- a/examples/pubspec.yaml +++ b/examples/pubspec.yaml @@ -2,7 +2,7 @@ name: flutter_docs_examples publish_to: none environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 workspace: - _animation/basic_hero_animation diff --git a/examples/resources/architectural_overview/pubspec.yaml b/examples/resources/architectural_overview/pubspec.yaml index c598856dc0..175dcc6456 100644 --- a/examples/resources/architectural_overview/pubspec.yaml +++ b/examples/resources/architectural_overview/pubspec.yaml @@ -4,12 +4,12 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - ffi: ^2.1.4 + ffi: ^2.2.0 flutter: uses-material-design: true diff --git a/examples/resources/dart_swift_concurrency/pubspec.yaml b/examples/resources/dart_swift_concurrency/pubspec.yaml index 1f35a42ac3..000f248cc1 100644 --- a/examples/resources/dart_swift_concurrency/pubspec.yaml +++ b/examples/resources/dart_swift_concurrency/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/state_mgmt/simple/pubspec.yaml b/examples/state_mgmt/simple/pubspec.yaml index 294557d15a..46cace50fd 100644 --- a/examples/state_mgmt/simple/pubspec.yaml +++ b/examples/state_mgmt/simple/pubspec.yaml @@ -4,18 +4,18 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - provider: ^6.1.5 + provider: ^6.1.5+1 dev_dependencies: flutter_test: sdk: flutter - test: ^1.26.2 + test: ^1.31.0 flutter: uses-material-design: true diff --git a/examples/testing/code_debugging/pubspec.yaml b/examples/testing/code_debugging/pubspec.yaml index a834e893a8..1ba0443f87 100644 --- a/examples/testing/code_debugging/pubspec.yaml +++ b/examples/testing/code_debugging/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/testing/common_errors/pubspec.yaml b/examples/testing/common_errors/pubspec.yaml index ef32a56a21..fc3f83df0c 100644 --- a/examples/testing/common_errors/pubspec.yaml +++ b/examples/testing/common_errors/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/testing/errors/lib/excerpts.dart b/examples/testing/errors/lib/excerpts.dart index 98468ddb94..1487c3e7f9 100644 --- a/examples/testing/errors/lib/excerpts.dart +++ b/examples/testing/errors/lib/excerpts.dart @@ -1,6 +1,6 @@ // ignore_for_file: directives_ordering -import './backend.dart'; +import 'backend.dart'; import 'package:flutter/services.dart'; diff --git a/examples/testing/errors/lib/main.dart b/examples/testing/errors/lib/main.dart index 3b11a024da..2cc2ea82de 100644 --- a/examples/testing/errors/lib/main.dart +++ b/examples/testing/errors/lib/main.dart @@ -1,6 +1,6 @@ // ignore_for_file: directives_ordering -import './error_handler.dart'; +import 'error_handler.dart'; // #docregion all-errors import 'package:flutter/material.dart'; import 'dart:ui'; diff --git a/examples/testing/errors/lib/quit_immediate.dart b/examples/testing/errors/lib/quit_immediate.dart index 231093d198..e3da9751b5 100644 --- a/examples/testing/errors/lib/quit_immediate.dart +++ b/examples/testing/errors/lib/quit_immediate.dart @@ -1,6 +1,6 @@ // ignore_for_file: directives_ordering -import './my_app.dart'; +import 'my_app.dart'; // #docregion on-error-main import 'dart:io'; diff --git a/examples/testing/errors/pubspec.yaml b/examples/testing/errors/pubspec.yaml index 54cd00fc0f..750a006ed4 100644 --- a/examples/testing/errors/pubspec.yaml +++ b/examples/testing/errors/pubspec.yaml @@ -4,12 +4,12 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - firebase_core: ^4.0.0 + firebase_core: ^4.9.0 dev_dependencies: integration_test: diff --git a/examples/testing/integration_tests/how_to/pubspec.yaml b/examples/testing/integration_tests/how_to/pubspec.yaml index 61c34c4669..557ba3a9ba 100644 --- a/examples/testing/integration_tests/how_to/pubspec.yaml +++ b/examples/testing/integration_tests/how_to/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/testing/native_debugging/pubspec.yaml b/examples/testing/native_debugging/pubspec.yaml index 6483cd8472..951420e0ab 100644 --- a/examples/testing/native_debugging/pubspec.yaml +++ b/examples/testing/native_debugging/pubspec.yaml @@ -5,12 +5,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 url_launcher: ^6.3.2 dev_dependencies: diff --git a/examples/tools/pubspec.yaml b/examples/tools/pubspec.yaml index f448444407..f4b3a888e5 100644 --- a/examples/tools/pubspec.yaml +++ b/examples/tools/pubspec.yaml @@ -7,12 +7,12 @@ version: 1.0.0+1 resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 + cupertino_icons: ^1.0.9 dev_dependencies: flutter_test: diff --git a/examples/ui/actions_and_shortcuts/pubspec.yaml b/examples/ui/actions_and_shortcuts/pubspec.yaml index e373510d40..05efe01e95 100644 --- a/examples/ui/actions_and_shortcuts/pubspec.yaml +++ b/examples/ui/actions_and_shortcuts/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/ui/adaptive_app_demos/pubspec.yaml b/examples/ui/adaptive_app_demos/pubspec.yaml index 7a466a4e1d..7f83e300ef 100644 --- a/examples/ui/adaptive_app_demos/pubspec.yaml +++ b/examples/ui/adaptive_app_demos/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: @@ -12,7 +12,7 @@ dependencies: bitsdojo_window: ^0.1.6 flextras: ^1.0.0 - provider: ^6.1.5 + provider: ^6.1.5+1 universal_platform: ^1.1.0 platform: ^3.1.6 diff --git a/examples/ui/assets_and_images/pubspec.yaml b/examples/ui/assets_and_images/pubspec.yaml index 31e8cc3542..56e6643f7f 100644 --- a/examples/ui/assets_and_images/pubspec.yaml +++ b/examples/ui/assets_and_images/pubspec.yaml @@ -4,18 +4,18 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - cupertino_icons: ^1.0.8 - vector_graphics: ^1.1.19 + cupertino_icons: ^1.0.9 + vector_graphics: ^1.2.2 dev_dependencies: flutter_test: sdk: flutter - vector_graphics_compiler: ^1.1.17 + vector_graphics_compiler: ^1.2.3 flutter: uses-material-design: true diff --git a/examples/ui/focus/pubspec.yaml b/examples/ui/focus/pubspec.yaml index 2c13423351..a2cc7789f1 100644 --- a/examples/ui/focus/pubspec.yaml +++ b/examples/ui/focus/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/ui/interactive/pubspec.yaml b/examples/ui/interactive/pubspec.yaml index 65d4a388d0..fc52dbc79e 100644 --- a/examples/ui/interactive/pubspec.yaml +++ b/examples/ui/interactive/pubspec.yaml @@ -3,7 +3,7 @@ description: Sample code for interactive.md resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/ui/navigation/pubspec.yaml b/examples/ui/navigation/pubspec.yaml index 442d5d683f..8c47570a83 100644 --- a/examples/ui/navigation/pubspec.yaml +++ b/examples/ui/navigation/pubspec.yaml @@ -4,13 +4,13 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: sdk: flutter - go_router: ^17.0.1 + go_router: ^17.2.3 flutter: uses-material-design: true diff --git a/examples/ui/widgets_intro/pubspec.yaml b/examples/ui/widgets_intro/pubspec.yaml index 3fd65854b9..35c9b75433 100644 --- a/examples/ui/widgets_intro/pubspec.yaml +++ b/examples/ui/widgets_intro/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/examples/visual_debugging/pubspec.yaml b/examples/visual_debugging/pubspec.yaml index 73c889985e..f124c4eed0 100644 --- a/examples/visual_debugging/pubspec.yaml +++ b/examples/visual_debugging/pubspec.yaml @@ -4,7 +4,7 @@ description: Examples of visual debugging. resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: flutter: diff --git a/firebase.json b/firebase.json index 2ebb01a3ee..9e34dc252e 100644 --- a/firebase.json +++ b/firebase.json @@ -371,6 +371,7 @@ { "source": "/go/compass-25", "destination": "https://github.com/flutter/demos/tree/main/compass_25", "type": 301 }, { "source": "/go/configurable-autosubmit", "destination": "https://docs.google.com/document/d/14pf4jfBy1-PHYmJLVbeqrh1swTF01SZ2YD3DR_Qv3kM/edit?usp=sharing&resourcekey=0-AW7-kNNGmmpSUqyOvBdwRg", "type": 301 }, { "source": "/go/contextual-menus", "destination": "https://docs.google.com/document/d/1F1itGgbSS3Cbq70hScSCNriDoux1sMGF9LHZsMdvU74/edit?resourcekey=0-RkHGwhe-tcoTGlaQyclPtQ", "type": 301 }, + { "source": "/go/contributor-ladder", "destination": "https://docs.google.com/document/d/1ITkAaE96R1kWgttDFVQYYKvdyHlcOz_Rs1QyiS8JMEY/edit?usp=sharing", "type": 301 }, { "source": "/go/cross_file-content-uri-implementation", "destination": "https://docs.google.com/document/d/1-d7uWlB9ERPIOFRQ1nJGGiPDb9ALh7QxincEPOmGc3c", "type": 301 }, { "source": "/go/cupertino-bottom-sheet-routes", "destination": "https://docs.google.com/document/d/16eMliX4HsDjRmEob2lksM6JBq2_LPVM26uYGyTid1ec/edit#", "type": 301 }, { "source": "/go/cupertino-context-menu-action", "destination": "https://docs.google.com/document/d/1lCuPyAbIzAr0c2KIEZhREC_EnkTKBxNiqP6lGLT-KpU/edit", "type": 301 }, @@ -557,6 +558,7 @@ { "source": "/go/introduce-disposable", "destination": "https://docs.google.com/document/d/1cjylBOczGk70x-sn1iZYVNAfpPZdtGWsm_KzoNQX0jc/edit", "type": 301 }, { "source": "/go/io22concurrency", "destination": "https://github.com/goderbauer/io22concurrency", "type": 301 }, { "source": "/go/ios-17-text-input", "destination": "https://docs.google.com/document/d/1sM3HMv-SQin39yX1aPUU7vtGv7Hcef1Quc3QhRXBl6A/edit?resourcekey=0-SFYD8vmOIkXiXCZvB1Wlcw", "type": 301 }, + { "source": "/go/ios-26-keyboard-bleed", "destination": "https://docs.google.com/document/d/1WU1XhnVQYIgdab8dAqpVjLLviK02BeOmjDjektpYHRk/edit?usp=sharing", "type": 301 }, { "source": "/go/ios-autocorrection-highlight-support", "destination": "https://docs.google.com/document/d/18ZO7ThKu2wwCofGOKZSInPsq93IzkQTRn9eiyskeh7I/edit", "type": 301 }, { "source": "/go/ios-camera-plugin-thread-model", "destination": "https://docs.google.com/document/d/1Znjp-BduXIb1Ix3JOE1YKyJi1Z0d6rB-2q6Lt7j8xSo/edit", "type": 301 }, { "source": "/go/ios-keyboard-calculating-inset", "destination": "https://docs.google.com/document/d/1pb1oqTanWSxwM8nAdm_-_ero3P6MM05vR1JjcdeFkiM/edit?usp=sharing&resourcekey=0-syHrzFB8A4zywVaHBicZNg", "type": 301 }, @@ -593,6 +595,7 @@ { "source": "/go/lints-migration", "destination": "/release/breaking-changes/flutter-lints-package", "type": 301 }, { "source": "/go/localizing-datetime", "destination": "https://docs.google.com/document/d/1QR3qLXWdroTVLbnAQ8mq-Ia6tsZ8NY3lmi7gySQAstU/edit", "type": 301 }, { "source": "/go/mac-voiceover-text-editing", "destination": "https://docs.google.com/document/d/19YP1o4Shba6NzQTBH_EWC8y1GUhKAbo9dan4digFbZs", "type": 301 }, + { "source": "/go/macos-intel-deprecation", "destination": "https://docs.google.com/document/d/1ty3js_Eg2sNIbDuyYS_aV7h4jYdx1hEpX_mV135gO4s/edit?usp=sharing", "type": 301 }, { "source": "/go/macros-for-leak-tracker", "destination": "https://docs.google.com/document/d/1ireWmX4J5Jc6oDO1PmAXPlLdiAlCHvTz8SVC_Sg9KM8/edit?usp=sharing&resourcekey=0-yODb_SAStMgMefYpQeX8uQ", "type": 301 }, { "source": "/go/make-dropdownmenuitem-value-param-required", "destination": "https://docs.google.com/document/d/1x5jsgnLxI3wSDwXRzO0n5hdXKn2a_XTJcsXdjFZLX44/edit", "type": 301 }, { "source": "/go/match-xcode-deployment-range", "destination": "https://docs.google.com/document/d/1Y1WpbQPMOL3GvL8ow_OTD_-ENG3uuhS46CGRhLt12I8/edit?usp=sharing", "type": 301 }, @@ -638,6 +641,7 @@ { "source": "/go/optimized-platform-view-layers", "destination": "https://docs.google.com/document/d/1YHwVz7-F03psEzHxByGka_lIFaDV5K90BJMbNxQeK4k/edit?resourcekey=0-n4_VcUnMU-99sjJ6C1_Ycw#", "type": 301 }, { "source": "/go/os-adaptive-shortcut-activator", "destination": "https://docs.google.com/document/d/11NWj13MSDw1XQg4MpYIeqzcCFGuzQ_Cz7tYXW7fqzPY/edit?usp=sharing", "type": 301 }, { "source": "/go/outline-input-border-padding-fix", "destination": "https://docs.google.com/document/d/1QBM5oM9qPWVeFSPSqpXOFbdXV9dH9A9ABKsNMs1J2XU/edit?usp=sharing", "type": 301 }, + { "source": "/go/overlay-semantics", "destination": "https://docs.google.com/document/d/1XfHWGTmt_w4N7r3H1ag53MiYZME0VKseT3D6XaOCZKM/edit?usp=sharing", "type": 301 }, { "source": "/go/overridable-text-actions", "destination": "https://docs.google.com/document/d/11vmEZTjB4_E4el1IjTo2VBI2d_fR7tjQWeCajsQc-q4/edit?usp=sharing", "type": 301 }, { "source": "/go/package-release-strategy", "destination": "https://docs.google.com/document/d/18kjoP-4LAXEllugVOQRg6vZELyD6MuxlKilLD4lFxSY/edit?usp=sharing", "type": 301 }, { "source": "/go/packaged-ai-assets", "destination": "https://docs.google.com/document/d/1k_X-Sp4GQyZP6k9lvZ1Itj0GvzQZuWl3iKzi5AIa69Q/edit?usp=sharing", "type": 301 }, diff --git a/packages/analysis_defaults/pubspec.yaml b/packages/analysis_defaults/pubspec.yaml index bbf8f5f2e2..27177f7e1d 100644 --- a/packages/analysis_defaults/pubspec.yaml +++ b/packages/analysis_defaults/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 # NOTE: Code isn't allowed in this package. # Don't add dependencies besides the underlying lints package. diff --git a/packages/excerpter/pubspec.yaml b/packages/excerpter/pubspec.yaml index 9c4208deab..9a1118e383 100644 --- a/packages/excerpter/pubspec.yaml +++ b/packages/excerpter/pubspec.yaml @@ -5,21 +5,21 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: - args: ^2.6.0 - collection: ^1.19.0 - file: ^7.0.0 - glob: ^2.1.2 - meta: ^1.16.0 - path: ^1.9.0 + args: ^2.7.0 + collection: ^1.19.1 + file: ^7.0.1 + glob: ^2.1.3 + meta: ^1.18.2 + path: ^1.9.1 dev_dependencies: analysis_defaults: path: ../analysis_defaults io: ^1.0.5 - test: ^1.28.0 + test: ^1.31.1 executables: excerpter: excerpter diff --git a/pubspec.yaml b/pubspec.yaml index 22ccee33cb..a3d2f1b3e2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ description: >- publish_to: none environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 workspace: - packages/analysis_defaults diff --git a/sites/docs/lib/src/components/dartpad/embedded_dartpad.dart b/sites/docs/lib/src/components/dartpad/embedded_dartpad.dart index 21966a5576..673d61db95 100644 --- a/sites/docs/lib/src/components/dartpad/embedded_dartpad.dart +++ b/sites/docs/lib/src/components/dartpad/embedded_dartpad.dart @@ -27,12 +27,12 @@ final class EmbeddedDartPad extends StatefulComponent { final String code; /// Creates an embedded DartPad instance with - /// the specified [iframeId] and [iframeUrl]. + /// the specified [iframeId] and [_iframeUrl]. EmbeddedDartPad._({ required this.iframeId, - required String iframeUrl, + required this._iframeUrl, required this.code, - }) : _iframeUrl = iframeUrl; + }); /// Creates a new embedded DartPad element with the specified configuration. /// diff --git a/sites/docs/pubspec.yaml b/sites/docs/pubspec.yaml index 040d7ad96c..133f430a6d 100644 --- a/sites/docs/pubspec.yaml +++ b/sites/docs/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://docs.flutter.dev resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: build: ^4.0.6 @@ -16,9 +16,9 @@ dependencies: jaspr_content: ^0.5.2 # Used as our template engine. liquify: ^1.5.1 - markdown: ^7.3.0 + markdown: ^7.3.1 markdown_description_list: ^0.1.1 - meta: ^1.18.1 + meta: ^1.18.2 nanoid2: ^2.0.1 # Used for syntax highlighting. opal: ^0.2.2 @@ -31,10 +31,10 @@ dev_dependencies: analysis_defaults: path: ../../packages/analysis_defaults build_runner: ^2.15.0 - build_web_compilers: ^4.4.19 + build_web_compilers: ^4.6.0 jaspr_builder: ^0.23.1 sass: ^1.99.0 - sass_builder: ^2.4.0 + sass_builder: ^2.4.0+1 jaspr: mode: static diff --git a/sites/docs/src/_includes/docs/add-to-app/ios-project/local-network-privacy-permissions.md b/sites/docs/src/_includes/docs/add-to-app/ios-project/local-network-privacy-permissions.md new file mode 100644 index 0000000000..3775c94d4a --- /dev/null +++ b/sites/docs/src/_includes/docs/add-to-app/ios-project/local-network-privacy-permissions.md @@ -0,0 +1,113 @@ +On iOS 14 and later, enable the Dart multicast DNS service in the +**Debug** version of your iOS app. +This adds [debugging functionalities such as hot-reload and DevTools][] +using `flutter attach`. + +:::warning +Never enable this service in the **Release** version of your app. +The Apple App Store might reject your app. +::: + +To set local network privacy permissions only in the Debug version of your app, +create a separate `Info.plist` per build configuration. +SwiftUI projects start without an `Info.plist` file. +If you need to create a property list, +you can do so through Xcode or text editor. +The following instructions assume the default **Debug** and **Release**. +Adjust the names as needed depending on your app's build configurations. + +1. Create a new property list. + + 1. Open your project in Xcode. + + 1. In the **Project Navigator**, click on the project name. + + 1. From the **Targets** list in the Editor pane, click on your app. + + 1. Click the **Info** tab. + + 1. Expand **Custom iOS Target Properties**. + + 1. Right-click on the list and select **Add Row**. + + 1. From the dropdown menu, select **Bonjour Services**. + This creates a new property list in the project directory + called `Info`. This displays as `Info.plist` in the Finder. + +1. Rename the `Info.plist` to `Info-Debug.plist` + + 1. Click on **Info** file in the project list at the left. + + 1. In the **Identity and Type** panel at the right, + change the **Name** from `Info.plist` to `Info-Debug.plist`. + +1. Create a Release property list. + + 1. In the **Project Navigator**, click on `Info-Debug.plist`. + + 1. Select **File** > **Duplicate...**. + You can also press Cmd + Shift + S. + + 1. In the dialog box, set the **Save As:** field to + `Info-Release.plist` and click **Save**. + +1. Add the necessary properties to the **Debug** property list. + + 1. In the **Project Navigator**, click on `Info-Debug.plist`. + + 1. Add the String value `_dartVmService._tcp` + to the **Bonjour Services** array. + + 1. _(Optional)_ To set your desired customized permission dialog text, + add the key **Privacy - Local Network Usage Description**. + + + +1. Set the target to use different property lists for different build modes. + + 1. In the **Project Navigator**, click on your project. + + 1. Click the **Build Settings** tab. + + 1. Click **All** and **Combined** sub-tabs. + + 1. In the Search box, type `plist`. + This limits the settings to those that include property lists. + + 1. Scroll through the list until you see **Packaging**. + + 1. Click on the **Info.plist File** setting. + + 1. Change the **Info.plist File** value + from `path/to/Info.plist` to `path/to/Info-$(CONFIGURATION).plist`. + + + + This resolves to the path **Info-Debug.plist** in **Debug** and + **Info-Release.plist** in **Release**. + + + +1. Remove the **Release** property list from the **Build Phases**. + + 1. In the **Project Navigator**, click on your project. + + 1. Click the **Build Phases** tab. + + 1. Expand **Copy Bundle Resources**. + + 1. If this list includes `Info-Release.plist`, + click on it and then click the **-** (minus sign) under it + to remove the property list from the resources list. + + + +1. The first Flutter screen your Debug app loads prompts + for local network permission. + + Click **OK**. + + _(Optional)_ To grant permission before the app loads, enable + **Settings > Privacy > Local Network > Your App**. + +[debugging functionalities such as hot-reload and DevTools]: /add-to-app/debugging \ No newline at end of file diff --git a/sites/docs/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md b/sites/docs/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md index 2bdfa40cc5..d0f5dc223c 100644 --- a/sites/docs/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md +++ b/sites/docs/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md @@ -269,7 +269,7 @@ The example below uses `ios`, replace `ios` with `macos`/`darwin` as applicable. :::note `Bundle.module` only works if there are resources [defined in the `Package.swift` file][Bundling resources] or - [automatically included by Xcode][Xcode resource detection]). + [automatically included by Xcode][Xcode resource detection]. Otherwise, using `Bundle.module` results in an error. ::: diff --git a/sites/docs/src/content/add-to-app/android/add-flutter-view.md b/sites/docs/src/content/add-to-app/android/add-flutter-view.md index fbdb61a0b5..a66bbc1875 100644 --- a/sites/docs/src/content/add-to-app/android/add-flutter-view.md +++ b/sites/docs/src/content/add-to-app/android/add-flutter-view.md @@ -95,7 +95,7 @@ system UI overlay, plugins, and so on. ## Content-sized views Usually, a [`FlutterView`]({{site.api}}/javadoc/io/flutter/embedding/android/FlutterView.html) -needs fixed dimensions either through it's own dimensions or by matching a +needs fixed dimensions either through its own dimensions or by matching a parent's dimensions. This can be seen in the [sample project]({{site.repo.samples}}/tree/main/add_to_app/android_view/android_view). However, it's now possible to allow `FlutterView` to size itself based on its content. By using, `content_wrap` for either the height diff --git a/sites/docs/src/content/add-to-app/index.md b/sites/docs/src/content/add-to-app/index.md index a32c1d35af..61914cf278 100644 --- a/sites/docs/src/content/add-to-app/index.md +++ b/sites/docs/src/content/add-to-app/index.md @@ -3,8 +3,8 @@ title: 将 Flutter 集成到现有应用 # shortTitle: Add to app shortTitle: 集成到现有应用 -# description: Adding Flutter as a library to an existing Android or iOS app. -description: 将 Flutter 作为 library 集成到现有的 Android 或 iOS 应用。 +# description: Adding Flutter as a library to an existing Android, iOS, macOS, or web app. +description: 将 Flutter 作为 library 集成到现有的 Android、iOS、macOS 以及 web 应用。 tags: Flutter混合工程,add2app keywords: Flutter原生混编,Flutter集成 --- @@ -24,11 +24,11 @@ the rest can be rendered using existing technology. This method can also be used to run shared non-UI logic by taking advantage of Dart's portability and interoperability with other languages. -Add-to-app is currently supported on Android, iOS, and web. +Add-to-app is currently supported on Android, iOS, macOS, and web. Flutter supports two flavors of add-to-app: -- **Multi-engine**: supported on Android and iOS, allows running one or more +- **Multi-engine**: supported on Android, iOS, and macOS, allows running one or more instances of Flutter, each rendering a widget embedded into the host application. Each instance is a separate Dart program, running in isolation from other programs. Having multiple Flutter instances allows each instance to @@ -109,18 +109,16 @@ various use-cases. Two of the most common use-cases are: -* Auto-build and import the Flutter module by adding a Flutter - SDK hook to your CocoaPods and to your Xcode build phase. - - 在 Xcode 的 Build Phase 以及 CocoaPods 中, - 添加一个自动构建并引入 Flutter 模块的 Flutter SDK 钩子。 - -* Build your Flutter module into a generic [iOS Framework][] +* Build your Flutter module into a Swift package for integration into your own build system. - 将 Flutter 模块构建为通用的 [iOS Framework][] + 将 Flutter 模块构建为 Swift package, 以便集成到你自己的构建系统中; - + +* Auto-build and import the Flutter module using Xcode build phases. + + 使用 Xcode 的 Build Phase 自动构建并引入 Flutter 模块。 + * [`FlutterEngine`][ios-engine] API for starting and persisting your Flutter environment independently of attaching a [`FlutterViewController`][]. @@ -151,6 +149,20 @@ a Flutter module for UI. 请查看我们的 [add-to-app GitHub 示例仓库][add-to-app GitHub Samples repository], 其中包含了在 Android 和 iOS 平台上引入 Flutter module 用于 UI 的示例项目。 +### Add to macOS applications +* Build your Flutter module into a Swift package + for integration into your own build system. +* Auto-build and import the Flutter module using Xcode build phases. +* [`FlutterEngine`][macos-engine] API for starting and persisting + your Flutter environment independently of attaching a + [`FlutterViewController`][macos-flutterviewcontroller]. +* Swift host apps supported. +* Flutter modules can use [Flutter plugins][] to interact + with the platform. +* Support for Flutter debugging and stateful hot reload by + using `flutter attach` from IDEs or the command line to + connect to an app that contains Flutter. + ### Add to web applications Flutter can be added to any existing HTML DOM-based web app written in any @@ -182,7 +194,7 @@ To add Flutter to an existing app, build it normally, then follow the ## 开始 To get started, see our project integration guide for -Android and iOS: +Android, web, iOS, and macOS: 第一步,查看以下工程集成指南 @@ -192,14 +204,22 @@ Android and iOS: Android + +
+ Web +
+
+ + + @@ -219,14 +239,23 @@ see our API usage guides at the following links: Android - + + +
+ web +
+
+ + + @@ -293,3 +322,5 @@ Web 端的限制: [maintained by the Flutter team]: {{site.repo.packages}}/tree/main/packages [multiple Flutters]: /add-to-app/multiple-flutters [FlutterView]: https://api.flutter-io.cn/flutter/dart-ui/FlutterView-class.html +[macos-engine]: {{site.api}}/macos-embedder/interface_flutter_engine.html +[macos-flutterviewcontroller]: {{site.api}}/macos-embedder/interface_flutter_view_controller.html diff --git a/sites/docs/src/content/add-to-app/ios/project-setup-legacy.md b/sites/docs/src/content/add-to-app/ios/project-setup-legacy.md new file mode 100644 index 0000000000..d25ec14b64 --- /dev/null +++ b/sites/docs/src/content/add-to-app/ios/project-setup-legacy.md @@ -0,0 +1,211 @@ +--- +title: Integrate a Flutter module into your iOS project (Legacy) +shortTitle: Integrate Flutter (Legacy) +description: Learn how to integrate a Flutter module into your existing iOS project. +--- + +:::warning + +As of Flutter 3.44, Swift Package Manager (SwiftPM) replaces CocoaPods +as the default dependency manager for iOS and macOS Flutter apps. +CocoaPods is officially in maintenance mode, +and its registry will permanently [become read-only on December 2, 2026][]. + +This guide is preserved for reference only, and will not receive ongoing maintenance. +Please migrate to using Swift Package Manager using the [updated integration guide][]. + +::: + +Flutter UI components can be incrementally added into your existing iOS +application as embedded frameworks. +To embed Flutter in your existing application, +consider one of the following three methods. + +| Embedding Method | Methodology | Benefit | +|---|---|---| +| Use CocoaPods _(Recommended)_ | Install and use the Flutter SDK and CocoaPods. Flutter compiles the `flutter_module` from source each time Xcode builds the iOS app. | Least complicated method to embed Flutter into your app. | +| Use [iOS frameworks][] | Create iOS frameworks for Flutter components, embed them into your iOS, and update your existing app's build settings. | Doesn't require every developer to install the Flutter SDK and CocoaPods on their local machines. | +| Use iOS frameworks and CocoaPods | Embed the frameworks for your iOS app and the plugins in Xcode, but distribute the Flutter engine as a CocoaPods podspec. | Provides an alternative to distributing the large Flutter engine (`Flutter.xcframework`) library. | + +{:.table .table-striped} + +[iOS frameworks]: {{site.apple-dev}}/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WhatAreFrameworks.html + +When you add Flutter to your existing iOS app, +it [increases the size of your iOS app][app-size]. + +For examples using an app built with UIKit, +see the iOS directories in the [add_to_app code samples][]. +For an example using SwiftUI, consult the iOS directory in [News Feed App][]. + +## Development system requirements + +Flutter requires the latest version of Xcode and [CocoaPods][]. + +## Create a Flutter module + +To embed Flutter into your existing application with any method, +create a Flutter module first. +Use the following command to create a Flutter module. + +```console +$ cd /path/to/my_flutter +$ flutter create --template module my_flutter +``` + +Flutter creates module project under `/path/to/my_flutter/`. +If you use the [CocoaPods method][], save the module +in the same parent directory as your existing iOS app. + +[CocoaPods method]: /add-to-app/ios/project-setup-legacy/?tab=embed-using-cocoapods + +From the Flutter module directory, +you can run the same `flutter` commands you would in any other Flutter project, +like `flutter run` or `flutter build ios`. +You can also run the module in [VS Code][] or +[Android Studio/IntelliJ][] with the Flutter and Dart plugins. +This project contains a single-view example version of your module +before embedding it in your existing iOS app. +This helps when testing the Flutter-only parts of your code. + +## Organize your module + +The `my_flutter` module directory structure resembles a typical Flutter app. + + + +- my_flutter/ + - .ios/ + - Runner.xcworkspace + - Flutter/ + - podhelper.rb + - lib/ + - main.dart + - test/ + - pubspec.yaml + + + +Your Dart code should be added to the `lib/` directory. +Your Flutter dependencies, packages, and plugins must be added to the +`pubspec.yaml` file. + +The `.ios/` hidden subfolder contains an Xcode workspace where +you can run a standalone version of your module. +This wrapper project bootstraps your Flutter code. +It contains helper scripts to facilitate building frameworks or +embedding the module into your existing application with CocoaPods. + +:::note + +* Add custom iOS code to your own existing application's + project or to a plugin, not to the module's `.ios/` + directory. Changes made in your module's `.ios/` + directory don't appear in your existing iOS project + using the module, and might be overwritten by Flutter. + +* Exclude the `.ios/` directory from source control as + it's autogenerated. + +* Before building the module on a new machine, + run `flutter pub get` in the `my_flutter` directory. + This regenerates the `.ios/` directory before building + the iOS project that uses the Flutter module. + +::: + +## Embed a Flutter module in your iOS app + +After you have developed your Flutter module, +you can embed it using the methods described +in the table at the top of the page. + +You can run in **Debug** mode on a simulator or a real device, +and **Release** mode on a real device. + +:::note +Learn more about [Flutter's build modes][build modes of Flutter]. + +To use Flutter debugging features such as hot reload, +consult [Debugging your add-to-app module][]. +::: + + + + +{% render "docs/add-to-app/ios-project/embed-cocoapods.md" %} + + + + +{% render "docs/add-to-app/ios-project/embed-frameworks.md" %} + + + + +{% render "docs/add-to-app/ios-project/embed-split.md" %} + + + + + +## Set local network privacy permissions + +{% render "docs/add-to-app/ios-project/local-network-privacy-permissions.md" %} + +## Mitigate known issue with Apple Silicon Macs + +On [Macs running Apple Silicon][apple-silicon], +the host app builds for an `arm64` simulator. +While Flutter supports `arm64` simulators, some plugins might not. +If you use one of these plugins, you might see a compilation error like +**Undefined symbols for architecture arm64**. +If this occurs, +exclude `arm64` from the simulator architectures in your host app. + +1. In the **Project Navigator**, click on your project. + +1. Click the **Build Settings** tab. + +1. Click **All** and **Combined** sub-tabs. + +1. Under **Architectures**, click on **Excluded Architectures**. + +1. Expand to see the available build configurations. + +1. Click **Debug**. + +1. Click the **+** (plus sign). + +1. Select **iOS Simulator**. + +1. Double-click in the value column for **Any iOS Simulator SDK**. + +1. Click the **+** (plus sign). + +1. Type `arm64` in the **Debug > Any iOS Simulator SDK** dialog box. + + + +1. Press Esc to close this dialog box. + +1. Repeat these steps for the **Release** build mode. + +1. Repeat for any iOS unit test targets. + +## Next steps + +You can now [add a Flutter screen][] to your existing iOS app. + +[add_to_app code samples]: {{site.repo.samples}}/tree/main/add_to_app +[add a Flutter screen]: /add-to-app/ios/add-flutter-screen +[Android Studio/IntelliJ]: /tools/android-studio +[build modes of Flutter]: /testing/build-modes +[CocoaPods]: https://cocoapods.org/ +[app-size]: /resources/faq#how-big-is-the-flutter-engine +[VS Code]: /tools/vs-code +[News Feed app]: https://github.com/flutter/put-flutter-to-work/tree/022208184ec2623af2d113d13d90e8e1ce722365 +[Debugging your add-to-app module]: /add-to-app/debugging/ +[apple-silicon]: https://support.apple.com/en-us/116943 +[become read-only on December 2, 2026]: https://blog.cocoapods.org/CocoaPods-Specs-Repo/ +[updated integration guide]: /add-to-app/ios/project-setup \ No newline at end of file diff --git a/sites/docs/src/content/add-to-app/ios/project-setup.md b/sites/docs/src/content/add-to-app/ios/project-setup.md index a259ce6cdb..0f870fc63b 100644 --- a/sites/docs/src/content/add-to-app/ios/project-setup.md +++ b/sites/docs/src/content/add-to-app/ios/project-setup.md @@ -1,313 +1,282 @@ --- -# title: Integrate a Flutter module into your iOS project -title: 将 Flutter module 集成到 iOS 项目 +# title: Integrate a Flutter app into your iOS project +title: 将 Flutter 应用集成到 iOS 项目 # shortTitle: Integrate Flutter shortTitle: 集成 Flutter -# description: Learn how to integrate a Flutter module into your existing iOS project. -description: 了解如何将 Flutter module 集成到你现有的 iOS 项目中。 +# description: Learn how to integrate a Flutter app into your existing iOS project. +description: 了解如何将 Flutter 应用集成到你现有的 iOS 项目中。 tags: Flutter混合工程,add2app keywords: iOS,项目集成 --- -Flutter UI components can be incrementally added into your existing iOS -application as embedded frameworks. -To embed Flutter in your existing application, -consider one of the following three methods. +:::tip New! This guide has been updated to use Swift Package Manager -| Embedding Method | Methodology | Benefit | -|---|---|---| -| Use CocoaPods _(Recommended)_ | Install and use the Flutter SDK and CocoaPods. Flutter compiles the `flutter_module` from source each time Xcode builds the iOS app. | Least complicated method to embed Flutter into your app. | -| Use [iOS frameworks][] | Create iOS frameworks for Flutter components, embed them into your iOS, and update your existing app's build settings. | Doesn't require every developer to install the Flutter SDK and CocoaPods on their local machines. | -| Use iOS frameworks and CocoaPods | Embed the frameworks for your iOS app and the plugins in Xcode, but distribute the Flutter engine as a CocoaPods podspec. | Provides an alternative to distributing the large Flutter engine (`Flutter.xcframework`) library. | +As of Flutter 3.44, Swift Package Manager replaces CocoaPods +as the default dependency manager for iOS and macOS Flutter apps. +CocoaPods is officially in maintenance mode, +and its registry will permanently [become read-only on December 2, 2026][]. -{:.table .table-striped} +The [legacy integration guide][] is preserved for reference, +but will not receive ongoing maintenance. +Please migrate to using Swift Package Manager. -[iOS frameworks]: {{site.apple-dev}}/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WhatAreFrameworks.html +::: -When you add Flutter to your existing iOS app, -it [increases the size of your iOS app][app-size]. +Flutter UI components can be incrementally added +into your existing iOS application using Swift packages. -For examples using an app built with UIKit, -see the iOS directories in the [add_to_app code samples][]. -For an example using SwiftUI, consult the iOS directory in [News Feed App][]. +## Prerequisites -## Development system requirements +* Flutter 3.44 or later +* Xcode 15.0 or later -Flutter requires the latest version of Xcode and [CocoaPods][]. +### Migrate from Legacy Integration (If Applicable) {: #migrate-legacy-integration} -## Create a Flutter module +If you've already integrated Flutter into your iOS app +using CocoaPods or embedded frameworks, +you must first remove that integration +before following the Swift Package Manager instructions below. -To embed Flutter into your existing application with any method, -create a Flutter module first. -Use the following command to create a Flutter module. +
+ Expand to see instructions to migrate from CocoaPods integration -```console -$ cd /path/to/my_flutter -$ flutter create --template module my_flutter -``` + If your app was previously integrated using CocoaPods, + you must first remove the Flutter installation code from your Podfile. -Flutter creates module project under `/path/to/my_flutter/`. -If you use the [CocoaPods method][], save the module -in the same parent directory as your existing iOS app. + 1. Remove Flutter installation code from your Podfile + ```ruby title="MyApp/Podfile" diff + - flutter_application_path = '../my_flutter' + - load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb') -[CocoaPods method]: /add-to-app/ios/project-setup/?tab=embed-using-cocoapods + - install_all_flutter_pods(flutter_application_path) -From the Flutter module directory, -you can run the same `flutter` commands you would in any other Flutter project, -like `flutter run` or `flutter build ios`. -You can also run the module in [VS Code][] or -[Android Studio/IntelliJ][] with the Flutter and Dart plugins. -This project contains a single-view example version of your module -before embedding it in your existing iOS app. -This helps when testing the Flutter-only parts of your code. + - flutter_post_install(installer) if defined?(flutter_post_install) + ``` -## Organize your module + 1. Run `pod install`. +
-The `my_flutter` module directory structure resembles a typical Flutter app. +
+ Expand to see instructions to migrate from embedded frameworks integration - + If your app was previously integrated using frameworks + generated by the `flutter build ios-framework` command, + you must first remove the frameworks from your Xcode project. -- my_flutter/ - - .ios/ - - Runner.xcworkspace - - Flutter/ - - podhelper.rb - - lib/ - - main.dart - - test/ - - pubspec.yaml + 1. Navigate to your target's General tab + and remove all Flutter-related frameworks and libraries + under **Frameworks, Libraries, and Embedded Content**. - - -Your Dart code should be added to the `lib/` directory. -Your Flutter dependencies, packages, and plugins must be added to the -`pubspec.yaml` file. - -The `.ios/` hidden subfolder contains an Xcode workspace where -you can run a standalone version of your module. -This wrapper project bootstraps your Flutter code. -It contains helper scripts to facilitate building frameworks or -embedding the module into your existing application with CocoaPods. + This includes the `App.xcframework`, `Flutter.xcframework`, + `FlutterPluginRegistrant.xcframework`, + and any Flutter plugins' `xcframework` files. -:::note - -* Add custom iOS code to your own existing application's - project or to a plugin, not to the module's `.ios/` - directory. Changes made in your module's `.ios/` - directory don't appear in your existing iOS project - using the module, and might be overwritten by Flutter. + 1. Remove the Flutter pod from your Podfile + ```ruby title="MyApp/Podfile" diff + - pod 'Flutter', :podspec => '/path/to/MyApp/Flutter/[build mode]/Flutter.podspec' + ``` -* Exclude the `.ios/` directory from source control as - it's autogenerated. + 1. Run `pod install`. +
-* Before building the module on a new machine, - run `flutter pub get` in the `my_flutter` directory. - This regenerates the `.ios/` directory before building - the iOS project that uses the Flutter module. +The [legacy integration guide][] is preserved for reference, +but will not receive ongoing maintenance. -::: +### Organize your projects relative to each other {: #organize-projects-relatively} -## Embed a Flutter module in your iOS app +This guide assumes that your existing iOS app +and your Flutter app or module reside in sibling directories. +If you have a different directory structure, +you will need to adjust the example relative paths accordingly. -After you have developed your Flutter module, -you can embed it using the methods described -in the table at the top of the page. +:::note -You can run in **Debug** mode on a simulator or a real device, -and **Release** mode on a real device. +If integrating for the first time, +it's recommended to use a Flutter application (instead of a module). +Run the following command to create a new Flutter application: -:::note -Learn more about [Flutter's build modes][build modes of Flutter]. +```console +flutter create my_flutter_app +``` -To use Flutter debugging features such as hot reload, -consult [Debugging your add-to-app module][]. ::: - - +The example directory structure resembles the following: -{% render "docs/add-to-app/ios-project/embed-cocoapods.md" %} + + - - + -{% render "docs/add-to-app/ios-project/embed-frameworks.md" %} +- my_flutter_app/ + - ios/ + - lib/ + - main.dart +- MyNativeApp/ + - MyNativeApp.xcodeproj/ + - + -{% render "docs/add-to-app/ios-project/embed-split.md" %} + + +- my_flutter_app/ + - .ios/ + - lib/ + - main.dart +- MyNativeApp/ + - MyNativeApp.xcodeproj/ + +## Integrate with Swift Package Manager {: #integrate-with-swiftpm} -## Set local network privacy permissions - -On iOS 14 and later, enable the Dart multicast DNS service in the -**Debug** version of your iOS app. -This adds [debugging functionalities such as hot-reload and DevTools][] -using `flutter attach`. - -:::warning -Never enable this service in the **Release** version of your app. -The Apple App Store might reject your app. -::: - -To set local network privacy permissions only in the Debug version of your app, -create a separate `Info.plist` per build configuration. -SwiftUI projects start without an `Info.plist` file. -If you need to create a property list, -you can do so through Xcode or text editor. -The following instructions assume the default **Debug** and **Release**. -Adjust the names as needed depending on your app's build configurations. - -1. Create a new property list. - - 1. Open your project in Xcode. - - 1. In the **Project Navigator**, click on the project name. - - 1. From the **Targets** list in the Editor pane, click on your app. - - 1. Click the **Info** tab. - - 1. Expand **Custom iOS Target Properties**. - - 1. Right-click on the list and select **Add Row**. - - 1. From the dropdown menu, select **Bonjour Services**. - This creates a new property list in the project directory - called `Info`. This displays as `Info.plist` in the Finder. - -1. Rename the `Info.plist` to `Info-Debug.plist` - - 1. Click on **Info** file in the project list at the left. - - 1. In the **Identity and Type** panel at the right, - change the **Name** from `Info.plist` to `Info-Debug.plist`. - -1. Create a Release property list. - - 1. In the **Project Navigator**, click on `Info-Debug.plist`. - - 1. Select **File** > **Duplicate...**. - You can also press Cmd + Shift + S. - - 1. In the dialog box, set the **Save As:** field to - `Info-Release.plist` and click **Save**. - -1. Add the necessary properties to the **Debug** property list. - - 1. In the **Project Navigator**, click on `Info-Debug.plist`. - - 1. Add the String value `_dartVmService._tcp` - to the **Bonjour Services** array. + 1.

Build the FlutterNativeIntegration Swift package

- 1. _(Optional)_ To set your desired customized permission dialog text, - add the key **Privacy - Local Network Usage Description**. + Within your Flutter application or module, run the following command: - + ```console + flutter build swift-package --platform ios + ``` -1. Set the target to use different property lists for different build modes. + This will generate the following directories: - 1. In the **Project Navigator**, click on your project. + - 1. Click the **Build Settings** tab. + - my_flutter_app/build/ios/SwiftPackages/ + - FlutterNativeIntegration/ (A Swift package) + - Scripts/ (Directory of scripts and other files needed) - 1. Click **All** and **Combined** sub-tabs. + - 1. In the Search box, type `plist`. - This limits the settings to those that include property lists. + You can optionally change the location of this output + with the `--output` flag. - 1. Scroll through the list until you see **Packaging**. + 1.

Add FlutterNativeIntegration to your Xcode project

- 1. Click on the **Info.plist File** setting. + 1. Open your existing iOS app in Xcode. + 1. In the Project navigator, right click on your project + and select **Add Files to "MyNativeApp"...** + 1. Navigate to and select the generated + `FlutterNativeIntegration` Swift package and click **Add**. + 1. Select **Reference files in place** and click **Finish**. + 1. In the File inspector, + verify the **Location** is **Relative to Project**. + If it is not, you'll need to move the Flutter output directory + to be a sibling directory of your native app. - 1. Change the **Info.plist File** value - from `path/to/Info.plist` to `path/to/Info-$(CONFIGURATION).plist`. + - + 1. Navigate to your target's **General** tab + and add `FlutterNativeIntegration` under + **Frameworks, Libraries, and Embedded Content**. + - This resolves to the path **Info-Debug.plist** in **Debug** and - **Info-Release.plist** in **Release**. + 1.

Add build settings

- + 1. In the **Build Settings** tab, + set the location of the Flutter app's Swift package output directory: + ``` + FLUTTER_SWIFT_PACKAGE_OUTPUT=$SRCROOT/../my_flutter_app/build/ios/SwiftPackages + ``` -1. Remove the **Release** property list from the **Build Phases**. + 1. For custom configurations, set the Flutter build mode. - 1. In the **Project Navigator**, click on your project. + Flutter supports three [build modes][]: Debug, Profile, and Release. + The build mode is determined using the `CONFIGURATION`. + If your configuration does not match one of these, + you can set the `FLUTTER_BUILD_MODE` build setting + to one of these values. - 1. Click the **Build Phases** tab. + - 1. Expand **Copy Bundle Resources**. + 1. (Optional) Allow Xcode to re-build your Flutter app. - 1. If this list includes `Info-Release.plist`, - click on it and then click the **-** (minus sign) under it - to remove the property list from the resources list. + Add the below build settings to your target + to allow Xcode to re-build your Flutter app as part of its build. + This allows you to make changes to your Flutter application + without needing to re-run `flutter build swift-package`. + This requires Flutter to be installed on the machine. - + ``` + FLUTTER_APPLICATION_PATH=$SRCROOT/../my_flutter_app + ENABLE_USER_SCRIPT_SANDBOXING=NO + ``` -1. The first Flutter screen your Debug app loads prompts - for local network permission. + :::tip + This only re-builds the Flutter app's code. + If you add new dependencies, + you’ll need to re-run `flutter build swift-package`. + ::: - Click **OK**. + 1.

Add Pre-action Run Script to Scheme

- _(Optional)_ To grant permission before the app loads, enable - **Settings > Privacy > Local Network > Your App**. + 1. Open **Product** > **Scheme** > **Edit Scheme...** + > **Build** (in left side bar) > **Pre-action** > **+** + > **New Run Script Action** -## Mitigate known issue with Apple Silicon Macs + 1. Select your project in the **Provide build settings from** dropdown. -On [Macs running Apple Silicon][apple-silicon], -the host app builds for an `arm64` simulator. -While Flutter supports `arm64` simulators, some plugins might not. -If you use one of these plugins, you might see a compilation error like -**Undefined symbols for architecture arm64**. -If this occurs, -exclude `arm64` from the simulator architectures in your host app. + 1. Set the script to the following: + ``` + /bin/sh $FLUTTER_SWIFT_PACKAGE_OUTPUT/Scripts/flutter_integration.sh prebuild + ``` -1. In the **Project Navigator**, click on your project. + -1. Click the **Build Settings** tab. + 1.

Add New Run Script Build Phase to Target

-1. Click **All** and **Combined** sub-tabs. + 1. Navigate to your target's **Build Phases** + > **+** > **New Run Script Phase** -1. Under **Architectures**, click on **Excluded Architectures**. + 1. Set the script to the following: + ``` + /bin/sh $FLUTTER_SWIFT_PACKAGE_OUTPUT/Scripts/flutter_integration.sh assemble + ``` + 1. Uncheck **Based on dependency analysis** + 1. Add the following to **Input File Lists**: + ``` + $(FLUTTER_SWIFT_PACKAGE_OUTPUT)/Scripts/FlutterAssembleInputs.xcfilelist + ``` -1. Expand to see the available build configurations. + -1. Click **Debug**. + 1.

(Optional) Set LLDB Init File

-1. Click the **+** (plus sign). + Using Flutter's LLDB Init File improves performance + when debugging on physical iOS 26+ devices. -1. Select **iOS Simulator**. + 1. Open **Product** > **Scheme** > **Edit Scheme...** > **Run** (in left side bar). + 1. Set the **LLDB Init File** to the following path: + ``` + $(FLUTTER_SWIFT_PACKAGE_OUTPUT)/Scripts/flutter_lldbinit + ``` -1. Double-click in the value column for **Any iOS Simulator SDK**. + Alternatively, if your scheme already has an LLDB Init File, + you can add Flutter's LLDB file to it. + The path to Flutter's LLDB Init File must be relative + to the location of your project's LLDB Init File. -1. Click the **+** (plus sign). + ``` + command source --relative-to-command-file "../my_flutter_app/build/ios/SwiftPackages/Scripts/flutter_lldbinit" + ``` -1. Type `arm64` in the **Debug > Any iOS Simulator SDK** dialog box. +{:.steps} - +## Set local network privacy permissions {: #local-network-permissions} -1. Press Esc to close this dialog box. +{% render "docs/add-to-app/ios-project/local-network-privacy-permissions.md" %} -1. Repeat these steps for the **Release** build mode. -1. Repeat for any iOS unit test targets. ## Next steps You can now [add a Flutter screen][] to your existing iOS app. -[add_to_app code samples]: {{site.repo.samples}}/tree/main/add_to_app [add a Flutter screen]: /add-to-app/ios/add-flutter-screen -[Android Studio/IntelliJ]: /tools/android-studio -[build modes of Flutter]: /testing/build-modes -[CocoaPods]: https://cocoapods.org/ -[debugging functionalities such as hot-reload and DevTools]: /add-to-app/debugging -[app-size]: /resources/faq#how-big-is-the-flutter-engine -[VS Code]: /tools/vs-code -[News Feed app]: https://github.com/flutter/put-flutter-to-work/tree/022208184ec2623af2d113d13d90e8e1ce722365 -[Debugging your add-to-app module]: /add-to-app/debugging/ -[apple-silicon]: https://support.apple.com/en-us/116943 +[legacy integration guide]: /add-to-app/ios/project-setup-legacy +[become read-only on December 2, 2026]: https://blog.cocoapods.org/CocoaPods-Specs-Repo/ +[build modes]: /testing/build-modes \ No newline at end of file diff --git a/sites/docs/src/content/add-to-app/macos/add-flutter-screen.md b/sites/docs/src/content/add-to-app/macos/add-flutter-screen.md new file mode 100644 index 0000000000..69db3b5c11 --- /dev/null +++ b/sites/docs/src/content/add-to-app/macos/add-flutter-screen.md @@ -0,0 +1,338 @@ +--- +title: Add a Flutter screen to an macOS app +shortTitle: Add a Flutter screen +description: Learn how to add a single Flutter screen to your existing macOS app. +--- + +This guide describes how to add a single Flutter screen to an existing macOS app. + +## Start a FlutterEngine and FlutterViewController + +To launch a Flutter screen from an existing macOS app, +you start a [`FlutterEngine`][] and a [`FlutterViewController`][]. + +:::note +The `FlutterEngine` serves as a host to the Dart VM and your Flutter runtime, +and the `FlutterViewController` attaches to a `FlutterEngine` +to pass input events into Flutter +and to display frames rendered by the `FlutterEngine`. +::: + +The `FlutterEngine` might have the same lifespan +as your `FlutterViewController` or outlive your `FlutterViewController`. + +:::tip +It's generally recommended to pre-warm a long-lived +`FlutterEngine` for your application because: + +* The first frame appears faster when showing the `FlutterViewController`. +* Your Flutter and Dart state will outlive one `FlutterViewController`. +* Your application and your plugins can interact with Flutter + and your Dart logic before showing the UI. +::: + +See [Loading sequence and performance][] +for more analysis on the latency and memory +trade-offs of pre-warming an engine. + +### Create a FlutterEngine + +Where you create a `FlutterEngine` depends on your host app. + + + + +In this example, we create a `FlutterEngine` object +inside a SwiftUI [`Observable`][] object called `FlutterDependencies`. +Pre-warm the engine by calling `run()`, and then inject this object +into a `ContentView` using the `environment()` view modifier. + + ```swift title="MyApp.swift" +import SwiftUI +import FlutterMacOS +// The following library connects plugins with macOS platform code to this app. +import FlutterPluginRegistrant + +@Observable +class FlutterDependencies { + let flutterEngine = FlutterEngine(name: "my flutter engine", project: nil) + init() { + // Runs the default Dart entrypoint with a default Flutter route. + flutterEngine.run(withEntrypoint: nil) + // Connects plugins with macOS platform code to this app. + RegisterGeneratedPlugins(registry: self.flutterEngine) + } +} + +@main +struct MyApp: App { + // flutterDependencies will be injected through the view environment. + @State var flutterDependencies = FlutterDependencies() + var body: some Scene { + WindowGroup { + ContentView() + .environment(flutterDependencies) + } + } +} +``` + + + + +As an example, we demonstrate creating a `FlutterEngine`, +exposed as a property, on app startup in the app delegate. + +```swift title="AppDelegate.swift" +import Cocoa +import FlutterMacOS +// The following library connects plugins with macOS platform code to this app. +import FlutterPluginRegistrant + +@main +class AppDelegate: FlutterAppDelegate { + lazy var flutterEngine = FlutterEngine(name: "my flutter engine", project: nil) + + override func applicationDidFinishLaunching(_ aNotification: Notification) { + flutterEngine.run(withEntrypoint: nil) + RegisterGeneratedPlugins(registry: self.flutterEngine) + } +} +``` + + + + +### Show a FlutterViewController with your FlutterEngine + + + + +The following example shows a generic `ContentView` with a +[`NavigationLink`][] hooked to a flutter screen. +First, create a `FlutterViewControllerRepresentable` +to represent the `FlutterViewController`. +The `FlutterViewController` constructor takes +the pre-warmed `FlutterEngine` as an argument, +which is injected through the view environment. + +```swift title="ContentView.swift" +import SwiftUI +import FlutterMacOS + +struct FlutterViewControllerRepresentable: NSViewControllerRepresentable { + // Flutter dependencies are passed in through the view environment. + @Environment(FlutterDependencies.self) var flutterDependencies + + func makeNSViewController(context: Context) -> FlutterViewController { + return FlutterViewController( + engine: flutterDependencies.flutterEngine, + nibName: nil, + bundle: nil + ) + } + + func updateNSViewController(_ nsViewController: FlutterViewController, context: Context) {} +} + +struct ContentView: View { + var body: some View { + NavigationStack { + NavigationLink("My Flutter Feature") { + FlutterViewControllerRepresentable() + } + } + } +} +``` + +Now, you have a Flutter screen embedded in your macOS app. + +:::note +In this example, your Dart `main()` entrypoint function runs +when the `FlutterDependencies` observable is initialized. +::: + + + + +The following example shows a generic `ViewController` with an +`NSButton` hooked to present a [`FlutterViewController`][]. +The `FlutterViewController` uses the `FlutterEngine` instance +created in the `AppDelegate`. + +```swift title="ViewController.swift" +import Cocoa +import FlutterMacOS + +class ViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Make a button to call the showFlutter function when pressed. + let button = NSButton(title: "Show Flutter!", target: self, action: #selector(showFlutter)) + button.frame = CGRect(x: 202, y: 187, width: 160.0, height: 40.0) + self.view.addSubview(button) + } + + @objc func showFlutter() { + let flutterEngine = (NSApplication.shared.delegate as! AppDelegate).flutterEngine + let flutterViewController = + FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil) + self.addChild(flutterViewController) + flutterViewController.view.frame = self.view.bounds + presentAsModalWindow(flutterViewController) + } +} +``` + +Now, you have a Flutter screen embedded in your macOS app. + +:::note +Using the previous example, the default `main()` entrypoint function +of your default Dart library runs +when calling `run` on the `FlutterEngine` created in the `AppDelegate`. +::: + + + + +### _Alternatively_ - Create a FlutterViewController with an implicit FlutterEngine + +As an alternative to the previous example, +you can let the `FlutterViewController` implicitly create +its own `FlutterEngine` without pre-warming one ahead of time. + +This is not usually recommended +because creating a `FlutterEngine` on-demand could introduce a noticeable +latency between when the `FlutterViewController` is presented +and when it renders its first frame. +This could, however, be useful if the Flutter screen is rarely shown, +when there are no good heuristics +to determine when the Dart VM should be started, +and when Flutter doesn't need to persist state between view controllers. + +To let the `FlutterViewController` present without an existing `FlutterEngine`, +omit the `FlutterEngine` construction, +and create the `FlutterViewController` without an engine reference. + + + + +```swift title="ContentView.swift" +// Existing code omitted. +func makeNSViewController(context: Context) -> FlutterViewController { + return FlutterViewController() +} +``` + + + + +```swift title="ViewController.swift" +// Existing code omitted. +func showFlutter() { + let flutterViewController = FlutterViewController() + self.addChild(flutterViewController) + flutterViewController.view.frame = self.view.bounds + presentAsModalWindow(flutterViewController) +} +``` + + + + +See [Loading sequence and performance][] +for more explorations on latency and memory usage. + +## Using the FlutterAppDelegate + +Letting your application's `UIApplicationDelegate` subclass +`FlutterAppDelegate` is recommended but not required. + +The `FlutterAppDelegate` performs functions such as: + +* Forwarding application callbacks such as [`openURLs`][] + to plugins such as [google_sign_in][]. + +### Creating a FlutterAppDelegate subclass + +Creating a subclass of the `FlutterAppDelegate` in UIKit apps was shown +in the [Start a FlutterEngine and FlutterViewController section][]. +In a SwiftUI app, you can create a subclass of the `FlutterAppDelegate` +and annotate it with the [`Observable()`][] macro as follows: + +```swift title="MyApp.swift" +import SwiftUI +import FlutterMacOS + +@Observable +class AppDelegate: FlutterAppDelegate { + let flutterEngine = FlutterEngine(name: "my flutter engine", project: nil) + + override func applicationDidFinishLaunching(_ aNotification: Notification) { + // Runs the default Dart entrypoint with a default Flutter route. + flutterEngine.run(withEntrypoint: nil) + // Used to connect plugins (only if you have plugins + // with macOS platform code). + RegisterGeneratedPlugins(registry: self.flutterEngine) + } +} + +@main +struct MyApp: App { + // Use this property wrapper to tell SwiftUI + // it should use the AppDelegate class for the application delegate + @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate + + var body: some Scene { + WindowGroup { + ContentView() + } + } +} +``` + +Then, in your view, the `AppDelegate` is accessible +through the view environment. + +```swift title="ContentView.swift" +import SwiftUI +import FlutterMacOS + +struct FlutterViewControllerRepresentable: NSViewControllerRepresentable { + // Access the AppDelegate through the view environment. + @Environment(AppDelegate.self) var appDelegate + + func makeNSViewController(context: Context) -> FlutterViewController { + return FlutterViewController( + engine: appDelegate.flutterEngine, + nibName: nil, + bundle: nil + ) + } + + func updateNSViewController(_ nsViewController: FlutterViewController, context: Context) {} +} + +struct ContentView: View { + var body: some View { + NavigationStack { + NavigationLink("My Flutter Feature") { + FlutterViewControllerRepresentable() + } + } + } +} +``` + +[`FlutterEngine`]: {{site.api}}/macos-embedder/interface_flutter_engine.html +[`FlutterViewController`]: {{site.api}}/macos-embedder/interface_flutter_view_controller.html +[Loading sequence and performance]: /add-to-app/performance +[google_sign_in]: {{site.pub}}/packages/google_sign_in +[`openURLs`]: {{site.apple-dev}}/documentation/appkit/nsapplicationdelegate/application(_:open:) +[Start a FlutterEngine and FlutterViewController section]:/add-to-app/macos/add-flutter-screen/#start-a-flutterengine-and-flutterviewcontroller +[`Observable`]: {{site.apple-dev}}/documentation/observation/observable +[`NavigationLink`]: {{site.apple-dev}}/documentation/swiftui/navigationlink +[`Observable()`]: {{site.apple-dev}}/documentation/observation/observable() diff --git a/sites/docs/src/content/add-to-app/macos/project-setup.md b/sites/docs/src/content/add-to-app/macos/project-setup.md new file mode 100644 index 0000000000..be04ea4ea7 --- /dev/null +++ b/sites/docs/src/content/add-to-app/macos/project-setup.md @@ -0,0 +1,204 @@ +--- +title: Integrate a Flutter app into your macOS project +shortTitle: Integrate Flutter +description: Learn how to integrate a Flutter app into your existing macOS project. +--- + +Flutter UI components can be incrementally added +into your existing macOS application using Swift packages. + +## Prerequisites + +* Flutter 3.44 or later +* Xcode 15.0 or later + +### Migrate from legacy integration (if applicable) {: #migrate-legacy-integration} + +If you've already integrated Flutter into your macOS app +using embedded frameworks, +you must first remove that integration +before following the Swift Package Manager instructions below. + +
+ Expand to see instructions to migrate from embedded frameworks integration + + If your app was previously integrated using frameworks + generated by the `flutter build macos-framework` command, + you must first remove the frameworks from your Xcode project. + + 1. Navigate to your target's **General** tab + and remove all Flutter-related frameworks and libraries + under **Frameworks, Libraries, and Embedded Content**. + + This includes the `App.xcframework`, `FlutterMacOS.xcframework`, + `FlutterPluginRegistrant.xcframework`, + and any Flutter plugins' `xcframework` files. + + 1. Remove the Flutter pod from your Podfile + ```ruby title="MyApp/Podfile" diff + - pod 'FlutterMacOS', :podspec => '/path/to/MyApp/Flutter/[build mode]/FlutterMacOS.podspec' + ``` + + 1. Run `pod install`. +
+ +### Organize your projects relative to each other {: #organize-projects-relatively} + +This guide assumes that your existing macOS app +and your Flutter app reside in sibling directories. +If you have a different directory structure, +you will need to adjust the example relative paths accordingly. + +:::note + +If integrating for the first time, +run the following command to create a new Flutter application: + +```console +flutter create my_flutter_app +``` + +::: + +The example directory structure resembles the following: + + + +- my_flutter_app/ + - macos/ + - lib/ + - main.dart +- MyNativeApp/ + - MyNativeApp.xcodeproj/ + + + +## Integrate with Swift Package Manager {: #integrate-with-swiftpm} + + 1.

Build the FlutterNativeIntegration Swift package

+ + Within your Flutter application or module, run the following command: + + ```console + flutter build swift-package --platform macos + ``` + + This generates the following directories: + + + + - my_flutter_app/build/macos/SwiftPackages/ + - FlutterNativeIntegration/ (A Swift package) + - Scripts/ (Directory of scripts and other files needed) + + + + You can optionally change the location of this output + with the `--output` flag. + + 1.

Add FlutterNativeIntegration to your Xcode project

+ + 1. In the Project navigator, right click on your project + and select **Add Files to "MyNativeApp"...** + 1. Navigate to and select the generated + `FlutterNativeIntegration` Swift package and click **Add**. + 1. Select **Reference files in place** and click **Finish**. + 1. In the File inspector, + verify the **Location** is **Relative to Project**. + If it is not, you'll need to move the Flutter output directory + to be a sibling directory of your native app. + + + + 1. Navigate to your target's **General** tab + and add `FlutterNativeIntegration` under + **Frameworks, Libraries, and Embedded Content**. + + + 1.

Add build settings

+ + 1. In the **Build Settings** tab, + set the location of the Flutter app's Swift package output directory: + ``` + FLUTTER_SWIFT_PACKAGE_OUTPUT=$SRCROOT/../my_flutter_app/build/macos/SwiftPackages + ``` + 1. For custom configurations, set the Flutter build mode. + + Flutter supports three [build modes][]: Debug, Profile, and Release. + The build mode is determined using the `CONFIGURATION` value. + If your configuration does not match one of these, + you can set the `FLUTTER_BUILD_MODE` build setting + to one of these values. + + + + 1. For **Debug** configurations only, set the following build settings: + + ``` + ENABLE_APP_SANDBOX=YES + ENABLE_INCOMING_NETWORK_CONNECTIONS=YES + RUNTIME_EXCEPTION_ALLOW_JIT=YES + ``` + + + + 1. (Optional) Allow Xcode to re-build your Flutter app. + + Add the following build settings to your target + to allow Xcode to re-build your Flutter app as part of its build. + This allows you to make changes to your Flutter application + without needing to re-run `flutter build swift-package`. + This requires a Flutter installation on the machine. + + ``` + FLUTTER_APPLICATION_PATH=$SRCROOT/../my_flutter_app + ENABLE_USER_SCRIPT_SANDBOXING=NO + ``` + + :::tip + This only re-builds the Flutter app's code. + If you add new dependencies, + you’ll need to re-run `flutter build swift-package`. + ::: + + 1.

Add Pre-action Run Script to Scheme

+ + 1. Open **Product** > **Scheme** > **Edit Scheme...** + > **Build** (in left side bar) > **Pre-action** > **+** + > **New Run Script Action** + + 1. Select your project in the **Provide build settings from** dropdown. + + 1. Set the script to the following: + ``` + /bin/sh $FLUTTER_SWIFT_PACKAGE_OUTPUT/Scripts/flutter_integration.sh prebuild + ``` + + + + 1.

Add new run script build phase to your target

+ + 1. Navigate to your target's **Build Phases** + > **+** > **New Run Script Phase** + + 1. Set the script to the following: + ``` + /bin/sh $FLUTTER_SWIFT_PACKAGE_OUTPUT/Scripts/flutter_integration.sh assemble + ``` + 1. Uncheck **Based on dependency analysis** + 1. Add the following to **Input File Lists**: + ``` + $(FLUTTER_SWIFT_PACKAGE_OUTPUT)/Scripts/FlutterAssembleInputs.xcfilelist + ``` + + + +{:.steps} + +## Next steps + +You can now [add a Flutter screen][] to your existing macOS app. + +[add a Flutter screen]: /add-to-app/macos/add-flutter-screen +[become read-only on December 2, 2026]: https://blog.cocoapods.org/CocoaPods-Specs-Repo/ +[build modes]: /testing/build-modes \ No newline at end of file diff --git a/sites/docs/src/content/ai/ai-toolkit/feature-integration.md b/sites/docs/src/content/ai/ai-toolkit/feature-integration.md index 8a0d0a5a73..3bbc4b0c88 100644 --- a/sites/docs/src/content/ai/ai-toolkit/feature-integration.md +++ b/sites/docs/src/content/ai/ai-toolkit/feature-integration.md @@ -440,7 +440,7 @@ LlmChatView( ), ``` -In this particular example, the `RecipeReponseView` widget is constructed with +In this particular example, the `RecipeResponseView` widget is constructed with the LLM provider's response text and uses that to implement its `build` method: ```dart diff --git a/sites/docs/src/content/ai/gemini-cli-extension.md b/sites/docs/src/content/ai/gemini-cli-extension.md index c582398711..1063681550 100644 --- a/sites/docs/src/content/ai/gemini-cli-extension.md +++ b/sites/docs/src/content/ai/gemini-cli-extension.md @@ -71,7 +71,7 @@ extension for Gemini CLI by using one of the following commands: ``` 2. To install the current version and ensure that future - updates are automatically installed, use the `auto-upate` tag: + updates are automatically installed, use the `auto-update` tag: ```console gemini extensions install https://github.com/gemini-cli-extensions/flutter.git --auto-update diff --git a/sites/docs/src/content/app-architecture/case-study/ui-layer.md b/sites/docs/src/content/app-architecture/case-study/ui-layer.md index b9fc35d63d..e94e91766e 100644 --- a/sites/docs/src/content/app-architecture/case-study/ui-layer.md +++ b/sites/docs/src/content/app-architecture/case-study/ui-layer.md @@ -228,13 +228,18 @@ class HomeViewModel extends ChangeNotifier { `ChangeNotifier` and [`ListenableBuilder`][] (discussed later on this page) are part of the Flutter SDK, and provide a good solution for updating the UI when state changes. -You can also use a robust third-party state management solution, -such as [package:riverpod][], [package:flutter_bloc][], or [package:signals][]. +You can also use a robust third-party state management solution, such as +[`package:riverpod`][], [`package:flutter_bloc`][], or [`package:signals`][]. These libraries offer different tools for handling UI updates. Read more about using `ChangeNotifier` in our [state-management documentation][]. ::: +[`package:riverpod`]: {{site.pub-pkg}}/riverpod +[`package:flutter_bloc`]: {{site.pub-pkg}}/flutter_bloc +[`package:signals`]: {{site.pub-pkg}}/signals +[state-management documentation]: /data-and-backend/state-mgmt/intro + ## Define a view A view is a widget within your app. @@ -639,7 +644,6 @@ the Command pattern. [Read about it on GitHub][]. [`Listenable`]: {{site.api}}/flutter/foundation/Listenable-class.html [`ListenableBuilder`]: {{site.api}}/flutter/widgets/ListenableBuilder-class.html [`notifyListeners`]: {{site.api}}/flutter/foundation/ChangeNotifier/notifyListeners.html -[state-management documentation]: /data-and-backend/state-mgmt/intro [`Scaffold`]: {{site.api}}/flutter/material/Scaffold-class.html [`Dismissible`]: {{site.api}}/flutter/widgets/Dismissible-class.html [`utils` directory]: https://github.com/flutter/samples/blob/main/compass_app/app/lib/utils/command.dart @@ -648,9 +652,6 @@ the Command pattern. [Read about it on GitHub][]. [`StreamBuilders`]: {{site.api}}/flutter/widgets/StreamBuilder-class.html [`AsyncSnapshot`]: {{site.api}}/flutter/widgets/AsyncSnapshot-class.html [Read about it on GitHub]: https://github.com/flutter/samples/pull/2449#pullrequestreview-2328333146 -[package:riverpod]: {{site.pub-pkg}}/riverpod -[package:flutter_bloc]: {{site.pub-pkg}}/flutter_bloc -[package:signals]: {{site.pub-pkg}}/signals ## Feedback diff --git a/sites/docs/src/content/app-architecture/concepts.md b/sites/docs/src/content/app-architecture/concepts.md index 5939b49070..76067a4a6d 100644 --- a/sites/docs/src/content/app-architecture/concepts.md +++ b/sites/docs/src/content/app-architecture/concepts.md @@ -44,9 +44,9 @@ into 2 to 3 layers, depending on complexity. * **UI layer** - Displays data to the user that is exposed by the business logic layer, and handles user interaction. This is also commonly referred to as the - ‘presentation layer'. + "presentation layer". * **Logic layer** - Implements core business logic, and facilitates interaction - between the data layer and UI layer. Commonly known as the ‘domain layer'. + between the data layer and UI layer. Commonly known as the "domain layer". The logic layer is optional, and only needs to be implemented if your application has complex business logic that happens on the client. Many apps are only concerned with presenting data to a user and @@ -55,7 +55,7 @@ into 2 to 3 layers, depending on complexity. * **Data layer** - Manages interactions with data sources, such as databases or platform plugins. Exposes data and methods to the business logic layer. -These are called ‘layers' because each layer can only communicate with the +These are called "layers" because each layer can only communicate with the layers directly below or above it. The UI layer shouldn't know that the data layer exists, and vice versa. diff --git a/sites/docs/src/content/app-architecture/design-patterns/sql.md b/sites/docs/src/content/app-architecture/design-patterns/sql.md index a3fbf78d62..971c151141 100644 --- a/sites/docs/src/content/app-architecture/design-patterns/sql.md +++ b/sites/docs/src/content/app-architecture/design-patterns/sql.md @@ -408,7 +408,7 @@ It implements the `fetchTodos()`, `createTodo()`, and `deleteTodo()` methods. ```dart class TodoRepository { - TodoRepository({required DatabaseService database}) : _database = database; + TodoRepository({required this._database}); final DatabaseService _database; diff --git a/sites/docs/src/content/cookbook/animation/page-route-animation.md b/sites/docs/src/content/cookbook/animation/page-route-animation.md index b5fe823b91..04242d83dd 100644 --- a/sites/docs/src/content/cookbook/animation/page-route-animation.md +++ b/sites/docs/src/content/cookbook/animation/page-route-animation.md @@ -139,13 +139,13 @@ class Page2 extends StatelessWidget { To make the new page animate in from the bottom, it should animate from `Offset(0,1)` to `Offset(0, 0)` (usually defined using the `Offset.zero` constructor). In this case, the Offset is a 2D vector for the -['FractionalTranslation'][] widget. +[`FractionalTranslation`][] widget. Setting the `dy` argument to 1 represents a vertical translation one full height of the page. 为了使新页面从底部动画出来,它应该从 `Offset(0,1)` 到 `Offset(0, 0)` 进行动画。 (通常我们会使用 `Offset.zero` 构造器。)在这个情况下, -对于 ['FractionalTranslation'][] widget 来说偏移量是一个 2D 矢量值。 +对于 [`FractionalTranslation`][] widget 来说偏移量是一个 2D 矢量值。 将 `dy` 参数设为 1,这代表在竖直方向上切换整个页面的高度。 The `transitionsBuilder` callback has an `animation` parameter. It's an @@ -174,7 +174,7 @@ transitionsBuilder: (context, animation, secondaryAnimation, child) { Flutter has a set of widgets extending [`AnimatedWidget`][] that rebuild themselves when the value of the animation changes. For instance, SlideTransition takes an `Animation` and translates its child (using a -FractionalTranslation widget) whenever the value of the animation changes. +`FractionalTranslation` widget) whenever the value of the animation changes. Flutter 有一堆继承自 [`AnimatedWidget`][] 的 widget, 它们能够在动画的值发生改变时自动重建自己。 @@ -375,7 +375,7 @@ class Page2 extends StatelessWidget { [`Curve`]: {{site.api}}/flutter/animation/Curve-class.html [`Curves`]: {{site.api}}/flutter/animation/Curves-class.html [`CurveTween`]: {{site.api}}/flutter/animation/CurveTween-class.html -['FractionalTranslation']: {{site.api}}/flutter/widgets/FractionalTranslation-class.html +[`FractionalTranslation`]: {{site.api}}/flutter/widgets/FractionalTranslation-class.html [`PageRouteBuilder`]: {{site.api}}/flutter/widgets/PageRouteBuilder-class.html [`Route`]: {{site.api}}/flutter/widgets/Route-class.html [`SlideTransition`]: {{site.api}}/flutter/widgets/SlideTransition-class.html diff --git a/sites/docs/src/content/cookbook/design/cupertino-sheets.md b/sites/docs/src/content/cookbook/design/cupertino-sheets.md index e0ae83e13a..0b00b9d8db 100644 --- a/sites/docs/src/content/cookbook/design/cupertino-sheets.md +++ b/sites/docs/src/content/cookbook/design/cupertino-sheets.md @@ -42,15 +42,16 @@ class CupertinoSheetDemo extends StatelessWidget { ## 2. Display the sheet content With the basic app structure in place, display the sheet. -To show it, call `showCupertinoSheet` and provide a `builder` +To show it, call `showCupertinoSheet` and provide a `scrollableBuilder` that returns the content for the sheet, such as a `SingleChildScrollView`. ```dart showCupertinoSheet( context: context, - builder: (context) { + scrollableBuilder: (context, scrollController) { return SingleChildScrollView( + controller: scrollController, child: Center( child: Column( mainAxisSize: MainAxisSize.min, @@ -107,8 +108,9 @@ class CupertinoSheetPage extends StatelessWidget { onPressed: () { showCupertinoSheet( context: context, - builder: (context) { + scrollableBuilder: (context, scrollController) { return SingleChildScrollView( + controller: scrollController, child: Center( child: Column( mainAxisSize: MainAxisSize.min, diff --git a/sites/docs/src/content/cookbook/design/orientation.md b/sites/docs/src/content/cookbook/design/orientation.md index 20c202ffd3..688e77489e 100644 --- a/sites/docs/src/content/cookbook/design/orientation.md +++ b/sites/docs/src/content/cookbook/design/orientation.md @@ -16,12 +16,12 @@ the screen from portrait mode to landscape mode. For example, the app might show one item after the next in portrait mode, yet put those same items side-by-side in landscape mode. Expanded docs covering this and more can be found -in the [adaptive ui documenation][]. +in the [adaptive ui documentation][]. 在某些情况下,当应用的可用空间的形状发生了变化, 比如用户从横屏变成竖屏时,其设计也需要将跟着更新。 例如,在纵向模式下,我们可能想要依次显示各个项目,但在横向模式下,我们会把这些相同的项目并排放置。 -[自适应 UI 文档][adaptive ui documenation] 中提供了更多相关扩展信息。 +[自适应 UI 文档][adaptive ui documentation] 中提供了更多相关扩展信息。 In Flutter, you can build different layouts depending on a given [`Orientation`][]. @@ -219,5 +219,5 @@ void main() { [`OrientationBuilder`]: {{site.api}}/flutter/widgets/OrientationBuilder-class.html [`Orientation`]: {{site.api}}/flutter/widgets/Orientation.html [`SystemChrome.setPreferredOrientations()`]: {{site.api}}/flutter/services/SystemChrome/setPreferredOrientations.html -[adaptive ui documenation]: {{site.api}}/ui/adaptive-responsive +[adaptive ui documentation]: {{site.api}}/ui/adaptive-responsive [discouraged]: {{site.api}}/ui/adaptive-responsive/best-practices diff --git a/sites/docs/src/content/cookbook/effects/download-button.md b/sites/docs/src/content/cookbook/effects/download-button.md index 4861c9f067..c4b99575e1 100644 --- a/sites/docs/src/content/cookbook/effects/download-button.md +++ b/sites/docs/src/content/cookbook/effects/download-button.md @@ -727,12 +727,10 @@ abstract class DownloadController implements ChangeNotifier { class SimulatedDownloadController extends DownloadController with ChangeNotifier { SimulatedDownloadController({ - DownloadStatus downloadStatus = DownloadStatus.notDownloaded, - double progress = 0.0, - required VoidCallback onOpenDownload, - }) : _downloadStatus = downloadStatus, - _progress = progress, - _onOpenDownload = onOpenDownload; + this._downloadStatus = DownloadStatus.notDownloaded, + this._progress = 0.0, + required this._onOpenDownload, + }); DownloadStatus _downloadStatus; @override diff --git a/sites/docs/src/content/cookbook/effects/parallax-scrolling.md b/sites/docs/src/content/cookbook/effects/parallax-scrolling.md index 120918f185..426bfabfd8 100644 --- a/sites/docs/src/content/cookbook/effects/parallax-scrolling.md +++ b/sites/docs/src/content/cookbook/effects/parallax-scrolling.md @@ -934,8 +934,7 @@ class ParallaxParentData extends ContainerBoxParentData {} class RenderParallax extends RenderBox with RenderObjectWithChildMixin, RenderProxyBoxMixin { - RenderParallax({required ScrollableState scrollable}) - : _scrollable = scrollable; + RenderParallax({required this._scrollable}); ScrollableState _scrollable; diff --git a/sites/docs/src/content/deployment/cd.md b/sites/docs/src/content/deployment/cd.md index 9dc732c225..cb10556b84 100644 --- a/sites/docs/src/content/deployment/cd.md +++ b/sites/docs/src/content/deployment/cd.md @@ -42,9 +42,9 @@ You can use fastlane with the following tooling: 你可以通过下面的工具使用 fastlane: * [GitHub Actions][] - * Example: [Github Action in Flutter Project][] + * Example: [GitHub Action in Flutter Project][] - 样例:[适用于 Flutter 项目的 GitHub Actions][Github Action in Flutter Project] + 样例:[适用于 Flutter 项目的 GitHub Actions][GitHub Action in Flutter Project] * [Cirrus][] * [Travis][] @@ -601,7 +601,7 @@ information. [fastlane Android beta deployment guide]: https://docs.fastlane.tools/getting-started/android/beta-deployment/ [fastlane CI documentation]: https://docs.fastlane.tools/best-practices/continuous-integration [fastlane iOS beta deployment guide]: https://docs.fastlane.tools/getting-started/ios/beta-deployment/ -[Github Action in Flutter Project]: {{site.github}}/nabilnalakath/flutter-githubaction +[GitHub Action in Flutter Project]: {{site.github}}/nabilnalakath/flutter-githubaction [GitHub Actions]: {{site.github}}/features/actions [GitLab]: https://docs.gitlab.com/ee/ci/ [CircleCI]: https://circleci.com diff --git a/sites/docs/src/content/deployment/flavors-ios.md b/sites/docs/src/content/deployment/flavors-ios.md index 1a008cac7a..6dcc4df21e 100644 --- a/sites/docs/src/content/deployment/flavors-ios.md +++ b/sites/docs/src/content/deployment/flavors-ios.md @@ -557,10 +557,10 @@ To learn about them, see For more information on creating and using flavors, check out the following resources: -* [How to Setup Flutter & Firebase with Multiple Flavors - using the FlutterFire CLI][flutterfireCLI] +* [How to set up Flutter & Firebase with Multiple Flavors + using the FlutterFire CLI][flutterfire-cli] * [Build flavors in Flutter (Android and iOS) with different Firebase projects per flavor Flutter Ready to Go][flavors-firebase] -[flutterfireCLI]: https://codewithandrea.com/articles/flutter-firebase-multiple-flavors-flutterfire-cli/ +[flutterfire-cli]: https://codewithandrea.com/articles/flutter-firebase-multiple-flavors-flutterfire-cli/ [flavors-firebase]: {{site.medium}}/@animeshjain/build-flavors-in-flutter-android-and-ios-with-different-firebase-projects-per-flavor-27c5c5dac10b diff --git a/sites/docs/src/content/deployment/flavors.md b/sites/docs/src/content/deployment/flavors.md index 68595575cf..d029f82f16 100644 --- a/sites/docs/src/content/deployment/flavors.md +++ b/sites/docs/src/content/deployment/flavors.md @@ -284,7 +284,7 @@ names for two product flavors called `staging` and * To see more information for `Flavors p...` or `Flavors s...`, long-press the icon for one of them - and and select `App info`. + and select `App info`. [Launch a flavor]: #launching-your-app-flavors diff --git a/sites/docs/src/content/deployment/obfuscate.md b/sites/docs/src/content/deployment/obfuscate.md index 7e513ada4c..ba5d0d2ec4 100644 --- a/sites/docs/src/content/deployment/obfuscate.md +++ b/sites/docs/src/content/deployment/obfuscate.md @@ -151,7 +151,7 @@ app in the future, you will need the symbol map. 1. Once you've obfuscated your binary, **backup the SYMBOLS file**. You might need this if you lose - your original SYMBOLs file and you + your original SYMBOLS file and you want to de-obfuscate a stack trace. 混淆二进制文件后,请 **备份符号表 SYMBOLS 文件**。 diff --git a/sites/docs/src/content/flutter-for/web-devs.md b/sites/docs/src/content/flutter-for/web-devs.md index 40665e5dca..2e4aad5c40 100644 --- a/sites/docs/src/content/flutter-for/web-devs.md +++ b/sites/docs/src/content/flutter-for/web-devs.md @@ -22,11 +22,11 @@ It maps HTML/CSS code snippets to their Flutter/Dart code equivalents. Flutter is a framework for building cross-platform applications that uses the Dart programming language. To understand some differences between programming with Dart -and programming with Javascript, +and programming with JavaScript, see [Learning Dart as a JavaScript Developer][]. Flutter 是一个用于构建跨平台应用的框架,它使用 Dart 编程语言。 -要了解 Dart 编程语言与 Javascript 编程语言的异同, +要了解 Dart 编程语言与 JavaScript 编程语言的异同, 请参考文档 [给 JavaScript 开发者的 Dart 编程语言指南][Learning Dart as a JavaScript Developer]。 diff --git a/sites/docs/src/content/install/archive.md b/sites/docs/src/content/install/archive.md index 99dc3c1386..5ca2795839 100644 --- a/sites/docs/src/content/install/archive.md +++ b/sites/docs/src/content/install/archive.md @@ -22,6 +22,11 @@ version of Flutter for compatibility reasons or to investigate bugs. Flutter SDK 归档列表是 Flutter SDK 以前所有版本的集合。 对于出于兼容性原因或调查错误而需要使用旧版本 Flutter 的开发人员来说,该归档列表非常有用。 +After you download a release, to set up Flutter, +follow the [manual installation instructions][manual-install]. + +下载 Flutter SDK 后,请按照 [手动安装指南][manual-install] 来配置 Flutter。 + The archive includes Flutter SDKs for Windows, macOS, and Linux on the following [channels][]: @@ -101,27 +106,6 @@ SDK 归档列表中的每个 Flutter 版本都有以下信息: [calendar versioning]: https://calver.org/ [Flutter SDK versioning]: {{site.repo.flutter}}/blob/main/docs/releases/Release-versioning.md -## Install from an archive - -After downloading a Flutter SDK archive from this page, -use the following steps to install: - -1. Extract the downloaded archive to a desired location on your system. -2. Add the Flutter `bin` directory to your system's `PATH`. For more information, - see [Add Flutter to PATH](/install/add-to-path). -3. Run the following command to verify the installation: - -```bash id="yfl9s6" -flutter doctor -``` - -The `flutter doctor` command checks your environment -and reports on the status of your installation. - -For detailed platform-specific setup instructions, -refer to the main [Flutter installation guide](../install). - - ## Public release windows Predictability is key to landing complex features safely. @@ -213,23 +197,32 @@ $ git clone -b main https://github.com/flutter/flutter.git $ ./flutter/bin/flutter --version ``` + + ## More information ## 更多信息 -To learn what's new in the major Flutter builds, check out the -[release notes][] page. +- For instructions on installing Flutter from a downloaded SDK, + see [Install Flutter manually][manual-install]. + + 当你下载 SDK 后,关于安装 Flutter 的说明, + 请参阅 [手动安装 Flutter][manual-install]。 + +- To learn what's new in the major Flutter builds, + check out the [release notes][] page. -要了解 Flutter 主要版本的新内容, -请查看 [版本发行注记][release notes] 页。 + 要了解 Flutter 主要版本的新内容, + 请查看 [版本发行注记][release notes] 页。 -For details on how our installation bundles are structured, -see [Installation bundles][]. +- For details on how our installation bundles are structured, + see [Installation bundles][]. -关于安装包结构的更多信息,请查看这个页面: -[Flutter 安装包结构][Installation bundles]。 + 关于安装包结构的更多信息,请查看这个页面: + [Flutter 安装包结构][Installation bundles]。 [channels]: {{site.repo.flutter}}/blob/main/docs/releases/Flutter-build-release-channels.md +[manual-install]: /install/manual [release notes]: /release/release-notes [GitHub repo]: {{site.repo.flutter}} [Installation bundles]: {{site.repo.flutter}}/blob/main/docs/infra/Flutter-Installation-Bundles.md diff --git a/sites/docs/src/content/packages-and-plugins/developing-packages.md b/sites/docs/src/content/packages-and-plugins/developing-packages.md index fc2b924816..e8fb571f45 100644 --- a/sites/docs/src/content/packages-and-plugins/developing-packages.md +++ b/sites/docs/src/content/packages-and-plugins/developing-packages.md @@ -446,7 +446,7 @@ dependencies: hello_windows: ^1.0.0 ``` -Note that as shown here, an app-facing package can have +Note that, as shown here, an app-facing package can have some platforms implemented within the package, and others in endorsed federated implementations. @@ -632,13 +632,15 @@ We recommend you edit the Android code using Android Studio. Before editing the Android platform code in Android Studio, first make sure that the code has been built at least once (in other words, run the example app from your IDE/editor, -or in a terminal execute -`cd hello/example; flutter build apk --config-only`). +or in a terminal execute: 在 Android Studio 中编辑 Android 平台的代码之前, 请先确保代码至少已经构建过一次 -(换句话说,在 IDE 或编辑器中运行一次示例应用,或者在终端中执行指令 -`cd hello/example; flutter build apk --config-only`)。 +(换句话说,在 IDE 或编辑器中运行一次示例应用,或者在终端中执行指令: + +```console +cd hello/example; flutter build apk --config-only +``` Then use the following steps: @@ -727,51 +729,62 @@ You can run the example app by pressing the run (▶) button. 你可以点击运行按钮 (▶) 来运行这个示例应用。 -##### Add CocoaPod dependencies +##### Add native Darwin dependencies (Swift Package Manager) -:::warning -Flutter is migrating to [Swift Package Manager][] -to manage iOS and macOS native dependencies. -Flutter's support of Swift Package Manager is under development. -The implementation might change in the future. -Swift Package Manager support is only available -on Flutter's [`main` channel][]. -Flutter continues to support CocoaPods. -::: +Flutter uses Swift Package Manager as the primary strategy to manage +native iOS and macOS dependencies. + +To add a dependency to your plugin using Swift Package Manager: -[Swift Package Manager]: https://www.swift.org/documentation/package-manager/ -[`main` channel]: /install/upgrade#switching-flutter-channels +1. Create a `Package.swift` file in your plugin's `ios/my_plugin_name` + or `macos/my_plugin_name` directory. +2. Declare your native dependency within the `dependencies` array of the + `Package.swift` descriptor file: -Use the following instructions to add `HelloPod` with the version `0.0.1`: +```swift title="Package.swift" +dependencies: [ + .package(url: "https://github.com/path/to/HelloLibrary.git", from: "1.0.0") +] +``` -1. Specify the dependency at the end of `ios/hello.podspec`: +For complete details and instructions on structuring native folders, resource +bundling, or handling hybrid setups, +visit the [Swift Package Manager for plugin authors][] guide. - ```ruby - s.dependency 'HelloPod', '0.0.1' - ``` +[Swift Package Manager for plugin authors]: /packages-and-plugins/swift-package-manager/for-plugin-authors - For private pods, refer to - [Private CocoaPods][] to ensure repo access: +##### Add CocoaPod dependencies (Legacy) - ```ruby - s.source = { - # For pods hosted on GitHub - :git => "https://github.com/path/to/HelloPod.git", - # Alternatively, for pods hosted locally - # :path => "file:///path/to/private/repo", - :tag => s.version.to_s - }` - ``` +Flutter continues to support CocoaPods for backward compatibility. If your +plugin needs to support developers who haven't migrated to Swift Package +Manager yet, specify your CocoaPods dependency at the end of +`ios/hello.podspec`: -[Private CocoaPods]: https://guides.cocoapods.org/making/private-cocoapods.html +```ruby +s.dependency 'HelloPod', '0.0.1' +``` + +For private pods, refer to +[Private CocoaPods][] to ensure repo access: + +```ruby +s.source = { + # For pods hosted on GitHub + :git => "https://github.com/path/to/HelloPod.git", + # Alternatively, for pods hosted locally + # :path => "file:///path/to/private/repo", + :tag => s.version.to_s + } +``` -2. Installing the plugin +[Private CocoaPods]: https://guides.cocoapods.org/making/private-cocoapods.html - - Add the plugin in the project’s `pubspec.yaml` dependencies. - - Run `flutter pub get`. - - In the project’s `ios/` directory, run `pod install`. +##### Installing the plugin dependencies -The pod should appear in the installation summary. +To fetch and link the plugin's dependencies, add the plugin to your app project's +`pubspec.yaml` dependencies, and run `flutter pub get`. Flutter automatically +resolves and wires up the Swift Package Manager descriptors or CocoaPods +pod files during the native app build step. If your plugin requires a privacy manifest, for example, if it uses any **required reason APIs**, diff --git a/sites/docs/src/content/packages-and-plugins/favorites.md b/sites/docs/src/content/packages-and-plugins/favorites.md index 02004807bf..1670f8a1ae 100644 --- a/sites/docs/src/content/packages-and-plugins/favorites.md +++ b/sites/docs/src/content/packages-and-plugins/favorites.md @@ -88,7 +88,7 @@ Flutter Favorite packages 通过以下指标来确认是否达到高质量标准 高质量 **依赖项** -## Flutter Ecosystem Committee +## Flutter Ecosystem Committee ## Flutter 生态系统委员会 diff --git a/sites/docs/src/content/perf/isolates.md b/sites/docs/src/content/perf/isolates.md index 94e2313963..19b886ddcf 100644 --- a/sites/docs/src/content/perf/isolates.md +++ b/sites/docs/src/content/perf/isolates.md @@ -223,7 +223,7 @@ in which the `StreamController` or `Sink` is created in one isolate, and the listener is set up in the other isolate. In this analogy, -the `StreamConroller` is called a `SendPort`, +the `StreamController` is called a `SendPort`, and you can "add" messages with the `send()` method. `ReceivePort`s are the listeners, and when these listeners receive a new message, diff --git a/sites/docs/src/content/perf/ui-performance.md b/sites/docs/src/content/perf/ui-performance.md index 5cfdd1a15a..0d6f5743df 100644 --- a/sites/docs/src/content/perf/ui-performance.md +++ b/sites/docs/src/content/perf/ui-performance.md @@ -611,15 +611,15 @@ Flutter's tools and debugging in Flutter: [Dart 开发者工具][devtools]: Dart 和 Flutter 应用的开发者性能调试工具; * [Flutter API][] docs, particularly the [`PerformanceOverlay`][] class, - and the [dart:developer][] package + and the [`dart:developer`][] package - [Flutter API][] 文档, 特别是 [`PerformanceOverlay`][] 这个类 - 和 [dart:developer][] 这个 package。 + [Flutter API][] 文档, 特别是 [`PerformanceOverlay`][] 类 + 和 [`dart:developer`][] package。 [`PerformanceOverlay`]: {{site.api}}/flutter/widgets/PerformanceOverlay-class.html [`RepaintBoundary`]: {{site.api}}/flutter/widgets/RepaintBoundary-class.html [`saveLayer`]: {{site.api}}/flutter/dart-ui/Canvas/saveLayer.html -[dart:developer]: {{site.api}}/flutter/dart-developer/dart-developer-library.html +[`dart:developer`]: {{site.api}}/flutter/dart-developer/dart-developer-library.html [Debugging]: /testing/debugging [devtools]: /tools/devtools [Flutter API]: {{site.api}} diff --git a/sites/docs/src/content/platform-integration/android/c-interop.md b/sites/docs/src/content/platform-integration/android/c-interop.md index e333db8198..ce80a2e8c2 100644 --- a/sites/docs/src/content/platform-integration/android/c-interop.md +++ b/sites/docs/src/content/platform-integration/android/c-interop.md @@ -186,9 +186,9 @@ The native code is invoked from dart in `lib/native_add_bindings_generated.dart` 原生代码会从 `lib/native_add_bindings_generated.dart` 被 Dart 调用。 -The bindings are generated with [package:ffigen]({{site.pub-pkg}}/ffigen). +The bindings are generated with [`package:ffigen`]({{site.pub-pkg}}/ffigen). -代码由 [package:ffigen](https://pub.flutter-io.cn/packages/ffigen) 生成。 +代码由 [`package:ffigen`]({{site.pub-pkg}}/ffigen) 生成。 ## Other use cases diff --git a/sites/docs/src/content/platform-integration/android/compose-activity.md b/sites/docs/src/content/platform-integration/android/compose-activity.md index 30e84b6674..1b51f5c4c2 100644 --- a/sites/docs/src/content/platform-integration/android/compose-activity.md +++ b/sites/docs/src/content/platform-integration/android/compose-activity.md @@ -191,37 +191,22 @@ The first file requiring modifications is `android/app/build.gradle`. ```groovy title="android/app/build.gradle" dependencies { - implementation("androidx.core:core-ktx:1.10.1") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") - implementation("androidx.activity:activity-compose") - implementation(platform("androidx.compose:compose-bom:2024.06.00")) - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material:material") - implementation("androidx.compose.material3:material3") - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2023.08.00")) - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - debugImplementation("androidx.compose.ui:ui-tooling") -implementation "androidx.core:core-ktx:1.10.1" -implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" -implementation "androidx.activity:activity-compose" -implementation platform("androidx.compose:compose-bom:2024.06.00") -implementation "androidx.compose.ui:ui" -implementation "androidx.compose.ui:ui-graphics" -implementation "androidx.compose.ui:ui-tooling-preview" -implementation "androidx.compose.material:material" -implementation "androidx.compose.material3:material3" -testImplementation "junit:junit:4.13.2" -androidTestImplementation "androidx.test.ext:junit:1.1.5" -androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1" -androidTestImplementation platform("androidx.compose:compose-bom:2023.08.00") -androidTestImplementation "androidx.compose.ui:ui-test-junit4" -debugImplementation "androidx.compose.ui:ui-tooling" -debugImplementation "androidx.compose.ui:ui-test-manifest" + implementation "androidx.core:core-ktx:1.10.1" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" + implementation "androidx.activity:activity-compose" + implementation platform("androidx.compose:compose-bom:2024.06.00") + implementation "androidx.compose.ui:ui" + implementation "androidx.compose.ui:ui-graphics" + implementation "androidx.compose.ui:ui-tooling-preview" + implementation "androidx.compose.material:material" + implementation "androidx.compose.material3:material3" + testImplementation "junit:junit:4.13.2" + androidTestImplementation "androidx.test.ext:junit:1.1.5" + androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1" + androidTestImplementation platform("androidx.compose:compose-bom:2023.08.00") + androidTestImplementation "androidx.compose.ui:ui-test-junit4" + debugImplementation "androidx.compose.ui:ui-tooling" + debugImplementation "androidx.compose.ui:ui-test-manifest" } ``` diff --git a/sites/docs/src/content/platform-integration/ios/c-interop.md b/sites/docs/src/content/platform-integration/ios/c-interop.md index 60ead015c5..0e0a5464f3 100644 --- a/sites/docs/src/content/platform-integration/ios/c-interop.md +++ b/sites/docs/src/content/platform-integration/ios/c-interop.md @@ -36,7 +36,7 @@ Flutter 移动版可以使用 [dart:ffi][] 库来调用本地的 C API。 This page describes using the `dart:ffi` library in iOS apps. For information on Android, see [Binding to native Android code using dart:ffi][android-ffi]. -For information in macOS, see +For information on macOS, see [Binding to native macOS code using dart:ffi][macos-ffi]. This feature is not yet supported for web plugins. @@ -175,9 +175,9 @@ The native code is invoked from dart in `lib/native_add_bindings_generated.dart` 原生代码会从 `lib/native_add_bindings_generated.dart` 被 Dart 调用。 -The bindings are generated with [package:ffigen]({{site.pub-pkg}}/ffigen). +The bindings are generated with [`package:ffigen`]({{site.pub-pkg}}/ffigen). -代码由 [package:ffigen](https://pub.flutter-io.cn/packages/ffigen) 生成。 +代码由 [`package:ffigen`]({{site.pub-pkg}}/ffigen) 生成。 ## Other use cases diff --git a/sites/docs/src/content/platform-integration/macos/c-interop.md b/sites/docs/src/content/platform-integration/macos/c-interop.md index c329efd739..996dcc797f 100644 --- a/sites/docs/src/content/platform-integration/macos/c-interop.md +++ b/sites/docs/src/content/platform-integration/macos/c-interop.md @@ -177,9 +177,9 @@ The native code is invoked from dart in `lib/native_add_bindings_generated.dart` 原生代码会从 `lib/native_add_bindings_generated.dart` 中被 Dart 调用。 -The bindings are generated with [package:ffigen]({{site.pub-pkg}}/ffigen). +The bindings are generated with [`package:ffigen`]({{site.pub-pkg}}/ffigen). -绑定代码由 [package:ffigen]({{site.pub-pkg}}/ffigen) 生成。 +绑定代码由 [`package:ffigen`]({{site.pub-pkg}}/ffigen) 生成。 ## Other use cases diff --git a/sites/docs/src/content/platform-integration/web/web-images.md b/sites/docs/src/content/platform-integration/web/web-images.md index faad4b4aa7..9eee6ee37f 100644 --- a/sites/docs/src/content/platform-integration/web/web-images.md +++ b/sites/docs/src/content/platform-integration/web/web-images.md @@ -214,7 +214,9 @@ Examples: [CloudFlare Workers]: https://developers.cloudflare.com/workers/examples/cors-header-proxy [Firebase Functions]: {{site.github}}/7kfpun/cors-proxy -### Use a HTML platform view + + +### Use an HTML platform view ### 使用 HTML 原生平台视图 diff --git a/sites/docs/src/content/reference/supported-platforms.md b/sites/docs/src/content/reference/supported-platforms.md index 521851f39e..35837d2b87 100644 --- a/sites/docs/src/content/reference/supported-platforms.md +++ b/sites/docs/src/content/reference/supported-platforms.md @@ -22,65 +22,65 @@ Flutter supports deploying to the following platforms. ## Mobile platforms - - ## Desktop platforms - - - - @@ -94,7 +94,7 @@ Flutter supports deploying to the following platforms. arch="JavaScript, WebAssembly" deploy-to="web" supported="[Latest 2](https://chromereleases.googleblog.com/search/label/Stable%20updates)" - ci-tested="119, 125" + ci-tested="145" unsupported="95 and earlier" deploy-to-link="/deployment/web" /> @@ -104,7 +104,7 @@ Flutter supports deploying to the following platforms. arch="JavaScript" deploy-to="web" supported="[Latest 2](https://www.mozilla.org/en-US/firefox/releases/)" - ci-tested="143" + ci-tested="148" unsupported="98 and earlier" deploy-to-link="/deployment/web" /> @@ -114,7 +114,7 @@ Flutter supports deploying to the following platforms. arch="JavaScript" deploy-to="web" supported="15.6 and newer" - ci-tested="15.6" + ci-tested="18.6" unsupported="15.5 and earlier" deploy-to-link="/deployment/web" /> @@ -124,7 +124,7 @@ Flutter supports deploying to the following platforms. arch="JavaScript, WebAssembly" deploy-to="web" supported="[Latest 2](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel)" - ci-tested="119, 125" + ci-tested="145" unsupported="95 and earlier" deploy-to-link="/deployment/web" /> diff --git a/sites/docs/src/content/release/breaking-changes/3-13-deprecations.md b/sites/docs/src/content/release/breaking-changes/3-13-deprecations.md index 3521ad3798..4b57d4eed1 100644 --- a/sites/docs/src/content/release/breaking-changes/3-13-deprecations.md +++ b/sites/docs/src/content/release/breaking-changes/3-13-deprecations.md @@ -415,7 +415,7 @@ To learn more about this `TestWindow` update, check out Code before migration: ```dart -testWidgets('My test', (WidgetTester tester) aysnc { +testWidgets('My test', (WidgetTester tester) async { // For all instances, replace window with platformDispatcher tester.binding.window.textScaleFactorTestValue = 42; addTearDown(tester.binding.window.clearTextScaleFactorTestValue); @@ -426,7 +426,7 @@ testWidgets('My test', (WidgetTester tester) aysnc { Code after migration: ```dart -testWidgets('My test', (WidgetTester tester) aysnc { +testWidgets('My test', (WidgetTester tester) async { // For all instances, replace window with platformDispatcher tester.binding.platformDispatcher.textScaleFactorTestValue = 42; addTearDown(tester.binding.platformDispatcher.clearTextScaleFactorTestValue); diff --git a/sites/docs/src/content/release/breaking-changes/3-7-deprecations.md b/sites/docs/src/content/release/breaking-changes/3-7-deprecations.md index c6dbc8bc4b..33dd39aff2 100644 --- a/sites/docs/src/content/release/breaking-changes/3-7-deprecations.md +++ b/sites/docs/src/content/release/breaking-changes/3-7-deprecations.md @@ -220,7 +220,7 @@ Removed in: Supported by Flutter Fix: yes -In v2.4, several changes were made ot the app bar classes and their themes to +In v2.4, several changes were made to the app bar classes and their themes to better align with Material Design. Several properties were deprecated at that time and have been removed. diff --git a/sites/docs/src/content/release/breaking-changes/android-java-gradle-migration-guide.md b/sites/docs/src/content/release/breaking-changes/android-java-gradle-migration-guide.md index f2a4203864..8e093ede55 100644 --- a/sites/docs/src/content/release/breaking-changes/android-java-gradle-migration-guide.md +++ b/sites/docs/src/content/release/breaking-changes/android-java-gradle-migration-guide.md @@ -90,7 +90,7 @@ Do the following from the top of your Flutter project. ## You didn't update Android Studio and still have a Java error The error appears similar to `Unsupported class file major version 65`. This is an indication that your Java version is newer than the version of -gradle you are running can handle. There is a non obvious set of dependencies +Gradle you are running can handle. There is a non-obvious set of dependencies surrounding AGP, Java, and Gradle. ### Solution 1: Android Studio diff --git a/sites/docs/src/content/release/breaking-changes/android-large-screens-restrictions-ignored.md b/sites/docs/src/content/release/breaking-changes/android-large-screens-restrictions-ignored.md index 7f0052019e..f1d47ce7cf 100644 --- a/sites/docs/src/content/release/breaking-changes/android-large-screens-restrictions-ignored.md +++ b/sites/docs/src/content/release/breaking-changes/android-large-screens-restrictions-ignored.md @@ -1,9 +1,9 @@ --- title: Large screen orientation and resizability restrictions ignored on Android 17 description: >- - For apps targeting Android 17 or higher, orientation, resizability, and - aspect ratio restrictions no longer apply on large displays (widths 600dp or - larger). + For apps targeting Android 17 or higher, + orientation, resizability, and aspect ratio restrictions no longer + apply on large displays with widths of 600dp or larger. --- {% render "docs/breaking-changes.md" %} @@ -11,18 +11,18 @@ description: >- ## Summary For apps targeting Android 17 or higher, -orientation, resizability, and aspect ratio restrictions no longer apply -on displays with width 600dp or greater. -This means that [`SystemChrome.setPreferredOrientations`][] is ignored -on these devices. +orientation, resizability, and aspect ratio restrictions no longer +apply on displays with width 600dp or greater. +This means that [`SystemChrome.setPreferredOrientations`][] is +ignored on these devices. ## Background Android is shifting toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios. -Restrictions like fixed orientation or limited resizability hinder app -adaptability. -See [Android 17 behavior changes][] for more details. +Restrictions like fixed orientation or limited resizability +hinder app adaptability. +For more details, see [Android 17 behavior changes][]. In Android 16, this behavior was introduced as a default but allowed apps to temporarily opt out diff --git a/sites/docs/src/content/release/breaking-changes/buttons.md b/sites/docs/src/content/release/breaking-changes/buttons.md index f454d9064a..fcc537bafa 100644 --- a/sites/docs/src/content/release/breaking-changes/buttons.md +++ b/sites/docs/src/content/release/breaking-changes/buttons.md @@ -197,7 +197,7 @@ of the defaults are. When a button or button theme specifies computed defaults. The button's `style` parameter overrides non-null properties specified by the corresponding button theme. For example if `foregroundColor` property of a `TextButton`'s style is non-null, it -overrides the same property for the `TextButonTheme`'s style. +overrides the same property for the `TextButtonTheme`'s style. As explained earlier, each button class includes a static method called `styleFrom` which constructs a ButtonStyle from a simple set of diff --git a/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md b/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md index 32999695e7..ef946d61cc 100644 --- a/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md +++ b/sites/docs/src/content/release/breaking-changes/decouple-page-transition-builders.md @@ -14,35 +14,37 @@ description: >- ## Background -Flutter provides several page transition builders that control -how routes animate when navigating between pages. These builders -are used with `PageTransitionsTheme` to customize transitions -per platform. +Flutter provides several page transition builders that +control how routes animate when navigating between pages. +These builders are used with `PageTransitionsTheme` to +customize transitions per platform. The available page transition builders are: | Builder | Library | Description | |---------|---------|-------------| -| `FadeUpwardsPageTransitionsBuilder` | Material | Default pre-Material 3 transition | +| `FadeUpwardsPageTransitionsBuilder` | Material | Default transition before Material 3 | | `OpenUpwardsPageTransitionsBuilder` | Material | Vertical slide transition | | `ZoomPageTransitionsBuilder` | Material | Zoom transition (Material 3 default) | | `PredictiveBackPageTransitionsBuilder` | Material | Android predictive back gesture support | | `CupertinoPageTransitionsBuilder` | **Cupertino** | iOS-style horizontal slide transition | -Previously, `CupertinoPageTransitionsBuilder` was defined in the -Material library alongside the other builders. However, this class -is semantically a Cupertino component—its implementation uses -Cupertino transition mixins and provides iOS-style navigation -animations. +{:.table} -This move improves code organization and allows Cupertino apps to use this -builder without depending on the Material library. +Previously, `CupertinoPageTransitionsBuilder` was defined in +the Material library alongside the other builders. +This class is semantically a Cupertino component because +its implementation uses Cupertino transition mixins and +provides iOS-style navigation animations. + +This move improves code organization and allows Cupertino apps to +use this builder without depending on the Material library. ## Migration guide -If you use `CupertinoPageTransitionsBuilder` and only import -`package:flutter/material.dart`, add an import for -`package:flutter/cupertino.dart`. +If you use `CupertinoPageTransitionsBuilder` and +only import `package:flutter/material.dart`, +add an import for `package:flutter/cupertino.dart`. Code before migration: @@ -75,13 +77,13 @@ If your app already imports both packages, no changes are needed. ## Timeline -Landed in version: Not yet released
-In stable release: Not yet released +Landed in version: 3.43.0-0.1.pre
+In stable release: 3.44 ## References Relevant PRs: -* [Decouple CupertinoPageTransitionsBuilder from Material][] +* [Decouple CupertinoPageTransitionsBuilder from Material][pr-179776] -[Decouple CupertinoPageTransitionsBuilder from Material]: {{site.repo.flutter}}/pull/179776 +[pr-179776]: {{site.repo.flutter}}/pull/179776 diff --git a/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md b/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md index db35c646a4..c1bcb91f2e 100644 --- a/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md +++ b/sites/docs/src/content/release/breaking-changes/deprecate-onreorder-callback.md @@ -9,24 +9,25 @@ description: >- ## Summary -The `onReorder` callback in the `ReorderableListView`, -`ReorderableListView.builder`, `ReorderableList` and `SliverReorderableList` -widgets has been replaced by a new callback, `onReorderItem`, -which provides a more intuitive behavior on index. +The `onReorder` callback in the +`ReorderableListView`, `ReorderableListView.builder`, +`ReorderableList`, and `SliverReorderableList` widgets +has been replaced by a new callback, `onReorderItem`, +which provides more intuitive behavior for `newIndex`. ## Background -The `onReorder` callback in the `ReorderableListView`, -`ReorderableListView.builder`, `ReorderableList` and `SliverReorderableList` -widgets used to require a manual correction -for the second parameter, `newIndex`, -in case the `oldIndex` is before the `newIndex`, -due to the list of items shortening by one element in this case. +The `onReorder` callback in the +`ReorderableListView`, `ReorderableListView.builder`, +`ReorderableList`, and `SliverReorderableList` widgets required +a manual correction for the second parameter, `newIndex`, +in case the `oldIndex` is before the `newIndex` because +the list of items would be shortened by one element. ```dart void handleReorder(int oldIndex, int newIndex) { if (oldIndex < newIndex) { - // Removing the item at oldIndex will shorten the list by 1. + // Removing the item at oldIndex shortens the list by 1. newIndex -= 1; } @@ -38,12 +39,12 @@ ReorderableListView( ) ``` -The new callback, `onReorderItem`, aims to solve this problem, +The new callback, `onReorderItem`, solves this problem by doing the correction automatically. ```dart void handleReorder(int oldIndex, int newIndex) { - // handle the actual reorder behavior... + // Handle the actual reorder behavior... } ReorderableListView( @@ -54,14 +55,13 @@ ReorderableListView( ## Migration guide The `ReorderableListView`, `ReorderableListView.builder`, -`ReorderableList` and `SliverReorderableList` widgets -share the same reordering logic, the migration steps -are identical for any of these widgets. +`ReorderableList`, and `SliverReorderableList` widgets +share the same reordering logic. +The same migration steps apply to each of these widgets. -For the purpose of this migration guide, -`ReorderableListView` is chosen as an example. +This migration guide uses `ReorderableListView` as an example. -### Case 1: trivial case +### Case 1: Simple callbacks {: #case-1-simple-callbacks } Code before migration: @@ -92,13 +92,12 @@ Code after migration: ) ``` -### Case 2: opting out, for complex onReorder implementations +### Case 2: Opt out for complex `onReorder` implementations {: #case-2-opt-out } -In some cases, it might not be obvious how to do the migration -to the new `onReorderItem` callback, -particularly if the provided callback is very complex. +In some cases, such as when the provided callback is complex, +the migration to the new `onReorderItem` callback might not be obvious. -In that case, to opt out of the new behavior, +In these cases, to opt out of the new behavior, adjust the `newIndex` to match the old behavior. Code before migration: @@ -136,14 +135,14 @@ Code after migration: ``` :::important -This migration is not supported by `dart fix`, +This migration isn't supported by `dart fix`, due to the change in meaning for the second callback parameter. ::: ## Timeline Landed in version: 3.41.0-1.0.pre-364
-In stable release: Not yet +In stable release: 3.44 ## References @@ -156,18 +155,18 @@ API documentation: Relevant issues: -* [Issue 127901][] -* [Issue 169878][] +* [The index parameter for ReorderableListView's onReorderCallback is confusing][issue-127901] +* [SliverReorderableList newIndex arg off by one on drag down list][issue-169878] Relevant PRs: * [Deprecate onReorder callback][] -[`ReorderCallback`]: {{site.main-api}}/flutter/widgets/ReorderCallback.html -[`ReorderableList`]: {{site.main-api}}/flutter/widgets/ReorderableList-class.html -[`ReorderableListView`]: {{site.main-api}}/flutter/material/ReorderableListView-class.html -[`SliverReorderableList`]: {{site.main-api}}/flutter/widgets/SliverReorderableList-class.html +[`ReorderCallback`]: {{site.api}}/flutter/widgets/ReorderCallback.html +[`ReorderableList`]: {{site.api}}/flutter/widgets/ReorderableList-class.html +[`ReorderableListView`]: {{site.api}}/flutter/material/ReorderableListView-class.html +[`SliverReorderableList`]: {{site.api}}/flutter/widgets/SliverReorderableList-class.html -[Issue 127901]: {{site.repo.flutter}}/issues/127901 -[Issue 169878]: {{site.repo.flutter}}/issues/169878 +[issue-127901]: {{site.repo.flutter}}/issues/127901 +[issue-169878]: {{site.repo.flutter}}/issues/169878 [Deprecate onReorder callback]: {{site.repo.flutter}}/pull/178242 diff --git a/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md b/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md index c462be190c..128e9dd5e8 100644 --- a/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md +++ b/sites/docs/src/content/release/breaking-changes/deprecate-text-input-connection-set-style.md @@ -1,8 +1,8 @@ --- title: Deprecate `TextInputConnection.setStyle` description: >- - The `TextInputConnection.setStyle` method has been deprecated in favor - of the `TextInputConnection.updateStyle` method. + The `TextInputConnection.setStyle` method has been deprecated + in favor of the `TextInputConnection.updateStyle` method. --- {% render "docs/breaking-changes.md" %} @@ -15,19 +15,21 @@ description: >- ## Context -The previous `setStyle` method did not support `letterSpacing`, `wordSpacing`, +The previous `setStyle` method didn't support `letterSpacing`, `wordSpacing`, or `lineHeight`. This caused visual misalignment of the selection highlight and IME caret when these properties were used. -The replacement `updateStyle` method (via `TextInputStyle`) supports these -properties, ensuring the system input is synchronized with the rendered text. +The replacement `updateStyle` method uses +`TextInputStyle` to support these properties, +ensuring the system input is synchronized with the rendered text. ## Migration guide -Authors of custom text input clients should replace calls to -`TextInputConnection.setStyle` with `TextInputConnection.updateStyle`. +If you author a custom text input client, +replace calls to `TextInputConnection.setStyle` +with `TextInputConnection.updateStyle`. -### Code before migration: +### Code before migration ```dart connection.setStyle( @@ -39,7 +41,7 @@ connection.setStyle( ); ``` -### Code after migration: +### Code after migration ```dart connection.updateStyle( @@ -58,18 +60,18 @@ connection.updateStyle( ## Timeline -Landed in version: TBD
-In stable release: Not yet +Landed in version: 3.43.0-0.1.pre
+In stable release: 3.44 ## References Relevant PR: -* [PR 180436][] +* [Fix IME and selection by syncing more text styles][pr-180436] Relevant issues: -* [Issue 161592][] +* [Incorrect position of Japanese predictive conversion popup in TextFormField using maxLines on the Web][issue-161592] -[PR 180436]: {{site.repo.flutter}}/pull/180436 -[Issue 161592]: {{site.repo.flutter}}/issues/161592 +[pr-180436]: {{site.repo.flutter}}/pull/180436 +[issue-161592]: {{site.repo.flutter}}/issues/161592 diff --git a/sites/docs/src/content/release/breaking-changes/editable-text-focus-attachment.md b/sites/docs/src/content/release/breaking-changes/editable-text-focus-attachment.md index 3807d52b94..d5bd73def7 100644 --- a/sites/docs/src/content/release/breaking-changes/editable-text-focus-attachment.md +++ b/sites/docs/src/content/release/breaking-changes/editable-text-focus-attachment.md @@ -41,7 +41,7 @@ the reason stated above. `EditableTextState` now creates a dedicated `Focus` widget to host `EditableText.focusNode`. This allows `EditableTextState`s to define handlers for shortcut `Intent`s. -For instance, `EditableText` now has a handler that +For instance, `EditableText` now has a handler that handles the "deleteCharacter" intent when the DEL key is pressed. diff --git a/sites/docs/src/content/release/breaking-changes/flutter-root-version-file.md b/sites/docs/src/content/release/breaking-changes/flutter-root-version-file.md index b00991195e..c430dc3388 100644 --- a/sites/docs/src/content/release/breaking-changes/flutter-root-version-file.md +++ b/sites/docs/src/content/release/breaking-changes/flutter-root-version-file.md @@ -56,7 +56,7 @@ custom tools or CI configurations might. For example, the Flutter team's own `api.flutter.dev` generation script: -```dart title="post_processe_docs.dart" +```dart title="post_process_docs.dart" final File versionFile = File('version'); final String version = versionFile.readAsStringSync(); ``` diff --git a/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md b/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md index 0c68a8111f..1b5c502023 100644 --- a/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md +++ b/sites/docs/src/content/release/breaking-changes/icondata-class-marked-final.md @@ -1,41 +1,50 @@ --- title: IconData class marked as final description: >- - The IconData class is now marked as final, preventing it from being - extended or implemented. + The IconData class is now marked as final, + preventing it from being extended or implemented. --- {% render "docs/breaking-changes.md" %} ## Summary -The `IconData` class is now marked as `final`, which prevents it from being -implemented or extended. This change is part of an effort to generalize the +The `IconData` class is now marked as [`final`][], +which prevents it from being implemented or extended. +This change is part of an effort to generalize the mechanism for tree-shaking assets and native code. +[`final`]: {{site.dart-site}}/language/class-modifiers#final + ## Background -The Flutter team is working on a generalized mechanism to bring tree-shaking of -assets and native code to packages. The existing bespoke Icon Tree Shaker is +The Flutter team is working on a generalized mechanism to +bring tree-shaking of assets and native code to packages. +The existing bespoke Icon Tree Shaker is being folded into this general mechanism. For performance, locality, and understandability, the general mechanism doesn't -support recording `const` instances in complex type hierarchies. Therefore, -the `IconData` class is now marked as `final`. +support recording `const` instances in complex type hierarchies. +Therefore, the `IconData` class is now marked as `final`. + +Code that implements or extends `IconData` now +fails to compile with the following error: -Code that implements or extends `IconData` fails to compile with an error like: -`The class 'IconData' is 'final' and can't be extended or implemented outside of its library.` +```text +The class 'IconData' is 'final' and can't be extended or implemented outside of its library. +``` ## Migration guide -Instead of implementing `IconData` (for example, using an `enum` to get dot -shorthands, type safety, and an automated `.values` list), use a wrapper class -with `static const` instances. +Instead of implementing `IconData`, +such as with an `enum` that supports dot shorthand, +type safety, and an automated `.values` list, +use a wrapper class with `static const` instances. ### Migrating custom icon types -If you used an `enum` that implements `IconData`, migrate to a class with -`static const` instances and a custom widget. +If you used an `enum` that implements `IconData`, +migrate to a class with `static const` instances and a custom widget. Code before migration: @@ -59,16 +68,16 @@ enum AppIcons implements IconData { final bool matchTextDirection; } -// Usage Widget build(BuildContext context) { + // Example usage of AppIcons: return Icon(AppIcons.arrowUpward); } ``` -Code after migration: +To maintain dot shorthand support and type safety, +use a wrapper class and a custom widget. -To maintain dot shorthand support and type safety, use a wrapper class and a -custom widget: +Code after migration: ```dart final class AppIconData { @@ -96,21 +105,24 @@ class AppIcon extends StatelessWidget { } } -// Usage preserves dot shorthand if the type can be inferred Widget build(BuildContext context) { + // Usage preserves dot shorthand if the type can be inferred: return const AppIcon(AppIconData.arrowUpward); // Or if inferred: const AppIcon(.arrowUpward) } ``` -If you rely on `.values` for tools like Widgetbook, you can maintain the -`values` list manually as shown above or use code generation. +If you rely on `.values` for tools like Widgetbook, +you can maintain the `values` list manually as shown in +the previous example or use code generation. -### Ignoring the mustBeConst lint +### Ignore the `mustBeConst` lint -To enable tree-shaking, some `IconData` parameters are marked with the -`mustBeConst` annotation. If you must use a non-const `IconData` and are willing -to forego tree-shaking for that icon, ignore the lint. +To enable tree-shaking, some `IconData` parameters are +marked with the `mustBeConst` annotation. +If you must use a non-const `IconData` and +are willing to forgo tree-shaking for that icon, +add an ignore comment for the lint. ```dart // ignore: non_const_argument_for_const_parameter @@ -119,15 +131,20 @@ Icon(myDynamicIconData); ## Timeline -Change landed in version: Not yet
-In stable release: Not yet +Landed in version: 3.44.0-0.1.pre
+In stable release: 3.44 ## References +Relevant PR: + +* [Mark `IconData` `final` and `@mustBeConst`][pr-181345] + Relevant issues: -* [Issue 181342][] -* [Issue 181344][] +* [Breaking Change: Marking `class IconData` as `final`][issue-181342] +* [Marking `IconData`'s constructor parameters as `@mustBeConst`][issue-181344] -[Issue 181342]: {{site.repo.flutter}}/issues/181342 -[Issue 181344]: {{site.repo.flutter}}/issues/181344 +[pr-181345]: {{site.repo.flutter}}/pull/181345 +[issue-181342]: {{site.repo.flutter}}/issues/181342 +[issue-181344]: {{site.repo.flutter}}/issues/181344 diff --git a/sites/docs/src/content/release/breaking-changes/image-provider-load-buffer.md b/sites/docs/src/content/release/breaking-changes/image-provider-load-buffer.md index 541c52bf0b..2b533e24aa 100644 --- a/sites/docs/src/content/release/breaking-changes/image-provider-load-buffer.md +++ b/sites/docs/src/content/release/breaking-changes/image-provider-load-buffer.md @@ -73,7 +73,7 @@ class MyImageProvider extends ImageProvider { class MyDelegatingProvider extends ImageProvider { MyDelegatingProvider(this.provider); - final ImageProvder provider; + final ImageProvider provider; @override ImageStreamCompleter load(MyDelegatingProvider key, DecoderCallback decode) { @@ -103,7 +103,7 @@ class MyImageProvider extends ImageProvider { class MyDelegatingProvider extends ImageProvider { MyDelegatingProvider(this.provider); - final ImageProvder provider; + final ImageProvider provider; @override ImageStreamCompleter loadBuffer(MyDelegatingProvider key, DecoderCallback decode) { diff --git a/sites/docs/src/content/release/breaking-changes/index.md b/sites/docs/src/content/release/breaking-changes/index.md index 05435038b5..ad1b313bef 100644 --- a/sites/docs/src/content/release/breaking-changes/index.md +++ b/sites/docs/src/content/release/breaking-changes/index.md @@ -60,23 +60,28 @@ They're sorted by release and listed in alphabetical order: ### Not yet released to stable +* [Large screen orientation and resizability restrictions ignored on Android 17][] + +[Large screen orientation and resizability restrictions ignored on Android 17]: /release/breaking-changes/android-large-screens-restrictions-ignored + + +### Released in Flutter 3.44 + * [Changing RawMenuAnchor close order][] * [Deprecate `onReorder` callback][] -* [Deprecated `cacheExtent` and `cacheExtentStyle`][] * [Deprecate `TextInputConnection.setStyle`][] +* [Deprecated `cacheExtent` and `cacheExtentStyle`][] * [`IconData` class marked as `final`][] -* [Large screen orientation and resizability restrictions ignored on Android 17][] -* [ListTile reports error in debug when wrapped in a colored widget][] +* [ListTile reports an error in debug when wrapped in a colored widget][] * [Migrating Flutter Android projects to built-in Kotlin][] * [Page transition builders reorganization][] -[Large screen orientation and resizability restrictions ignored on Android 17]: /release/breaking-changes/android-large-screens-restrictions-ignored [Changing RawMenuAnchor close order]: /release/breaking-changes/raw-menu-anchor-close-order [Deprecate `onReorder` callback]: /release/breaking-changes/deprecate-onreorder-callback [Deprecated `cacheExtent` and `cacheExtentStyle`]: /release/breaking-changes/scroll-cache-extent [Deprecate `TextInputConnection.setStyle`]: /release/breaking-changes/deprecate-text-input-connection-set-style [`IconData` class marked as `final`]: /release/breaking-changes/icondata-class-marked-final -[ListTile reports error in debug when wrapped in a colored widget]: /release/breaking-changes/list-tile-color-warning +[ListTile reports an error in debug when wrapped in a colored widget]: /release/breaking-changes/list-tile-color-warning [Migrating Flutter Android projects to built-in Kotlin]: /release/breaking-changes/migrate-to-built-in-kotlin [Page transition builders reorganization]: /release/breaking-changes/decouple-page-transition-builders @@ -404,7 +409,7 @@ The following breaking change was reverted in release 2.2: **[Network Policy on iOS and Android][]**
: Introduced in version: 2.0.0
- Reverted in version: 2.2.0 + Reverted in version: 2.2.0 [Network Policy on iOS and Android]: /release/breaking-changes/network-policy-ios-android diff --git a/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md b/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md index fb16431886..42b7293664 100644 --- a/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md +++ b/sites/docs/src/content/release/breaking-changes/list-tile-color-warning.md @@ -1,46 +1,51 @@ --- -title: ListTile reports error in debug when wrapped in a colored widget +title: ListTile reports an error in debug when wrapped in a colored widget description: >- - ListTile reports an error in debug mode when it is wrapped in + ListTile now reports an error in debug mode when it is wrapped in an intermediate widget with a non-transparent background color. --- +{% render "docs/breaking-changes.md" %} + ## Summary -When a `ListTile` is wrapped in a widget with a non-transparent background color -(such as a `Container` or `ColoredBox` with a color specified) that sits between -the `ListTile` and its nearest `Material` ancestor, the framework now reports an -error. +When a widget with a non-transparent background color, +such as a `Container` or `ColoredBox` that sets `color`, +sits between a `ListTile` and its nearest `Material` ancestor, +the framework now reports an error. ## Background -`ListTile` paints its background color and ink splashes on the nearest `Material` -ancestor. When a widget with an opaque background color is placed between the -`ListTile` and its `Material` ancestor, it obscures these visual effects, making -them invisible to the user. +`ListTile` paints its background color and ink splashes +on the nearest `Material` ancestor. +When a widget with an opaque background color is +placed between the `ListTile` and its `Material` ancestor, +it obscures these visual effects, +making them invisible to the user. -To prevent developers from accidentally introducing this bug and wondering why -the background or ink splash effects on the `ListTile` are not displaying, an -assert was introduced. This error explicitly points out the issue during -development. +To prevent you from accidentally introducing this bug and +wondering why the background or ink splash effects on +the `ListTile` aren't displaying, +the framework now reports an assertion error during development. -If your code has an intermediate colored widget between a `ListTile` and a -`Material` widget, you will see an error similar to this: +If your code has an intermediate colored widget +between a `ListTile` and a `Material` widget, +you will now see an error similar to this: ```text ListTile background color or ink splashes may be invisible. -The ListTile is wrapped in a Container that has a background color. Because -ListTile paints its background and ink splashes on the nearest Material -ancestor, this Container will hide those effects. To fix this, wrap the ListTile -in its own Material widget, or remove the background color from the intermediate -Container. +The ListTile is wrapped in a Container that has a background color. +Because ListTile paints its background and ink splashes on +the nearest Material ancestor, this Container will hide those effects. +To fix this, wrap the ListTile in its own Material widget, or +remove the background color from the intermediate Container. ``` ## Migration guide -To fix the error, follow the error's hint and either remove the -background color from the intermediate widget, or wrap the `ListTile` in its own -`Material` widget. +To fix the error, +remove the background color from the intermediate widget or +wrap the `ListTile` in its own `Material` widget. Code before migration: @@ -72,7 +77,8 @@ Material( ) ``` -Or you can wrap the `ListTile` in its own `Material` widget directly: +Alternatively, +wrap the `ListTile` in its own `Material` widget: ```dart Container( @@ -89,8 +95,8 @@ Container( ## Timeline -Landed in version: TBD -In stable release: Not yet +Landed in version: 3.43.0-0.1.pre
+In stable release: 3.44 ## References @@ -101,13 +107,13 @@ API documentation: Relevant issues: -* [Issue 174366][] +* [`ListTile.selectedTileColor` not visible when parent `Container` has explicit background color][issue-174366] Relevant PRs: -* [PR 181402][] +* [Add warning when there is a widget with color between `Material` and `ListTile`][pr-181402] [`ListTile`]: {{site.api}}/flutter/material/ListTile-class.html [`Material`]: {{site.api}}/flutter/material/Material-class.html -[Issue 174366]: {{site.repo.flutter}}/issues/174366 -[PR 181402]: {{site.repo.flutter}}/pull/181402 +[issue-174366]: {{site.repo.flutter}}/issues/174366 +[pr-181402]: {{site.repo.flutter}}/pull/181402 diff --git a/sites/docs/src/content/release/breaking-changes/material-chip-button-semantics.md b/sites/docs/src/content/release/breaking-changes/material-chip-button-semantics.md index 8977731a0e..a68bdb8a44 100644 --- a/sites/docs/src/content/release/breaking-changes/material-chip-button-semantics.md +++ b/sites/docs/src/content/release/breaking-changes/material-chip-button-semantics.md @@ -154,9 +154,9 @@ Relevant PRs: * [PR 60141][]: Tweaking Material Chip a11y semantics to match buttons * [PR 60645][]: Revert "Tweaking Material Chip a11y - semantics to match buttons (#60141) + semantics to match buttons" (#60141) * [PR 61048][]: Re-land "Tweaking Material Chip a11y - semantics to match buttons (#60141) + semantics to match buttons" (#60141) [`ActionChip`]: {{site.api}}/flutter/material/ActionChip-class.html [`Chip`]: {{site.api}}/flutter/material/Chip-class.html diff --git a/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors.md b/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors.md index 8762262721..e2c783c8ba 100644 --- a/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors.md +++ b/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors.md @@ -10,6 +10,11 @@ This guide outlines the migration steps specifically for plugin authors. ### Update the Gradle file +The following steps assume you can update your plugin's Flutter SDK minimum +to 3.44. If you cannot update the Flutter SDK minimum to 3.44, follow the +instructions for +[supporting Flutter versions earlier than 3.44][flutter-sdk-minimum-below-3.44]. + First, find the `kotlin-android` plugin (or the `org.jetbrains.kotlin.android` plugin). It is likely located in the `plugins` block of the @@ -200,6 +205,190 @@ environment: # ... ``` +## Supporting Flutter versions earlier than 3.44 + +If you updated your plugin's Flutter SDK minimum to 3.44, skip this section +and proceed to updating the plugin's `CHANGELOG.md`. + +If you cannot update the plugin's Flutter SDK minimum to 3.44, you must make +the following changes to `/android/build.gradle` or +`/android/build.gradle.kts` to support apps on AGP < 9 +and AGP >= 9: + + + + +**Before**: + +```kotlin title="/android/build.gradle.kts" +plugins { + id("com.android.library") + id("kotlin-android") + // ... +} + +android { + // ... + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + // ... +} + +// ... +``` + +Next, remove the `kotlin-android` plugin and the `kotlinOptions` block: + +```kotlin diff title="/android/build.gradle.kts" + plugins { + id("com.android.library") +- id("kotlin-android") + // ... + } + + android { + // ... +- kotlinOptions { +- jvmTarget = JavaVersion.VERSION_17.toString() +- } + // ... + } +``` + +Add a check to apply the Kotlin Gradle Plugin only when the app's Android +Gradle Plugin version is earlier than 9. + +```kotlin diff title="/android/build.gradle.kts" ++ val agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.substringBefore('.').toInt() ++ ++ if (agpMajor < 9) { ++ apply(plugin = "org.jetbrains.kotlin.android") ++ } +``` + +Add the `compilerOptions` configuration using the project extension: + +```kotlin diff title="/android/build.gradle.kts" ++ project.extensions.configure(org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension::class.java) { ++ compilerOptions { ++ jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 ++ } ++ } +``` + +Here is how the file will likely end up: + +**After**: + +```kotlin title="/android/build.gradle.kts" +plugins { + id("com.android.library") + // ... +} + +val agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.substringBefore('.').toInt() + +if (agpMajor < 9) { + apply(plugin = "org.jetbrains.kotlin.android") +} + +android { + // ... +} + +project.extensions.configure(org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension::class.java) { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + +// ... +``` + + + + +**Before**: + +```groovy title="/android/build.gradle" +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + // ... + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + // ... +} + +// ... +``` + +Next, remove the `kotlin-android` plugin and the `kotlinOptions` block: + +```groovy diff title="/android/build.gradle" +apply plugin: 'com.android.library' +- apply plugin: 'kotlin-android' + + android { + // ... +- kotlinOptions { +- jvmTarget = JavaVersion.VERSION_17.toString() +- } + // ... + } +``` + +Add a check to apply the Kotlin Gradle Plugin only when the app's Android +Gradle Plugin version is earlier than 9. + +```groovy diff title="/android/build.gradle" ++ def agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0] as int ++ ++ if (agpMajor < 9) { ++ apply plugin: 'kotlin-android' ++ } +``` + +Add the `kotlin.compilerOptions{}` DSL block with the following: + +```groovy diff title="/android/build.gradle" ++ kotlin { ++ compilerOptions { ++ jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 ++ } ++ } +``` + +Here is how the file will likely end up: + +**After**: + +```groovy title="/android/build.gradle" +apply plugin: 'com.android.library' + +def agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0] as int +if (agpMajor < 9) { + apply plugin: 'kotlin-android' +} + +android { + // ... +} + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + +// ... +``` + + + ### Update the plugin's `CHANGELOG.md` Include your changes in the CHANGELOG of the newly released plugin version: @@ -224,3 +413,4 @@ then you will also have to migrate the example app. Follow the [migration guide for app developers][app-migration-guide] to migrate your example app. [app-migration-guide]: {{site.flutter-docs}}/release/breaking-changes/migrate-to-built-in-kotlin/for-app-developers +[flutter-sdk-minimum-below-3.44]: {{site.flutter-docs}}/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors#supporting-flutter-versions-earlier-than-3-44 diff --git a/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md b/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md index 3a4c165861..241aa1093c 100644 --- a/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md +++ b/sites/docs/src/content/release/breaking-changes/migrate-to-built-in-kotlin/index.md @@ -2,55 +2,74 @@ title: Migrating Flutter Android projects to built-in Kotlin description: >- Update your Flutter Android Gradle files to use built-in Kotlin support. - Essential for migrating projects to Android Gradle Plugin 9.0.0+. + Essential for migrating projects to Android Gradle Plugin 9 or later. --- +{% render "docs/breaking-changes.md" %} + ## Summary -To build a Flutter app for Android, the Android Gradle Plugin (AGP) -must be applied. As of AGP 9.0.0, -the following migrations are required to successfully use AGP 9.0.0+. +To build a Flutter app for Android, +the Android Gradle Plugin (AGP) must be used. +To use AGP 9 and later, the following migrations are required. -First, built-in Kotlin is the new default on AGP 9+, meaning any apps -using the `kotlin-android` plugin (also known as the Kotlin Gradle Plugin -or KGP) will not build successfully [Issue #181383][]. +First, built-in Kotlin is the default in AGP 9 and later. +Apps that use the `kotlin-android` plugin, +also known as the Kotlin Gradle Plugin (KGP), +will fail to build ([Issue #181383][]). However, the Flutter team has added temporary support for the legacy -Kotlin Gradle Plugin (KGP) in AGP 9.0.0+ [Issue #183909][]. +Kotlin Gradle Plugin in AGP 9 and later ([Issue #183909][]). This allows app and plugin developers to safely build their projects regardless of their migration state. -Second, AGP 9.0.0+ will only use the new AGP DSL interfaces. +Second, AGP 9 and later only use the new AGP DSL interfaces. This means any old DSL types will not be recognized. The Flutter team is working on migrating old DSL types to use the new DSL: [Issue #180137][]. -In the meantime, the Flutter team has configured the AGP DSL to be compatible -with the legacy old AGP DSL types [Issue #184838][]. -This ensures app and plugin developers can safely upgrade to AGP 9+. +In the meantime, the Flutter team has configured the AGP DSL +to be compatible with the legacy DSL types ([Issue #184838][]). +This ensures app and plugin developers can +safely upgrade to AGP 9 and later. -To ensure compatibility, all apps and plugins must be manually migrated -from the legacy Kotlin Gradle Plugin (KGP) to built-in Kotlin. -In a future Flutter version, support for applying KGP will be removed -[Issue #184837][]. +To ensure compatibility, +manually migrate all apps and plugins +from the legacy KGP to built-in Kotlin. +Flutter plans to remove support for applying KGP +in a future version ([Issue #184837][]). To learn more about Android Gradle Plugin, see the [Android Gradle Plugin docs][AGP block]. +[AGP block]: {{site.android-dev}}/build/releases/gradle-plugin + ## Migrate -**For app developers:** See the [app developer migration guide][app-migration-guide]. +**For app developers:** +Follow the [app developer migration guide][app-migration-guide]. -**For plugin authors:** See the [plugin author migration guide][plugin-migration-guide]. +**For plugin authors:** +Follow the [plugin author migration guide][plugin-migration-guide]. + +[app-migration-guide]: /release/breaking-changes/migrate-to-built-in-kotlin/for-app-developers +[plugin-migration-guide]: /release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors ## Next steps -- **Remove Support for KGP:** In a future version of Flutter, - support for applying KGP will be removed [Issue #184837][]. Developers must - migrate their projects (apps, plugins, host app projects) or they will be - unable to build. +- **Remove support for KGP:** + In a future version of Flutter, + support for applying KGP will be removed ([Issue #184837][]). + Migrate apps, plugins, and host apps to keep them building. + +- **Remove the DSL Gradle property:** + Once the Flutter team completes the migration to the new AGP DSL, + it will remove support for the old DSL ([Issue #184839][]). -- **Remove DSL Gradle Property:** Once the Flutter team - completes the migration to the new AGP DSL, - the Flutter team will remove support for the old DSL [Issue #184839][]. +## Timeline + +Landed in version: 3.44.0-0.1.pre
+In stable release: 3.44 + +## References Relevant issues: @@ -67,14 +86,9 @@ Consider staying up to date with the latest version of the build files by periodically running `flutter upgrade` in your app's directory. -[AGP block]: {{site.android-dev}}/build/releases/gradle-plugin - -[Issue #180137]: {{site.github}}/flutter/flutter/issues/180137 -[Issue #181383]: {{site.github}}/flutter/flutter/issues/181383 -[Issue #183909]: {{site.github}}/flutter/flutter/issues/183909 -[Issue #184837]: {{site.github}}/flutter/flutter/issues/184837 -[Issue #184838]: {{site.github}}/flutter/flutter/issues/184838 -[Issue #184839]: {{site.github}}/flutter/flutter/issues/184839 - -[app-migration-guide]: {{site.flutter-docs}}/release/breaking-changes/migrate-to-built-in-kotlin/for-app-developers -[plugin-migration-guide]: {{site.flutter-docs}}/release/breaking-changes/migrate-to-built-in-kotlin/for-plugin-authors +[Issue #180137]: {{site.repo.flutter}}/issues/180137 +[Issue #181383]: {{site.repo.flutter}}/issues/181383 +[Issue #183909]: {{site.repo.flutter}}/issues/183909 +[Issue #184837]: {{site.repo.flutter}}/issues/184837 +[Issue #184838]: {{site.repo.flutter}}/issues/184838 +[Issue #184839]: {{site.repo.flutter}}/issues/184839 diff --git a/sites/docs/src/content/release/breaking-changes/modal-router-semantics-order.md b/sites/docs/src/content/release/breaking-changes/modal-router-semantics-order.md index da9d973f54..0e70793945 100644 --- a/sites/docs/src/content/release/breaking-changes/modal-router-semantics-order.md +++ b/sites/docs/src/content/release/breaking-changes/modal-router-semantics-order.md @@ -77,12 +77,12 @@ void main() { SemanticsNode getChild(SemanticsNode node) { SemanticsNode child; - bool visiter(SemanticsNode target) { + bool visitor(SemanticsNode target) { child = target; return false; } - node.visitChildren(visiter); + node.visitChildren(visitor); return child; } ``` @@ -127,12 +127,12 @@ void main() { SemanticsNode getChild(SemanticsNode node) { SemanticsNode child; - bool visiter(SemanticsNode target) { + bool visitor(SemanticsNode target) { child = target; return false; } - node.visitChildren(visiter); + node.visitChildren(visitor); return child; } ``` diff --git a/sites/docs/src/content/release/breaking-changes/multi-touch-scrolling.md b/sites/docs/src/content/release/breaking-changes/multi-touch-scrolling.md index 82b5c019b6..c74d8950ed 100644 --- a/sites/docs/src/content/release/breaking-changes/multi-touch-scrolling.md +++ b/sites/docs/src/content/release/breaking-changes/multi-touch-scrolling.md @@ -11,7 +11,7 @@ description: > `ScrollBehavior`s now allow or disallow scrolling speeds to be affected by the number of pointers on the screen. `ScrollBehavior.multitouchDragStrategy`, by -default, prevents multiple pointers interacting wih the scrollable at the same +default, prevents multiple pointers interacting with the scrollable at the same time from affecting the speed of scrolling. ## Context diff --git a/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md b/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md index f55ed2459e..73b0815eb5 100644 --- a/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md +++ b/sites/docs/src/content/release/breaking-changes/network-policy-ios-android.md @@ -37,7 +37,7 @@ network policy. See the migration guide below for details. :::important The following only applies to platform native sockets (sockets owned -by the Android and iOS platforms). +by the Android and iOS platforms). Flutter does not enforce any policy at socket level; you would be responsible for securing the connection. If the socket is owned by @@ -71,9 +71,10 @@ Then, add the network configuration to your $project_path/android/app/src/debug/ ``` It is also possible to set the policy per domain. See the Android -docuentation for more information. +documentation for more information. -For iOS, you can follow [these instructions](/add-to-app/ios/project-setup/?tab=embed-using-cocoapods#set-local-network-privacy-permissions) to create a `Info-debug.plist` and put this in: +For iOS, you can follow [these instructions][] to create a `Info-debug.plist` +and put this in: ```xml NSAppTransportSecurity @@ -112,3 +113,4 @@ Relevant PRs: [PR 20218: Plumbing for setting domain network policy]: {{site.repo.engine}}/pull/20218 [Introduce per-domain policy for strict secure connections]: {{site.github}}/dart-lang/sdk/commit/d878cfbf20375befa09f9bf85f0ba2b87b319427 +[these instructions]: /add-to-app/ios/project-setup#local-network-permissions \ No newline at end of file diff --git a/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md b/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md index 01e0d58868..c85252a7d9 100644 --- a/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md +++ b/sites/docs/src/content/release/breaking-changes/raw-menu-anchor-close-order.md @@ -1,8 +1,9 @@ --- title: Changing RawMenuAnchor close order description: >- - Closing a `RawMenuAnchor` now triggers `onClose` and `onCloseRequested` callbacks - for all descendant `RawMenuAnchor`s in a coordinated sequence. + Closing a `RawMenuAnchor` now triggers + `onClose` and `onCloseRequested` callbacks for all + descendant `RawMenuAnchor`s in a coordinated sequence. --- {% render "docs/breaking-changes.md" %} @@ -16,16 +17,16 @@ starting from the triggering `RawMenuAnchor` and moving to its descendants, while the `onClose` callback is triggered bottom-up. If a `RawMenuAnchor` is already closed, calls to `MenuController.close` and `MenuController.closeChildren` -will not trigger the `onCloseRequested` callback. +don't trigger the `onCloseRequested` callback. ## Background `RawMenuAnchor` is a low-level widget used to build custom menu systems. -Previously, a `RawMenuAnchor` did not automatically notify its descendants -when it was closed. -Developers were required to manually call `controller.closeChildren()` -within the `onCloseRequested` callback to trigger closure -in descendant `RawMenuAnchor`s. +Previously, a `RawMenuAnchor` didn't automatically +notify its descendants when it was closed. +You had to manually call `controller.closeChildren()` +within the `onCloseRequested` callback +to close descendant `RawMenuAnchor`s. Furthermore, the `onClose` callback timing was inconsistent. A parent `RawMenuAnchor`'s `onClose` could be executed @@ -36,19 +37,19 @@ it subsequently triggers `onCloseRequested` for all of its descendant `RawMenuAnchor`s in a top-down manner. When `hideOverlay` is called from within `onCloseRequested` to close the menu, -all descendant `RawMenuAnchor`s will have their `onClose` callbacks executed -in a bottom-up order. +all descendant `RawMenuAnchor`s have their `onClose` callbacks +executed in a bottom-up order. This means that the most recently opened `RawMenuAnchor` -will have its `onClose` callback executed first, +now has its `onClose` callback executed first, followed by its parent, and so on up the hierarchy. This design allows for a coordinated closing sequence -where child `RawMenuAnchor`s can perform necessary cleanup +where child `RawMenuAnchor`s can perform any necessary cleanup before their parents finalize the closing process. Finally, if a `RawMenuAnchor` is already closed, calls to `MenuController.close` and `MenuController.closeChildren` -will not trigger the `onCloseRequested` callback, +don't trigger the `onCloseRequested` callback, preventing unnecessary callback executions. ## Migration guide @@ -61,15 +62,15 @@ If you have a custom implementation of `onCloseRequested` in a `RawMenuAnchor` containing submenus, `controller.closeChildren()` is now called automatically when the parent menu closes. -You should ensure that your implementation of `onCloseRequested` -still behaves correctly in this context. +Make sure that your implementation of `onCloseRequested` +still behaves correctly with this automatic call. Immediate calls to `controller.closeChildren()` within your -`onCloseRequested` callback are no longer necessary and should be removed. +`onCloseRequested` callback are no longer necessary. +Remove those calls. -Additionally, if your logic relied on the parent's `onClose` callback -firing before its descendants, -you may need to refactor your code to account for the new -bottom-up execution order. +Additionally, if your logic relied on the +parent's `onClose` callback firing before its descendants, +refactor your code to account for the new bottom-up execution order. Code before migration: @@ -81,8 +82,8 @@ RawMenuAnchor( return; } - // Descendant submenus must be closed before the parent menu. This is now - // handled automatically, so this call is no longer necessary. + // Descendant submenus must be closed before the parent menu. + // This is now handled automatically, so this call is no longer necessary. menuController.closeChildren(); animationController.reverse().whenComplete(hideOverlay); }, @@ -104,11 +105,12 @@ RawMenuAnchor( return; } - // menuController.closeChildren() is now called automatically. + // `menuController.closeChildren()` is now called automatically. animationController.reverse().whenComplete(hideOverlay); }, onClose: () { - // This now executes only after all descendant submenus have called onClose(). + // This now executes only after all descendant submenus have + // called `onClose()`. _handleMenuClosed(); }, // ... @@ -122,21 +124,24 @@ This migration is not supported by `dart fix` ## Timeline Landed in version: 3.44.0-0.1.pre
-In stable release: TBD +In stable release: 3.44 ## References API documentation: -* [`RawMenuAnchor`]({{site.api}}/flutter/widgets/RawMenuAnchor-class.html) -* [`RawMenuAnchor.onCloseRequested`]({{site.api}}/flutter/widgets/RawMenuAnchor/onCloseRequested.html) +* [`RawMenuAnchor`][] +* [`RawMenuAnchor.onCloseRequested`][] Relevant issues: -* [[widgets/raw_menu_anchor.dart] onClose should be called by descendant menus - before parent]({{site.repo.flutter}}/issues/182355) +* [[widgets/raw_menu_anchor.dart] onClose should be called by descendant menus before parent][issue-182355] Relevant PRs: -* [[widgets/raw_menu_anchor.dart] Always onClose and onCloseRequested on - descendants before parent.]({{site.repo.flutter}}/pull/182357) +* [[widgets/raw_menu_anchor.dart] Always onClose and onCloseRequested on descendants before parent.][pr-182357] + +[`RawMenuAnchor`]: {{site.api}}/flutter/widgets/RawMenuAnchor-class.html +[`RawMenuAnchor.onCloseRequested`]: {{site.api}}/flutter/widgets/RawMenuAnchor/onCloseRequested.html +[issue-182355]: {{site.repo.flutter}}/issues/182355 +[pr-182357]: {{site.repo.flutter}}/pull/182357 diff --git a/sites/docs/src/content/release/breaking-changes/renderbox-dry-layout.md b/sites/docs/src/content/release/breaking-changes/renderbox-dry-layout.md index d3fe295e77..7780d792ff 100644 --- a/sites/docs/src/content/release/breaking-changes/renderbox-dry-layout.md +++ b/sites/docs/src/content/release/breaking-changes/renderbox-dry-layout.md @@ -97,7 +97,7 @@ In stable release: 2.0.0 API documentation: * [`RenderBox`][] -* [`computeMinInstrinsicWidth`][] +* [`computeMinIntrinsicWidth`][] * [`computeDryLayout`][] * [`getDryLayout`][] * [`performResize`][] @@ -114,7 +114,7 @@ Relevant PRs: [`RenderBox`]: {{site.api}}/flutter/rendering/RenderBox-class.html [`RenderBox.computeMinIntrinsicWidth`]: {{site.api}}/flutter/rendering/RenderBox/computeMinIntrinsicWidth.html -[`computeMinInstrinsicWidth`]: {{site.api}}/flutter/rendering/RenderBox/computeMinIntrinsicWidth.html +[`computeMinIntrinsicWidth`]: {{site.api}}/flutter/rendering/RenderBox/computeMinIntrinsicWidth.html [`computeDryLayout`]: {{site.api}}/flutter/rendering/RenderBox/computeDryLayout.html [`getDryLayout`]: {{site.api}}/flutter/rendering/RenderBox/getDryLayout.html [`performResize`]: {{site.api}}/flutter/rendering/RenderBox/performResize.html diff --git a/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md b/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md index ed58b7d296..0fb02b091e 100644 --- a/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md +++ b/sites/docs/src/content/release/breaking-changes/scroll-cache-extent.md @@ -9,31 +9,34 @@ description: >- ## Summary -Two properties, `cacheExtent` and `cacheExtentStyle`, are deprecated in scrolling -related widgets (like `ListView`, `GridView`, `CustomScrollView`, `Viewport`) -and their corresponding RenderObjects (like `RenderViewport`). -A new property, `scrollCacheExtent`, has been introduced that encapsulates +Flutter 3.44 deprecates `cacheExtent` and `cacheExtentStyle` +in scrolling-related widgets, such as +`ListView`, `GridView`, `CustomScrollView`, and `Viewport`, +and their corresponding render objects, such as `RenderViewport`. +The new `scrollCacheExtent` property encapsulates both the value and the caching strategy (pixels or viewport). ## Background -Previously, `cacheExtent` was a `double` and `cacheExtentStyle` determined how -that `double` was interpreted (either as pixels or as a fraction of the -viewport). -It also separated the value from its unit, which could be confusing. +Previously, `cacheExtent` was a `double` and +`cacheExtentStyle` determined how that `double` was interpreted +(either as pixels or as a fraction of the viewport). +This split made the setting harder to understand. The new `scrollCacheExtent` property uses a `ScrollCacheExtent` object that -explicitly encapsulates both the value and the caching strategy (pixels or -viewport), ensuring type safety and clearer intent. +explicitly encapsulates both the value and +the caching strategy (pixels or viewport), +which provides type safety and clearer intent. ## Migration guide -### Widget Layer +### Widget layer -#### cacheExtent (Pixels) +#### `cacheExtent` (pixels) -If you were using `cacheExtent` (which defaults to pixels), use `scrollCacheExtent` -with `ScrollCacheExtent.pixels`. +If your code uses `cacheExtent`, +which defaults to pixels, +use `scrollCacheExtent` with `ScrollCacheExtent.pixels`. **Before:** @@ -53,33 +56,36 @@ ListView( ) ``` -#### cacheExtentStyle (Viewport) - -If you were using `cacheExtent` with `CacheExtentStyle.viewport` (commonly used -in `Viewport`), use `scrollCacheExtent` with `ScrollCacheExtent.viewport`. - - **Before:** - - ```dart - Viewport( - cacheExtent: 0.5, - cacheExtentStyle: CacheExtentStyle.viewport, - slivers: // ... - ) - ``` - - **After:** - - ```dart - Viewport( - scrollCacheExtent: const ScrollCacheExtent.viewport(0.5), - slivers: // ... - ) - ``` - -### RenderObject Layer - -If you were manually setting properties on `RenderViewport` or similar, update to use `scrollCacheExtent`. +#### `cacheExtentStyle` (viewport) + +If your code uses `cacheExtent` with `CacheExtentStyle.viewport`, +which is common in `Viewport`, +use `scrollCacheExtent` with `ScrollCacheExtent.viewport`. + +**Before:** + +```dart +Viewport( + cacheExtent: 0.5, + cacheExtentStyle: CacheExtentStyle.viewport, + slivers: // ... +) +``` + +**After:** + +```dart +Viewport( + scrollCacheExtent: const ScrollCacheExtent.viewport(0.5), + slivers: // ... +) +``` + +### Render object layer + +If your code manually sets properties on +`RenderViewport` or a similar render object, +use `scrollCacheExtent`. **Before:** @@ -97,7 +103,7 @@ renderViewport.scrollCacheExtent = const ScrollCacheExtent.pixels(500.0); ## Timeline Landed in version: 3.41.0-0.0.pre
-In stable release: TBD +In stable release: 3.44 ## References @@ -109,10 +115,10 @@ API documentation: Relevant PRs: -* [Introduce ScrollCacheExtent][] +* [Introduce ScrollCacheExtent][pr-181092] [`ScrollCacheExtent`]: {{site.api}}/flutter/rendering/ScrollCacheExtent-class.html [`ScrollView.scrollCacheExtent`]: {{site.api}}/flutter/widgets/ScrollView/scrollCacheExtent.html [`RenderViewportBase.scrollCacheExtent`]: {{site.api}}/flutter/rendering/RenderViewportBase/scrollCacheExtent.html -[Introduce ScrollCacheExtent]: {{site.repo.flutter}}/pull/181092 +[pr-181092]: {{site.repo.flutter}}/pull/181092 diff --git a/sites/docs/src/content/release/breaking-changes/system_context_menu_controller_show.md b/sites/docs/src/content/release/breaking-changes/system_context_menu_controller_show.md index 7e5fe310c5..8c2a66aa70 100644 --- a/sites/docs/src/content/release/breaking-changes/system_context_menu_controller_show.md +++ b/sites/docs/src/content/release/breaking-changes/system_context_menu_controller_show.md @@ -76,12 +76,12 @@ final List defaultItems = SystemContextMenu.getDefaultItems(editableTextState); final WidgetsLocalizations localizations = WidgetsLocalizations.of(context); -final List defaultItemDatas = +final List defaultItemData = defaultItems .map((IOSSystemContextMenuItem item) => item.getData(localizations)) .toList(); -_controller.showWithItems(selectionRect, defaultItemDatas); +_controller.showWithItems(selectionRect, defaultItemData); ``` ## Timeline diff --git a/sites/docs/src/content/release/breaking-changes/uiscenedelegate.md b/sites/docs/src/content/release/breaking-changes/uiscenedelegate.md index 4b1815c518..fe9983a5e7 100644 --- a/sites/docs/src/content/release/breaking-changes/uiscenedelegate.md +++ b/sites/docs/src/content/release/breaking-changes/uiscenedelegate.md @@ -305,8 +305,8 @@ For Objective-C projects, create a `SceneDelegate.h` and `SceneDelegate.m`: ## Migration guide for adding Flutter to existing app (Add to App) -Similar to the `FlutterAppDelegate`, the `FlutterSceneDelgate` is recommended -but not required. The `FlutterSceneDelgate` forwards scene callbacks, such as +Similar to the `FlutterAppDelegate`, the `FlutterSceneDelegate` is recommended +but not required. The `FlutterSceneDelegate` forwards scene callbacks, such as [`openURL`][] to plugins such as [local_auth][]. ### Create/Update a SceneDelegate diff --git a/sites/docs/src/content/release/breaking-changes/web-golden-comparator.md b/sites/docs/src/content/release/breaking-changes/web-golden-comparator.md index ec6fb155b7..ea8268029f 100644 --- a/sites/docs/src/content/release/breaking-changes/web-golden-comparator.md +++ b/sites/docs/src/content/release/breaking-changes/web-golden-comparator.md @@ -32,7 +32,7 @@ configure [`goldenFileComparator`][] and use it (when using a non-HTML web backend). For users that implement a custom [`WebGoldenComparator`][], you will -migrate the implemenation to [`GoldenFileComparator`][]. Fortunately the +migrate the implementation to [`GoldenFileComparator`][]. Fortunately the Canvas Kit and SkWasm backends already required similar methods (`compareButes` and `updateBytes`). diff --git a/sites/docs/src/content/release/release-notes/index.md b/sites/docs/src/content/release/release-notes/index.md index 6564de5ae1..cc26faa473 100644 --- a/sites/docs/src/content/release/release-notes/index.md +++ b/sites/docs/src/content/release/release-notes/index.md @@ -22,6 +22,9 @@ outlined in the [Beta channel][] section of the [SDK archive][] page. ## Stable releases +* 3.44.0 + * [3.44.0 release notes & change log][] + * [3.44.0 breaking changes & migrations][] * 3.41.0 * [3.41.0 announcement][] * [3.41.0 release notes & change log][] @@ -119,6 +122,8 @@ outlined in the [Beta channel][] section of the [SDK archive][] page. * Earlier * [Archived release notes][] +[3.44.0 release notes & change log]: /release/release-notes/release-notes-3.44.0 +[3.44.0 breaking changes & migrations]: /release/breaking-changes#released-in-flutter-3-44 [3.41.0 announcement]: {{site.flutter-blog}}/whats-new-in-flutter-3-41-302ec140e632 [3.41.0 release notes & change log]: /release/release-notes/release-notes-3.41.0 [3.41.0 breaking changes & migrations]: /release/breaking-changes#released-in-flutter-3-41 diff --git a/sites/docs/src/content/release/release-notes/release-notes-3.44.0.md b/sites/docs/src/content/release/release-notes/release-notes-3.44.0.md new file mode 100644 index 0000000000..a65ff18451 --- /dev/null +++ b/sites/docs/src/content/release/release-notes/release-notes-3.44.0.md @@ -0,0 +1,1006 @@ +--- +title: Flutter 3.44.0 release notes +shortTitle: 3.44.0 release notes +description: Release notes for Flutter 3.44.0. +skipTemplateRendering: true +--- + +This page has release notes for Flutter 3.44. + +## What's changed + +### Framework + +* Add new motion accessibility features to iOS. by @ksokolovskyi in [178102](https://github.com/flutter/flutter/pull/178102) +* Implementation of tooltip windows for win32 by @mattkae in [179147](https://github.com/flutter/flutter/pull/179147) +* Make sure that an EditableText doesn't crash in 0x0 environment by @ahmedsameha1 in [180457](https://github.com/flutter/flutter/pull/180457) +* Merge `widget_tester_leaks_free_test.dart` into `widget_tester_test.dart` by @dkwingsmt in [180600](https://github.com/flutter/flutter/pull/180600) +* Make sure that a Container doesn't crash in 0x0 environment by @ahmedsameha1 in [180350](https://github.com/flutter/flutter/pull/180350) +* Make sure that an Expansible doesn't crash in 0x0 environment by @ahmedsameha1 in [180478](https://github.com/flutter/flutter/pull/180478) +* Make sure that a CupertinoTabScaffold doesn't crash in 0x0 environment by @ahmedsameha1 in [179824](https://github.com/flutter/flutter/pull/179824) +* Make sure that a FlutterLogo doesn't crash in 0x0 environment by @ahmedsameha1 in [180617](https://github.com/flutter/flutter/pull/180617) +* Make sure that a LongPressDraggable doesn't crash in 0x0 environment by @ahmedsameha1 in [180408](https://github.com/flutter/flutter/pull/180408) +* Migrate doc and code to use sendAnnounce by @chunhtai in [180776](https://github.com/flutter/flutter/pull/180776) +* Add API sample and docs for Expansible widget by @gowsikraja in [180273](https://github.com/flutter/flutter/pull/180273) +* Fix RawAutocomplete unmounted crash during async optionsBuilder by @augustocesarperin in [180824](https://github.com/flutter/flutter/pull/180824) +* Manually roll test dependencies by @goderbauer in [180886](https://github.com/flutter/flutter/pull/180886) +* Make sure that a DisplayFeatureSubScreen doesn't crash in 0x0 environ… by @ahmedsameha1 in [180357](https://github.com/flutter/flutter/pull/180357) +* Make sure that a DragTarget doesn't crash in 0x0 environment by @ahmedsameha1 in [180422](https://github.com/flutter/flutter/pull/180422) +* Make sure that a FormField doesn't crash at 0x0 environment by @ahmedsameha1 in [180810](https://github.com/flutter/flutter/pull/180810) +* Make sure that a Banner doesn't crash in 0x0 environment by @ahmedsameha1 in [180254](https://github.com/flutter/flutter/pull/180254) +* Make sure that an ErrorWidget doesn't crash in 0x0 environment by @ahmedsameha1 in [180830](https://github.com/flutter/flutter/pull/180830) +* Make sure that a FocusScope doesn't crash in 0x0 environment by @ahmedsameha1 in [180715](https://github.com/flutter/flutter/pull/180715) +* Add Flutter as a Swift Package dependency by @vashworth in [178931](https://github.com/flutter/flutter/pull/178931) +* Update link to FlutterTest font generation script by @lsaudon in [179957](https://github.com/flutter/flutter/pull/179957) +* Add RouteSettings to showCupertinoSheet by @jonmountjoy in [178643](https://github.com/flutter/flutter/pull/178643) +* Implement superellipse support for CupertinoFocusHalo by @O-Hannonen in [180724](https://github.com/flutter/flutter/pull/180724) +* Manual roll of pub packages including an update to meta version 1.18.0 by @jason-simmons in [181078](https://github.com/flutter/flutter/pull/181078) +* fix(windows): use wcsnlen for defensive programming (CWE-126) by @dbebawy in [180419](https://github.com/flutter/flutter/pull/180419) +* Remove divider from widgets tests by @navaronbracke in [180999](https://github.com/flutter/flutter/pull/180999) +* Remove MaterialButtons and Divider from draggable_scrollable_sheet_test.dart by @navaronbracke in [180996](https://github.com/flutter/flutter/pull/180996) +* remove unused divider by @navaronbracke in [180990](https://github.com/flutter/flutter/pull/180990) +* use null-aware element in `pointer_signal_resolver.0.dart‎` by @AbdeMohlbi in [180981](https://github.com/flutter/flutter/pull/180981) +* Fix test cross-imports for ListTile by @huycozy in [180572](https://github.com/flutter/flutter/pull/180572) +* Enhance Hero widget with customizable animation curves by @aaazlkm in [180100](https://github.com/flutter/flutter/pull/180100) +* Improve the algorithm for rounded superellipse paths to work better at very large ratio by @dkwingsmt in [180453](https://github.com/flutter/flutter/pull/180453) +* Make sure that an AnimatedSwitcher doesn't crash in 0x0 environment by @ahmedsameha1 in [180190](https://github.com/flutter/flutter/pull/180190) +* Make sure that a Form doesn't crash in 0x0 environment by @ahmedsameha1 in [180792](https://github.com/flutter/flutter/pull/180792) +* Add RenderSliver.getMaxPaintRect by @zemanux in [180074](https://github.com/flutter/flutter/pull/180074) +* Make sure that a Focus doesn't crash in 0x0 environment by @ahmedsameha1 in [180674](https://github.com/flutter/flutter/pull/180674) +* Add RawTooltipl example and test by @AbdeMohlbi in [180722](https://github.com/flutter/flutter/pull/180722) +* [Android] Add display corner radii support. by @ksokolovskyi in [179219](https://github.com/flutter/flutter/pull/179219) +* Make sure that a GridPaper doesn't crash in 0x0 environment by @ahmedsameha1 in [180906](https://github.com/flutter/flutter/pull/180906) +* Make sure that an Icon doesn't crash in 0x0 environment by @ahmedsameha1 in [181021](https://github.com/flutter/flutter/pull/181021) +* fix description for semantics finders by @navaronbracke in [181214](https://github.com/flutter/flutter/pull/181214) +* Use null-aware elements in cupertino/nav_bar.dart by @brahim-guaali in [181237](https://github.com/flutter/flutter/pull/181237) +* Fix remove material import textfield by @kazbeksultanov in [181254](https://github.com/flutter/flutter/pull/181254) +* Make sure that a Hero doesn't crash in 0x0 environment by @ahmedsameha1 in [180954](https://github.com/flutter/flutter/pull/180954) +* Add ExpansibleController.toggle method. by @ksokolovskyi in [181320](https://github.com/flutter/flutter/pull/181320) +* Fix leaks in `flutter_test` tests by @dkwingsmt in [180879](https://github.com/flutter/flutter/pull/180879) +* Make topGap not required for CupertinoSheetTransition by @MitchellGoodwin in [181269](https://github.com/flutter/flutter/pull/181269) +* Remove unnecessary Material import from sliver_visibility_test by @kazbeksultanov in [181248](https://github.com/flutter/flutter/pull/181248) +* Remove unnecessary Material import from dialog_test.dart by @kazbeksultanov in [181249](https://github.com/flutter/flutter/pull/181249) +* CupertinoSheetRoute with scrolling and dragging by @MitchellGoodwin in [177337](https://github.com/flutter/flutter/pull/177337) +* Fixes duplicated import in accessibility test library by @chunhtai in [181506](https://github.com/flutter/flutter/pull/181506) +* Make sure that an AnimatedContainer doesn't crash in 0x0 environment by @ahmedsameha1 in [181198](https://github.com/flutter/flutter/pull/181198) +* Make sure that an AnimatedPositionedDirectional doesn't crash in 0x0 … by @ahmedsameha1 in [181451](https://github.com/flutter/flutter/pull/181451) +* Make sure that an AnimatedRotation doesn't crash in 0x0 environment by @ahmedsameha1 in [181486](https://github.com/flutter/flutter/pull/181486) +* Make sure that an ImageIcon doesn't crash in 0x0 environment by @ahmedsameha1 in [181099](https://github.com/flutter/flutter/pull/181099) +* Make sure that an AnimatedAlign doesn't crash in 0x0 environment by @ahmedsameha1 in [181361](https://github.com/flutter/flutter/pull/181361) +* Fix remove material import box decoration test by @kazbeksultanov in [181253](https://github.com/flutter/flutter/pull/181253) +* Make sure that an ImageFiltered doesn't crash at 0x0 environment by @ahmedsameha1 in [181067](https://github.com/flutter/flutter/pull/181067) +* Make sure that an AnimatedPadding doesn't crash in 0x0 environment by @ahmedsameha1 in [181235](https://github.com/flutter/flutter/pull/181235) +* test: Clarify failure messages on gestures/debug_test.dart by @luanpotter in [181109](https://github.com/flutter/flutter/pull/181109) +* feat: add onEnd to AnimatedCrossFade by @rkishan516 in [181455](https://github.com/flutter/flutter/pull/181455) +* [web] Use defensive null check in text editing placeElement by @flutter-zl in [180795](https://github.com/flutter/flutter/pull/180795) +* Add TestWidgetsApp utility and refactor widget tests to use WidgetsApp by @rkishan516 in [180456](https://github.com/flutter/flutter/pull/180456) +* Enhance error handling of WidgetsBindingObserver callbacks by @kazbeksultanov in [181174](https://github.com/flutter/flutter/pull/181174) +* Fix P3-to-sRGB color conversion to operate in linear light by @westito in [181720](https://github.com/flutter/flutter/pull/181720) +* Use null-aware spread in cupertino/app.dart by @brahim-guaali in [181585](https://github.com/flutter/flutter/pull/181585) +* Use null-aware elements in cupertino/list_tile.dart by @brahim-guaali in [181243](https://github.com/flutter/flutter/pull/181243) +* Fix DecoratedSliver sample to avoid antialiasing gap by @brahim-guaali in [179848](https://github.com/flutter/flutter/pull/179848) +* Remove material from basic_test.dart by @navaronbracke in [181444](https://github.com/flutter/flutter/pull/181444) +* Remove material from sliver_tree_test.dart by @navaronbracke in [181415](https://github.com/flutter/flutter/pull/181415) +* feature: implementation of tooltips in the `_TestWindowingOwner` and minor bugfixes to the multiple windows example app by @mattkae in [181510](https://github.com/flutter/flutter/pull/181510) +* Remove unnecessary Material import from cupertino/slider_test.dart by @nathannewyen in [180957](https://github.com/flutter/flutter/pull/180957) +* Remove Material library dependency from expansible_test.dart by @Erengun in [181657](https://github.com/flutter/flutter/pull/181657) +* Fix decorated box by @zemanux in [179802](https://github.com/flutter/flutter/pull/179802) +* Make sure that an AnimatedScale doesn't crash in 0x0 environment by @ahmedsameha1 in [181481](https://github.com/flutter/flutter/pull/181481) +* Propagates Overlay's MediaQueryData to OverlayPortal child by @patrickBillingsley in [181579](https://github.com/flutter/flutter/pull/181579) +* Move CheckedModeBanner tests to material and remove Material import from widgets banner_test by @kazbeksultanov in [181261](https://github.com/flutter/flutter/pull/181261) +* Cleanup cross imports by @yeltayev22 in [181807](https://github.com/flutter/flutter/pull/181807) +* Rename "widgetTester" parameter to "tester" in "WidgetTesterCallback" by @GiancarloCante in [180944](https://github.com/flutter/flutter/pull/180944) +* Add `clearError` API to Form and FormFieldState by @Mairramer in [180752](https://github.com/flutter/flutter/pull/180752) +* Improve accessibility contrast for pre-test message by @ashoknarayan in [180469](https://github.com/flutter/flutter/pull/180469) +* Constrain RawAutocomplete options by soft keyboard by @victorsanni in [181930](https://github.com/flutter/flutter/pull/181930) +* macOS: Implement tooltip window controller by @knopp in [180895](https://github.com/flutter/flutter/pull/180895) +* Update doc in foundation to match the style guide by @chunhtai in [181972](https://github.com/flutter/flutter/pull/181972) +* Update Flutter's style guide for dot shorthands and extension methods by @loic-sharma in [181934](https://github.com/flutter/flutter/pull/181934) +* Improve FlWindowMonitor API by @robert-ancell in [181885](https://github.com/flutter/flutter/pull/181885) +* Refactor accessibility guidelines out to widget layer by @chunhtai in [181672](https://github.com/flutter/flutter/pull/181672) +* Bump Dart to 3.10 by @loic-sharma in [174066](https://github.com/flutter/flutter/pull/174066) +* Encourage splitting large test files in testing documentation 2 by @crackedhandle in [182051](https://github.com/flutter/flutter/pull/182051) +* Remove Material import from focus_traversal_test.dart by @navaronbracke in [180994](https://github.com/flutter/flutter/pull/180994) +* Disable hardware keyboard regularity warning by default by @dkwingsmt in [181894](https://github.com/flutter/flutter/pull/181894) +* Updates to style guide by @Piinks in [181985](https://github.com/flutter/flutter/pull/181985) +* [cupertino/dialog.dart] CupertinoPopupSurface: remove bounded parameter from ImageFilterConfig.blur by @davidhicks980 in [182195](https://github.com/flutter/flutter/pull/182195) +* Cross imports cleanups by @navaronbracke in [181611](https://github.com/flutter/flutter/pull/181611) +* Fix deprecation validator message to require leading v by @ashoknarayan in [180467](https://github.com/flutter/flutter/pull/180467) +* Clean up include paths for Fuchsia in the flutter engine by @mbrase in [182031](https://github.com/flutter/flutter/pull/182031) +* Make HCPP upgrading work for vd/tlhc by @gmackall in [181024](https://github.com/flutter/flutter/pull/181024) +* Fix misleading error message for color/decoration conflict (relands #180325) by @dkwingsmt in [181882](https://github.com/flutter/flutter/pull/181882) +* Mark all `IconData` fields as entrypoints to prevent tree shaking its fields by @mkustermann in [181849](https://github.com/flutter/flutter/pull/181849) +* [web] Fix scroll event bubbling in iframes by @flutter-zl in [179703](https://github.com/flutter/flutter/pull/179703) +* [web] Makes Tappable semantics behavior adaptive by @chunhtai in [182167](https://github.com/flutter/flutter/pull/182167) +* Remove Material dependency from semantics_keep_alive_offstage_test.dart by @gbolahan507 in [182211](https://github.com/flutter/flutter/pull/182211) +* remove MaterialApp import from raw_radio_test.dart by @ilyosbek22 in [181721](https://github.com/flutter/flutter/pull/181721) +* Remove Material dependency from transformed_scrollable_test.dart by @gbolahan507 in [182141](https://github.com/flutter/flutter/pull/182141) +* Standardize on Test* widgets in *_tester.dart files by @justinmc in [182395](https://github.com/flutter/flutter/pull/182395) +* Reverts "Standardize on Test* widgets in *_tester.dart files (#182395)" by @auto-submit[bot] in [182406](https://github.com/flutter/flutter/pull/182406) +* [Web] Fix IME and selection by syncing more text styles by @koji-1009 in [180436](https://github.com/flutter/flutter/pull/180436) +* feat: add routes support in TestWidgetsApp by @rkishan516 in [181695](https://github.com/flutter/flutter/pull/181695) +* Do not wait until dispose before removing replaced/popped page by @victorsanni in [182315](https://github.com/flutter/flutter/pull/182315) +* Refactor: Remove material from actions test by @rkishan516 in [181702](https://github.com/flutter/flutter/pull/181702) +* Remove material from interactive_viewer_test.dart by @navaronbracke in [181465](https://github.com/flutter/flutter/pull/181465) +* Handle#6537 first grouped tests by @ahmedsameha1 in [182077](https://github.com/flutter/flutter/pull/182077) +* docs: fix grammar in animation library documentation by @Akshat-Shuklaaa in [182461](https://github.com/flutter/flutter/pull/182461) +* Remove material imports from Inherited Model, Magnifier, SafeArea, UndoHistory, Navigator and Layers test by @rkishan516 in [181709](https://github.com/flutter/flutter/pull/181709) +* Remove material from ticker mode test by @rkishan516 in [181696](https://github.com/flutter/flutter/pull/181696) +* Remove material from Modal barrier tests by @rkishan516 in [181708](https://github.com/flutter/flutter/pull/181708) +* Refactor autofill_group_test.dart to remove Material dependencies by @gbolahan507 in [181903](https://github.com/flutter/flutter/pull/181903) +* [web] Flutter errors should be reported with console.error() by @mdebbar in [178886](https://github.com/flutter/flutter/pull/178886) +* Replace References to `flutter/engine` with `flutter/flutter` by @AbdeMohlbi in [182600](https://github.com/flutter/flutter/pull/182600) +* Correct PerformanceOverlay optionsMask checks and add tests by @Piinks in [182309](https://github.com/flutter/flutter/pull/182309) +* Fix Chat invite link by @Piinks in [182675](https://github.com/flutter/flutter/pull/182675) +* Add fields getter to FormState by @Mairramer in [180815](https://github.com/flutter/flutter/pull/180815) +* Fix textscaler clamp assertion error by @Valansch in [181716](https://github.com/flutter/flutter/pull/181716) +* [web] scroll iOS iframe text input into view by @flutter-zl in [179759](https://github.com/flutter/flutter/pull/179759) +* refactor: remove material in context_menu_controller_test, icon_test, list_wheel_scroll_view_test, media_query_test, platform_menu_bar_test by @rkishan516 in [182697](https://github.com/flutter/flutter/pull/182697) +* Refactor: Remove material from ticker provider test by @rkishan516 in [181697](https://github.com/flutter/flutter/pull/181697) +* Fix typo in assert message by @mdebbar in [182843](https://github.com/flutter/flutter/pull/182843) +* Make sure that an AnimatedSlide doesn't crash in 0x0 environment by @ahmedsameha1 in [181535](https://github.com/flutter/flutter/pull/181535) +* Reland Standardize on Test* widgets in *_tester.dart files by @justinmc in [182632](https://github.com/flutter/flutter/pull/182632) +* Reverts "refactor: remove material in context_menu_controller_test, icon_test, list_wheel_scroll_view_test, media_query_test, platform_menu_bar_test (#182697)" by @auto-submit[bot] in [182879](https://github.com/flutter/flutter/pull/182879) +* Bugfix in the `absorbTicker` method by @nate-thegrate in [181706](https://github.com/flutter/flutter/pull/181706) +* Add toString methods for window positioner classes by @robert-ancell in [182857](https://github.com/flutter/flutter/pull/182857) +* Make positionInlineChildren assert much clearer by @BrainLUX in [182093](https://github.com/flutter/flutter/pull/182093) +* Remove `ExtendSelectionByPageIntent` by @Renzo-Olivares in [182642](https://github.com/flutter/flutter/pull/182642) +* feat: add few required properties to test widgets app by @rkishan516 in [182805](https://github.com/flutter/flutter/pull/182805) +* `WidgetStatesConstraint` as a mixin by @nate-thegrate in [181704](https://github.com/flutter/flutter/pull/181704) +* framework: Use a super-parameter in several missed cases by @srawlins in [182580](https://github.com/flutter/flutter/pull/182580) +* Make sure that a StretchingOverscrollIndicator doesn't crash when it … by @ahmedsameha1 in [182499](https://github.com/flutter/flutter/pull/182499) +* Describe implications of tree-status and Google Testing for PRs by @flar in [182916](https://github.com/flutter/flutter/pull/182916) +* Fix RawAutocomplete crash when options are hidden by @mbcorona in [182785](https://github.com/flutter/flutter/pull/182785) +* Use null-aware elements in widgets/routes.dart by @brahim-guaali in [181242](https://github.com/flutter/flutter/pull/181242) +* Replace an instance of flutter/engine with flutter/flutter by @AbdeMohlbi in [182655](https://github.com/flutter/flutter/pull/182655) +* Fix false positives for hit test misses in flutter_test by @O-Hannonen in [180856](https://github.com/flutter/flutter/pull/180856) +* Resolve inconsistency with SchedulerBinding.scheduleTask usage recomm… by @ahmedsameha1 in [182531](https://github.com/flutter/flutter/pull/182531) +* Add test for WindowPositioner.toString by @robert-ancell in [182906](https://github.com/flutter/flutter/pull/182906) +* [Impeller] Use bilinear filtering for non-uniform scaled text by @sero583 in [182224](https://github.com/flutter/flutter/pull/182224) +* Reland: remove material in context_menu_controller_test, icon_test, list_wheel_scroll_view_test, media_query_test, platform_menu_bar_test by @rkishan516 in [182891](https://github.com/flutter/flutter/pull/182891) +* [Shortcuts] Improve focus node debug labels by @loic-sharma in [181834](https://github.com/flutter/flutter/pull/181834) +* [Impeller] Remove shared rendering data from TextFrame by @flar in [182886](https://github.com/flutter/flutter/pull/182886) +* [framework] Fix Text.semanticsIdentifier being absorbed by ancestor nodes by @flutter-zl in [181795](https://github.com/flutter/flutter/pull/181795) +* Add desktop review teams by @loic-sharma in [182972](https://github.com/flutter/flutter/pull/182972) +* Make TextDecoration final and unify maskValue across platforms by @SpiralMomentum in [183070](https://github.com/flutter/flutter/pull/183070) +* Improve FFI code for windowing by @robert-ancell in [183098](https://github.com/flutter/flutter/pull/183098) +* Roll pub packages by @flutter-pub-roller-bot in [183133](https://github.com/flutter/flutter/pull/183133) +* [two_dimensional_scrollables] Fix tableview janks when first row/column pinned by @wangfeihang in [180563](https://github.com/flutter/flutter/pull/180563) +* Add await to callsites of BasicMessageChannel.send by @victorsanni in [182868](https://github.com/flutter/flutter/pull/182868) +* Add vmservices for accessibilityEvaluation by @chunhtai in [182791](https://github.com/flutter/flutter/pull/182791) +* [Impeller] Update comments to reflect new info about 2-pass rendering by @flar in [183050](https://github.com/flutter/flutter/pull/183050) +* refactor: remove material in pop_scope_test, route_notification_message_test, two_dimensional_utils, two_dimensional_viewport_test by @rkishan516 in [182699](https://github.com/flutter/flutter/pull/182699) +* refactor: remove material in reorderable_list_test, scroll_notification_test, scroll_physics_test, shortcuts_test, sliver_floating_header_test, snapshot_widget_test by @rkishan516 in [182698](https://github.com/flutter/flutter/pull/182698) +* Fixes FocusHighlightMode on Android when typing in software keyboard by @romaingyh in [180753](https://github.com/flutter/flutter/pull/180753) +* Re-specify the ndk version in various test apps, to prevent ndk download by @gmackall in [183134](https://github.com/flutter/flutter/pull/183134) +* Add `UnlabaledLeafNodeEvaluation` by @QuncCccccc in [182872](https://github.com/flutter/flutter/pull/182872) +* refactor: remove material from widget_inspector_test, sliver_cross_axis_group_test, editable_text_show_on_screen_test, scrollable_fling_test, selection_container_test by @rkishan516 in [182702](https://github.com/flutter/flutter/pull/182702) +* Add AI contribution guidelines by @stuartmorgan-g in [183326](https://github.com/flutter/flutter/pull/183326) +* Revert "Make HCPP upgrading work for vd/tlhc (#181024)" by @camsim99 in [183310](https://github.com/flutter/flutter/pull/183310) +* refactor: remove material import from animated_cross_fade, physical_model_test, pinned_header_sliver_test, spell_check_test by @rkishan516 in [183234](https://github.com/flutter/flutter/pull/183234) +* Add await or ignore lint to flutter_driver unawaited callsites by @victorsanni in [183334](https://github.com/flutter/flutter/pull/183334) +* Adds geometry dirty nodes by @chunhtai in [180375](https://github.com/flutter/flutter/pull/180375) +* refactor: remove material from baseline_test, slivers_test by @rkishan516 in [183367](https://github.com/flutter/flutter/pull/183367) +* refactor: remove material imports from system_context_menu_test, table_test by @rkishan516 in [183368](https://github.com/flutter/flutter/pull/183368) +* Standardize review timeline guidance by @stuartmorgan-g in [183465](https://github.com/flutter/flutter/pull/183465) +* Reapply "Make HCPP upgrading work for vd/tlhc (#181024)" (#183310) by @gmackall in [183360](https://github.com/flutter/flutter/pull/183360) +* Add scrollCacheExtent to PageView by @koji-1009 in [180411](https://github.com/flutter/flutter/pull/180411) +* [integration_test]UIScene Migration by @okorohelijah in [182631](https://github.com/flutter/flutter/pull/182631) +* [ios][engine] Fix keyboard flicker when switching text fields by @koji-1009 in [182661](https://github.com/flutter/flutter/pull/182661) +* Adding the SatelliteWindowController interface to `_window.dart` by @mattkae in [182903](https://github.com/flutter/flutter/pull/182903) +* refactor: remove material import from sliver_resizing_header_test and sliver_prototype_item_extent_test by @rkishan516 in [183562](https://github.com/flutter/flutter/pull/183562) +* Fix PinnedHeaderSliver semantics focus capture by @manu-sncf in [179023](https://github.com/flutter/flutter/pull/179023) +* Made complex_layout_scroll_perf explicitly skia by @gaaclarke in [183663](https://github.com/flutter/flutter/pull/183663) +* Fix RouteAware.didPushNext documentation inaccuracy by @ishaquehassan in [183097](https://github.com/flutter/flutter/pull/183097) +* [flutter_tools] Avoid File.exists and File.stat, as per enforced lint rule by @srawlins in [183463](https://github.com/flutter/flutter/pull/183463) +* Adds macos impeller complex layout performance test by @gaaclarke in [183669](https://github.com/flutter/flutter/pull/183669) +* Fix widget inspector control layout and add safe area regression test by @gktirkha in [180789](https://github.com/flutter/flutter/pull/180789) +* Remove obsolete null checks from style guide by @nate-thegrate in [181703](https://github.com/flutter/flutter/pull/181703) +* Handle#6537 second grouped test by @ahmedsameha1 in [182529](https://github.com/flutter/flutter/pull/182529) +* (Test cross-imports) Remove legacy Material import from sliver_constraints_test by @mayanksharma9 in [183351](https://github.com/flutter/flutter/pull/183351) +* Fix url to the Flutter System Overview diagram. by @algor in [183680](https://github.com/flutter/flutter/pull/183680) +* [152588] Fix Scrollable being too eager to respond to pointer signals by @O-Hannonen in [183302](https://github.com/flutter/flutter/pull/183302) +* Allow windows to be created undecorated by @robert-ancell in [179859](https://github.com/flutter/flutter/pull/179859) +* Add non-text color contrast evaluation for a11y by @QuncCccccc in [183569](https://github.com/flutter/flutter/pull/183569) +* Update the windowing docs per the latest wording found while doing Satellites by @mattkae in [183748](https://github.com/flutter/flutter/pull/183748) +* Roll pub packages by @flutter-pub-roller-bot in [183895](https://github.com/flutter/flutter/pull/183895) +* Use Color.a instead of Color.alpha to assert the opacity of the color… by @ahmedsameha1 in [184003](https://github.com/flutter/flutter/pull/184003) +* Mark `IconData` `final` and `@mustBeConst` by @dcharkes in [181345](https://github.com/flutter/flutter/pull/181345) +* Fix RenderStack's documentation by @AbdeMohlbi in [183822](https://github.com/flutter/flutter/pull/183822) +* [flutter_goldens] Remove dead check on null being in a list of non-nullables by @srawlins in [183938](https://github.com/flutter/flutter/pull/183938) +* SelectableRegion should passthrough constraints to child unmodified by @Renzo-Olivares in [184083](https://github.com/flutter/flutter/pull/184083) +* Add SensitiveContent widget sample code by @huycozy in [183846](https://github.com/flutter/flutter/pull/183846) +* Add widget of the week link in SensitiveContent documentation by @ValentinVignal in [183972](https://github.com/flutter/flutter/pull/183972) +* Pipes ScrollCacheExtent through more scroll views by @chunhtai in [184078](https://github.com/flutter/flutter/pull/184078) +* Updates scroll cache extent doc by @chunhtai in [184142](https://github.com/flutter/flutter/pull/184142) +* skip interactive keyboard tests by @okorohelijah in [183757](https://github.com/flutter/flutter/pull/183757) +* flutter_driver: remove @internal annotation on field by @kevmoo in [184235](https://github.com/flutter/flutter/pull/184235) +* feat(web): unify CanvasKit and Skwasm garbage collection by @harryterkelsen in [183867](https://github.com/flutter/flutter/pull/183867) +* Add alwaysSizeToContent argument to Overlay. by @knopp in [182009](https://github.com/flutter/flutter/pull/182009) +* fixes crash when invisible semantics nodes dropped from semantics tree by @chunhtai in [184226](https://github.com/flutter/flutter/pull/184226) +* Add title evaluation by @QuncCccccc in [184084](https://github.com/flutter/flutter/pull/184084) +* [web] Fix autofill in iOS 26 Safari by @mdebbar in [182024](https://github.com/flutter/flutter/pull/182024) +* Handle#6537 third grouped tests by @ahmedsameha1 in [183059](https://github.com/flutter/flutter/pull/183059) +* Fix layout overflowed in small screen in SensitiveContent's example by @huycozy in [184179](https://github.com/flutter/flutter/pull/184179) +* Update style guide by @Piinks in [184478](https://github.com/flutter/flutter/pull/184478) +* Add await or ignore to future-returning methods defined in Dart SDK by @victorsanni in [184229](https://github.com/flutter/flutter/pull/184229) +* Implement popup windows for macOS by @knopp in [182371](https://github.com/flutter/flutter/pull/182371) +* Implement tooltip windows on Linux by @robert-ancell in [182348](https://github.com/flutter/flutter/pull/182348) +* Handle events without a device by @robert-ancell in [184163](https://github.com/flutter/flutter/pull/184163) +* Reduce number of mallocs in FFI call by @robert-ancell in [184166](https://github.com/flutter/flutter/pull/184166) +* Remove isSizedToContent from _window_linux.dart. by @knopp in [184506](https://github.com/flutter/flutter/pull/184506) +* Fix line breaks being lost when copying after selection gesture in SelectableRegion by @Renzo-Olivares in [184421](https://github.com/flutter/flutter/pull/184421) +* [Dot shorthands] Migrate examples/api/lib/cupertino by @loic-sharma in [183964](https://github.com/flutter/flutter/pull/183964) +* refactor: remove material from list_view_viewporting_test and page_forward_transitions_test by @rkishan516 in [183564](https://github.com/flutter/flutter/pull/183564) +* refactor: remove material from color and image filter test by @rkishan516 in [183563](https://github.com/flutter/flutter/pull/183563) +* Keep last character obscured when toggling obscureText by @TrangLeQuynh in [183488](https://github.com/flutter/flutter/pull/183488) +* Use the WindowRegistry in the multiple_windows example app by @mattkae in [184579](https://github.com/flutter/flutter/pull/184579) +* Add Support For Built-in Kotlin by @jesswrd in [184227](https://github.com/flutter/flutter/pull/184227) +* Revert "Add Support For Built-in Kotlin (#184227)" by @Renzo-Olivares in [184739](https://github.com/flutter/flutter/pull/184739) +* [Semantics] clarify Android header docs by @mayanksharma9 in [183573](https://github.com/flutter/flutter/pull/183573) +* [Dot shorthands] Migrate examples/api/lib/widgets by @loic-sharma in [183965](https://github.com/flutter/flutter/pull/183965) +* Code freeze workflow by @Piinks in [184246](https://github.com/flutter/flutter/pull/184246) +* [Re-land] Add Support For Built-in Kotlin by @jesswrd in [184745](https://github.com/flutter/flutter/pull/184745) +* Refactor: remove material from absorb_ponter_test, container_test, lookup_boundary_test, page_view_test, router_test, semantics_clipping_test, semantics_merge_test, shadow_test, text_test by @rkishan516 in [183309](https://github.com/flutter/flutter/pull/183309) +* Even more awaits v2 by @victorsanni in [184552](https://github.com/flutter/flutter/pull/184552) +* Remove navigator_utils cross-imports from cupertino tests by @xfce0 in [184282](https://github.com/flutter/flutter/pull/184282) +* Add await or ignore lint to invokeMethod callsites by @victorsanni in [182870](https://github.com/flutter/flutter/pull/182870) +* [Dot shorthands] Migrate examples/api/test by @loic-sharma in [183966](https://github.com/flutter/flutter/pull/183966) +* Warn about the use of TestSemantics by @justinmc in [184369](https://github.com/flutter/flutter/pull/184369) +* [CP-beta]Fix an ordering dependency in the services/system_chrome_test.dart test suite by @flutteractionsbot in [185104](https://github.com/flutter/flutter/pull/185104) + +### Material + +* Fix typo in dropdown_menu.dart by @Koichi5 in [180172](https://github.com/flutter/flutter/pull/180172) +* [A11y ] Add `clearSemantics`in table by @hannah-hyj in [180665](https://github.com/flutter/flutter/pull/180665) +* Add TabBar API example for scroll notification integration by @huycozy in [180728](https://github.com/flutter/flutter/pull/180728) +* Fix RangeSlider dragged cursor handling. by @ksokolovskyi in [179988](https://github.com/flutter/flutter/pull/179988) +* Update localizations from translation console by @QuncCccccc in [180997](https://github.com/flutter/flutter/pull/180997) +* clean up usages of resetXyz for TestFlutterView by @navaronbracke in [180840](https://github.com/flutter/flutter/pull/180840) +* Fix vertical SegmentedButton not filling available width under bounded constraints by @Mairramer in [180701](https://github.com/flutter/flutter/pull/180701) +* fix: clip ink highlights in NavigationDrawer when footer is present by @ikramhasan in [181050](https://github.com/flutter/flutter/pull/181050) +* Add leadingIndex to CarouselController and onItemChanged to CarouselView by @Mairramer in [180667](https://github.com/flutter/flutter/pull/180667) +* [Material] update hourFormat to use Dart 3 switch expression by @Enderjua in [181041](https://github.com/flutter/flutter/pull/181041) +* Fixes Typo in codebase by @srivats22 in [181256](https://github.com/flutter/flutter/pull/181256) +* Broaden the applicability of `Color` fix_data rules from flutter/painting.dart by @b-luk in [181093](https://github.com/flutter/flutter/pull/181093) +* Revert DropdownMenu non-nullable breaking change by @Gustl22 in [181074](https://github.com/flutter/flutter/pull/181074) +* Add bottom navigation bar item semantics label by @Lilian-C in [180577](https://github.com/flutter/flutter/pull/180577) +* Reset TextFormField to initial value after state change by @Mairramer in [181199](https://github.com/flutter/flutter/pull/181199) +* [Material] modernize Typography._withPlatform with Dart 3 switch expression by @Enderjua in [181398](https://github.com/flutter/flutter/pull/181398) +* Add `alignment` to `SizeTransition` by @IvoneDjaja in [177895](https://github.com/flutter/flutter/pull/177895) +* Fix Range Slider issue where indescrete ranges lead to out of range r… by @chris-prenissl in [181082](https://github.com/flutter/flutter/pull/181082) +* [Material] modernize time picker components with Dart 3 switch expressions by @Enderjua in [181356](https://github.com/flutter/flutter/pull/181356) +* feat: add RoundedSuperellipseInputBorder by @rkishan516 in [177220](https://github.com/flutter/flutter/pull/177220) +* Fix `todayBorder` todayBorder color is incorrectly overridden by `todayForegroundColor` in CalendarDatePicker by @huycozy in [178792](https://github.com/flutter/flutter/pull/178792) +* test: Improve DropdownMenuFormField tests by @Gustl22 in [181369](https://github.com/flutter/flutter/pull/181369) +* Send statusBarTouch events via dedicated messages by @LongCatIsLooong in [179643](https://github.com/flutter/flutter/pull/179643) +* [material/menu_anchor.dart] Add animations to MenuAnchor. by @davidhicks980 in [176494](https://github.com/flutter/flutter/pull/176494) +* Add isDark, isLight, and isSystem getters to ThemeMode by @Turskyi in [181475](https://github.com/flutter/flutter/pull/181475) +* Deprecate onReorder callback by @navaronbracke in [178242](https://github.com/flutter/flutter/pull/178242) +* Add `TestTextField` and migrate tests by @Renzo-Olivares in [180494](https://github.com/flutter/flutter/pull/180494) +* 180162 fix radio list tile and switch list tile accept widget states controller by @AnishTiwari5077 in [180367](https://github.com/flutter/flutter/pull/180367) +* Use null-aware spread in material/app.dart by @brahim-guaali in [181586](https://github.com/flutter/flutter/pull/181586) +* Use null-aware elements in material/dialog.dart by @brahim-guaali in [181244](https://github.com/flutter/flutter/pull/181244) +* Remove material from slivers_appbar_floating_pinned_test.dart + slivers_appbar_stretch_test.dart + sliver_persistent_header_test.dart + slivers_appbar_floating_test.dart by @navaronbracke in [181469](https://github.com/flutter/flutter/pull/181469) +* Reduce reliance on Material in page_transitions_test.dart by @navaronbracke in [181467](https://github.com/flutter/flutter/pull/181467) +* Remove material from scrollable_helpers_test.dart by @navaronbracke in [181460](https://github.com/flutter/flutter/pull/181460) +* feat: Pass parameters from DropdownMenuFormField to DropDownMenu by @Gustl22 in [181373](https://github.com/flutter/flutter/pull/181373) +* [Material] Remove Material import from backdrop_filter_test.dart widget tests by @kazbeksultanov in [181386](https://github.com/flutter/flutter/pull/181386) +* [cupertino.dart] Implement CupertinoMenuAnchor and CupertinoMenuItem using RawMenuAnchor by @davidhicks980 in [174695](https://github.com/flutter/flutter/pull/174695) +* Reverts "[cupertino.dart] Implement CupertinoMenuAnchor and CupertinoMenuItem using RawMenuAnchor (#174695)" by @auto-submit[bot] in [182010](https://github.com/flutter/flutter/pull/182010) +* fix: OutlineInputBorder not respecting BorderSide stroke alignment by @ikramhasan in [180487](https://github.com/flutter/flutter/pull/180487) +* Introduce ScrollCacheExtent and also fixes unbound shrinkwrap cache ex… by @chunhtai in [181092](https://github.com/flutter/flutter/pull/181092) +* refactor: migrate CupertinoPageTransitionsBuilder to cupertino folder by @rkishan516 in [179776](https://github.com/flutter/flutter/pull/179776) +* Update date localization by @QuncCccccc in [181685](https://github.com/flutter/flutter/pull/181685) +* Reverts "Update date localization (#181685)" by @auto-submit[bot] in [182182](https://github.com/flutter/flutter/pull/182182) +* Reland - Update date localization by @QuncCccccc in [182189](https://github.com/flutter/flutter/pull/182189) +* Revert "Send statusBarTouch events via dedicated messages (#179643)" by @vashworth in [182223](https://github.com/flutter/flutter/pull/182223) +* Enhance the Stepper widget by adding customizable header and content padding by @safwanidrees in [180257](https://github.com/flutter/flutter/pull/180257) +* [Material] modernize legacy switch statements to expressions across multiple files by @Enderjua in [181427](https://github.com/flutter/flutter/pull/181427) +* Preparation to add contentTextStyle flag to SimpleDialog. by @chingjun in [182200](https://github.com/flutter/flutter/pull/182200) +* Fix cross imports for all Cupertino tests by @navaronbracke in [181634](https://github.com/flutter/flutter/pull/181634) +* Add await to tester.pump callsites by @victorsanni in [182398](https://github.com/flutter/flutter/pull/182398) +* Reverts "Fix cross imports for all Cupertino tests (#181634)" by @auto-submit[bot] in [182404](https://github.com/flutter/flutter/pull/182404) +* [Reland] Cupertino cross imports by @navaronbracke in [182416](https://github.com/flutter/flutter/pull/182416) +* Add contentTextStyle support to SimpleDialog by @777genius in [178824](https://github.com/flutter/flutter/pull/178824) +* [a11y] RangeSlider mouse interaction should change keyboard focus by @hannah-hyj in [182185](https://github.com/flutter/flutter/pull/182185) +* Clean up cross imports in single_child_scroll_view_test.dart, decorated_sliver_test.dart, draggable_scrollable_sheet_test.dart by @navaronbracke in [181613](https://github.com/flutter/flutter/pull/181613) +* Allow TabBar to receive a TabBarScrollController by @navaronbracke in [180389](https://github.com/flutter/flutter/pull/180389) +* [web] Pass form validation errors to screen readers via aria-description by @flutter-zl in [180556](https://github.com/flutter/flutter/pull/180556) +* Fixing ExpansionTile expandedAlignment not Accepts AlignmentGeometry … by @devnoaman in [180814](https://github.com/flutter/flutter/pull/180814) +* Fix(Material): DateRangePicker ignores DatePickerTheme.dayShape by @akhil-ge0rge in [181658](https://github.com/flutter/flutter/pull/181658) +* Move SelectionArea web test from widgets to material folder by @gbolahan507 in [181951](https://github.com/flutter/flutter/pull/181951) +* Add RawTooltip.ignorePointer by @victorsanni in [182527](https://github.com/flutter/flutter/pull/182527) +* Remove Material import from scroll_view_test.dart by @navaronbracke in [181281](https://github.com/flutter/flutter/pull/181281) +* Reland #179643, only scroll hit-testable primary scroll views on status bar tap by @LongCatIsLooong in [182391](https://github.com/flutter/flutter/pull/182391) +* Add cupertino docimports for CupertinoPageTransitionsBuilder and fix typos by @victorsanni in [182685](https://github.com/flutter/flutter/pull/182685) +* Shortcircuit if Tooltip message and richMessage are empty by @victorsanni in [182524](https://github.com/flutter/flutter/pull/182524) +* Carousel: Migration from Scrollable+Viewport to CustomScrollView by @Mairramer in [182475](https://github.com/flutter/flutter/pull/182475) +* Use AnimationStyle curve and reverseCurve in ModalBottomSheet animation by @Mairramer in [181403](https://github.com/flutter/flutter/pull/181403) +* Add WidgetStatesController support to ExpansionTile by @iamvikashtiwari in [181238](https://github.com/flutter/flutter/pull/181238) +* Factor out unnecessary `assert`s by @nate-thegrate in [182042](https://github.com/flutter/flutter/pull/182042) +* Updates MenuAnchor to respect software keyboard by @patrickBillingsley in [180975](https://github.com/flutter/flutter/pull/180975) +* Remove some instances of useMaterial3: true by @AbdeMohlbi in [182944](https://github.com/flutter/flutter/pull/182944) +* `SizedBox.square()` by @nate-thegrate in [182731](https://github.com/flutter/flutter/pull/182731) +* [A11y] in calendar date picker, remove SemanticsService.sendAnnouncement usage for android. by @hannah-hyj in [182918](https://github.com/flutter/flutter/pull/182918) +* Add warning when there is a widget with color between `Material` and `ListTile` by @QuncCccccc in [181402](https://github.com/flutter/flutter/pull/181402) +* Eliminate rebuilds for Scaffold FAB animation by @nate-thegrate in [182331](https://github.com/flutter/flutter/pull/182331) +* Add await to flutter_test callsites by @victorsanni in [182983](https://github.com/flutter/flutter/pull/182983) +* Windowing implementation of `showDialog` that uses a native desktop window to display the content by @mattkae in [181861](https://github.com/flutter/flutter/pull/181861) +* Add fallbackColor for PredictiveBackPageTransitionBuilder and PredictiveBackFullscreenPageTransitionBuilder by @victorsanni in [182690](https://github.com/flutter/flutter/pull/182690) +* Add displayCornerRadii support to predictive back transitions. by @ksokolovskyi in [181326](https://github.com/flutter/flutter/pull/181326) +* Remove material from scrollable_test.dart by @navaronbracke in [181429](https://github.com/flutter/flutter/pull/181429) +* [material/menu_anchor.dart] Ensure positioned menus always begin animating at the target position by @davidhicks980 in [182932](https://github.com/flutter/flutter/pull/182932) +* Add awaits to dev/ callsites by @victorsanni in [183479](https://github.com/flutter/flutter/pull/183479) +* Fix reselection issue after the text is cleared by @QuncCccccc in [183545](https://github.com/flutter/flutter/pull/183545) +* Add await to more flutter/flutter callsites by @victorsanni in [183413](https://github.com/flutter/flutter/pull/183413) +* Add awaits to flutter/test callsites by @victorsanni in [183487](https://github.com/flutter/flutter/pull/183487) +* Add mainAxisAlignment to NavigationRail by @mbcorona in [183514](https://github.com/flutter/flutter/pull/183514) +* Framework: Improve DropdownButton selectedItemBuilder assertion by @mbcorona in [183732](https://github.com/flutter/flutter/pull/183732) +* Add a Clarification for the docs of suggestionsBuilder of SearchAnchor by @ahmedsameha1 in [183106](https://github.com/flutter/flutter/pull/183106) +* Fixes animation glitch into bottom sheet by @Mairramer in [183303](https://github.com/flutter/flutter/pull/183303) +* [Slider] Refactor test "Value indicator appears when it should" by @dkwingsmt in [183143](https://github.com/flutter/flutter/pull/183143) +* Fix Semantics expanded state not updating in PopupMenuButton and DropdownButton by @AhmedLSayed9 in [183475](https://github.com/flutter/flutter/pull/183475) +* Replace BorderRadius.circular with const BorderRadius.all and update documentation examples by @BrainLUX in [183074](https://github.com/flutter/flutter/pull/183074) +* Add assert for mutually exclusive errorBuilder and errorText by @muradhossin in [183901](https://github.com/flutter/flutter/pull/183901) +* Add scrollPadding property to DropdownMenu by @ishaquehassan in [183109](https://github.com/flutter/flutter/pull/183109) +* [Slider] Remove value indicator painter when animation is dismissed by @dkwingsmt in [182991](https://github.com/flutter/flutter/pull/182991) +* Refactor layout dimensions by @Piinks in [184066](https://github.com/flutter/flutter/pull/184066) +* [Dot shorthands] Migrate examples/api/lib/material by @loic-sharma in [183963](https://github.com/flutter/flutter/pull/183963) +* feat: add infinite carousel support by @rkishan516 in [175710](https://github.com/flutter/flutter/pull/175710) +* For ShapeBorder instances with preferPaintInterior=true, use paintInterior rather than drawing the path from getOuterPath. by @b-luk in [184258](https://github.com/flutter/flutter/pull/184258) +* Reland "Fix Slider semantics node size" with some changes by @hannah-hyj in [184168](https://github.com/flutter/flutter/pull/184168) +* Update TabBar documentation to clarify indicatorWeight behavior by @saurabh-mirajkar in [184104](https://github.com/flutter/flutter/pull/184104) +* Even more awaits by @victorsanni in [184042](https://github.com/flutter/flutter/pull/184042) +* Revert "Even more awaits (#184042)" by @gaaclarke in [184429](https://github.com/flutter/flutter/pull/184429) +* Add bottom safe area padding to licenses package license page by @sysint64 in [182425](https://github.com/flutter/flutter/pull/182425) +* [ios] Add opt-in inline prediction text input support by @nikb7 in [183650](https://github.com/flutter/flutter/pull/183650) +* Replace usages of `MediaQuery.of(context).property` with `MediaQuery.propertyOf(context)` by @AbdeMohlbi in [184211](https://github.com/flutter/flutter/pull/184211) +* Remove sliver_test_utils cross-import from sliver_app_bar_test by @Sanaullah49 in [184193](https://github.com/flutter/flutter/pull/184193) +* Reland "Even more awaits" by @victorsanni in [184467](https://github.com/flutter/flutter/pull/184467) +* Remove live_text_utils cross-imports from material and cupertino tests by @xfce0 in [184517](https://github.com/flutter/flutter/pull/184517) +* [A11y] Allow percentage strings like "50%" as `SemanticsValue` for `ProgressIndicator` by @hannah-hyj in [183670](https://github.com/flutter/flutter/pull/183670) +* Use full goto.google.com hostname for go/ links by @b-luk in [184679](https://github.com/flutter/flutter/pull/184679) +* [widgets/raw_menu_anchor.dart] Always call onClose and onCloseRequested on descendants before parent. by @davidhicks980 in [182357](https://github.com/flutter/flutter/pull/182357) +* Update localization from translation console by @QuncCccccc in [184742](https://github.com/flutter/flutter/pull/184742) +* [cupertino.dart] Implement CupertinoMenuAnchor and CupertinoMenuItem using RawMenuAnchor by @davidhicks980 in [182036](https://github.com/flutter/flutter/pull/182036) +* Remove editable_text_utils cross-imports from material and cupertino … by @xfce0 in [184519](https://github.com/flutter/flutter/pull/184519) +* Add more error handling to unawaited callsites by @victorsanni in [184526](https://github.com/flutter/flutter/pull/184526) + +### iOS + +* Fix iOS xattr removal to clear all extended attributes by @Saqib198 in [180355](https://github.com/flutter/flutter/pull/180355) +* Reverts "Fix iOS xattr removal to clear all extended attributes (#180355)" by @auto-submit[bot] in [180709](https://github.com/flutter/flutter/pull/180709) +* Implement macOS wide gamut (Display P3) support by @westito in [181769](https://github.com/flutter/flutter/pull/181769) +* Intercept UIScene device log and print a guided warning by @vashworth in [181515](https://github.com/flutter/flutter/pull/181515) +* Give guided error message when CocoaPod and SwiftPM dependency conflicts by @vashworth in [182392](https://github.com/flutter/flutter/pull/182392) +* Remove specific iOS extended attributes to fix code signing by @Saqib198 in [180710](https://github.com/flutter/flutter/pull/180710) +* Remove FlutterFramework app migration by @vashworth in [182100](https://github.com/flutter/flutter/pull/182100) +* flutter#182361 Fix delegate copy on plugins init by @eMxPi in [182362](https://github.com/flutter/flutter/pull/182362) +* Re-add extended attribute removed by SwiftPM by @vashworth in [183011](https://github.com/flutter/flutter/pull/183011) +* Exclude arm64 if any dependencies do and print warning when using Xcode 26 by @vashworth in [182913](https://github.com/flutter/flutter/pull/182913) +* Add missing mutation-safe delegate iteration and use idomatic syntax by @vashworth in [183018](https://github.com/flutter/flutter/pull/183018) +* Improve SwiftPM minimum platform mismatch diagnostics by @MohammedTarigg in [182375](https://github.com/flutter/flutter/pull/182375) +* Add warning for plugins not migrated to UIScene by @okorohelijah in [182826](https://github.com/flutter/flutter/pull/182826) +* [iOS] Skip gesture recognizer reset workaround on iOS 26+ by @okorohelijah in [183186](https://github.com/flutter/flutter/pull/183186) +* Implements `ClipRSuperellipse` on backdrop filter on platform view by @Hari-07 in [182643](https://github.com/flutter/flutter/pull/182643) +* Roll Clang to 80743bd43fd5b38fedc503308e7a652e23d3ec93 by @jason-simmons in [182919](https://github.com/flutter/flutter/pull/182919) +* Adds switch for sdf rendering plus golden tests by @gaaclarke in [183543](https://github.com/flutter/flutter/pull/183543) +* [ios][pv]fix admob banner scrollable on ios 18.2 by @hellohuanlin in [183274](https://github.com/flutter/flutter/pull/183274) +* Codesign XCFrameworks for darwin add to app by @vashworth in [183399](https://github.com/flutter/flutter/pull/183399) +* Add ability to access plugins from other plugins by @fuzzybinary in [182753](https://github.com/flutter/flutter/pull/182753) +* Filter out .appex extension processes from LLDB attachment on iOS 17+ by @Silfalion in [183724](https://github.com/flutter/flutter/pull/183724) +* Remove workaround for fake impeller images in iOS simulator. by @eyebrowsoffire in [184264](https://github.com/flutter/flutter/pull/184264) +* Warn about slow SwiftPM downloads and centralize SwiftPM cache by @vashworth in [183747](https://github.com/flutter/flutter/pull/183747) +* Add plugin version to SwiftPM package symlink directory by @vashworth in [183668](https://github.com/flutter/flutter/pull/183668) +* Add integration scripts and tools for SwiftPM add to app by @vashworth in [184204](https://github.com/flutter/flutter/pull/184204) +* Fix invisible accessibility element before scroll view by @LouiseHsu in [184155](https://github.com/flutter/flutter/pull/184155) +* Manually stop and continue LLDB breakpoints on Xcode 26.4+ by @vashworth in [184690](https://github.com/flutter/flutter/pull/184690) +* [CP-beta]Disable async mode with LLDB by @vashworth in [185102](https://github.com/flutter/flutter/pull/185102) +* [CP-beta]Fix killing wrong xcrun command by @flutteractionsbot in [185097](https://github.com/flutter/flutter/pull/185097) +* [CP-beta]Only use LLDB breakpoint in debug mode by @flutteractionsbot in [185343](https://github.com/flutter/flutter/pull/185343) +* [CP-beta][SwiftPM] Enable package resolution on xcodebuild commands by @flutteractionsbot in [185746](https://github.com/flutter/flutter/pull/185746) + +### Android + +* Re-prioritize pipeline compile jobs and perform them eagerly instead of waiting. by @chinmaygarde in [180022](https://github.com/flutter/flutter/pull/180022) +* Improve code quality in `BinaryMessenger.java` by @AbdeMohlbi in [180733](https://github.com/flutter/flutter/pull/180733) +* Fix `documentation member not recognized` because of missing import in `FlutterEngine.java` by @AbdeMohlbi in [180731](https://github.com/flutter/flutter/pull/180731) +* Update `PlatformPlugin` to not call `setStatusBarColor`, `setNavigationBarColor`, `setNavigationBarDividerColor` when disabled by @AbdeMohlbi in [180061](https://github.com/flutter/flutter/pull/180061) +* Removes `RequiresApi 23` by @AbdeMohlbi in [180629](https://github.com/flutter/flutter/pull/180629) +* Fix hcpp flicker when scrolling off/on screen by @gmackall in [181009](https://github.com/flutter/flutter/pull/181009) +* Remove unnecessary `String.valueOf` in `FlutterJNI.java` by @AbdeMohlbi in [180995](https://github.com/flutter/flutter/pull/180995) +* Remove unnecessary `Integer.toString` in `FlutterShellArgs.java` by @AbdeMohlbi in [180993](https://github.com/flutter/flutter/pull/180993) +* Improve code quality in `ViewUtils.java` by @AbdeMohlbi in [181147](https://github.com/flutter/flutter/pull/181147) +* Remove unused `UrlStringAttribute` class by @AbdeMohlbi in [181146](https://github.com/flutter/flutter/pull/181146) +* Improve code quality in `PlatformViewsController.java` by @AbdeMohlbi in [181338](https://github.com/flutter/flutter/pull/181338) +* Remove unused `ActivityLifecycleListener` class by @AbdeMohlbi in [181406](https://github.com/flutter/flutter/pull/181406) +* Fix Gradle path in Android Platform Embedder README. by @ksokolovskyi in [181501](https://github.com/flutter/flutter/pull/181501) +* [Reland] Don't strip symbols from `libapp.so` on android by default by @gmackall in [181275](https://github.com/flutter/flutter/pull/181275) +* Remove unused code paths in `PlatformViewsController.java` by @AbdeMohlbi in [181393](https://github.com/flutter/flutter/pull/181393) +* [ Tool / Engine ] Cleanup x86 references by @bkonyi in [181152](https://github.com/flutter/flutter/pull/181152) +* Reverts "[ Tool / Engine ] Cleanup x86 references (#181152)" by @auto-submit[bot] in [181643](https://github.com/flutter/flutter/pull/181643) +* Ensure content-sizing resize is run on UI thread by @mboetger in [181686](https://github.com/flutter/flutter/pull/181686) +* [Android] Add predictive back support for FlutterFragment and FlutterFragmentActivity by @moko256 in [181124](https://github.com/flutter/flutter/pull/181124) +* Add exception to log message in ContentSizingFlag.java by @reidbaker in [181813](https://github.com/flutter/flutter/pull/181813) +* [Android] Add mechanism for setting Android engine flags via Android manifest (take 2) by @camsim99 in [181632](https://github.com/flutter/flutter/pull/181632) +* [a11y][android] Set new CheckState APIs for android API 36 by @hannah-hyj in [182113](https://github.com/flutter/flutter/pull/182113) +* fix(android): add null check for textInputPlugin in FlutterView by @LailaiMaster in [180386](https://github.com/flutter/flutter/pull/180386) +* Ensure resize listener is not added if content sizing is not turned on by @mboetger in [182168](https://github.com/flutter/flutter/pull/182168) +* [native_assets] Fix `flutter build ios-framework` by @dcharkes in [181507](https://github.com/flutter/flutter/pull/181507) +* Revert "[Android] Add mechanism for setting Android engine flags via … by @camsim99 in [182388](https://github.com/flutter/flutter/pull/182388) +* Migrate abi build paths to use new abi filtering api #AGP9 by @reidbaker in [181828](https://github.com/flutter/flutter/pull/181828) +* Remove unused `getPluginList ` by @AbdeMohlbi in [182660](https://github.com/flutter/flutter/pull/182660) +* fix-huawei-imagereader-166481 by @serbandin in [181931](https://github.com/flutter/flutter/pull/181931) +* Add a cli flag for toggling HCPP use, and enable it by @gmackall in [182516](https://github.com/flutter/flutter/pull/182516) +* [Android] Avoid plugin auto-registration during FlutterFragmentActivity recreate timing window by @littleGnAl in [182963](https://github.com/flutter/flutter/pull/182963) +* Fix input mirroring in platform views when system language is RTL, and support is set in manifest. by @gmackall in [183472](https://github.com/flutter/flutter/pull/183472) +* Rename hcpp opt in flag to `enable-hcpp` by @gmackall in [183151](https://github.com/flutter/flutter/pull/183151) +* [a11y][android] In Android 16, sendWindowContentChangeEvent when check state changes by @hannah-hyj in [183606](https://github.com/flutter/flutter/pull/183606) +* Reland "[Android] Add mechanism for setting Android engine flags via Android manifest (take 2)" by @camsim99 in [182522](https://github.com/flutter/flutter/pull/182522) +* [skia] Disable use of deprecated Mock GrBackendSurface by @kjlubick in [183731](https://github.com/flutter/flutter/pull/183731) +* Fix Content Sizing Race Condition by @mboetger in [182326](https://github.com/flutter/flutter/pull/182326) +* Migrate `addTaskForPrintBuildVariants` and `isFlutterAppProject` to new agp dsl by @gmackall in [183849](https://github.com/flutter/flutter/pull/183849) +* Migrate profile build type creation and proguard config to new dsl by @gmackall in [183856](https://github.com/flutter/flutter/pull/183856) +* [android][a11y] set "android.widget.ProgressBar" according to semantics role by @hannah-hyj in [183897](https://github.com/flutter/flutter/pull/183897) +* Adds rockchip series to block list for vulkan. by @gaaclarke in [184207](https://github.com/flutter/flutter/pull/184207) +* [AGP 9] Bumping KGP error minimum to 2.0.0 by @jesswrd in [184385](https://github.com/flutter/flutter/pull/184385) +* [Android] Use EdgeToEdge.enable/WindowCompat for edge-to-edge mode instead of deprecated View flags by @dbebawy in [183072](https://github.com/flutter/flutter/pull/183072) +* Add our own wrapper for `CommonExtension` due to change in signature from 8.x->9.0 by @gmackall in [184433](https://github.com/flutter/flutter/pull/184433) +* Apply rect clipping to surface views by @gmackall in [184471](https://github.com/flutter/flutter/pull/184471) +* Revert "Apply rect clipping to surface views (#184471)" by @gmackall in [184728](https://github.com/flutter/flutter/pull/184728) +* Reland "Apply rect clipping to surface views" by @gmackall in [184732](https://github.com/flutter/flutter/pull/184732) +* Fix Android engine flags defaulting to true for malformed values by @realmeylisdev in [184631](https://github.com/flutter/flutter/pull/184631) +* [CP-beta][Android] Gboard Text Shift Stuck Fix by @flutteractionsbot in [185749](https://github.com/flutter/flutter/pull/185749) + +### Windows + +* [win32] Fix overflow in TaskRunnerWindow. by @knopp in [182822](https://github.com/flutter/flutter/pull/182822) +* Roll GoogleTest to e9907112b472 by @jason-simmons in [182795](https://github.com/flutter/flutter/pull/182795) +* Roll RapidJSON to a branch based on the current upstream head by @jason-simmons in [183048](https://github.com/flutter/flutter/pull/183048) +* Allow stylus support on windows by @CodeDoctorDE in [165323](https://github.com/flutter/flutter/pull/165323) +* fix: show window after first frame callback by @rkishan516 in [183454](https://github.com/flutter/flutter/pull/183454) +* [Windows] Restore and enable IAccessibleEx implementation by @loic-peron-inetum-public in [175406](https://github.com/flutter/flutter/pull/175406) +* Windows: Get graphics adapter from engine instead of view by @knopp in [184479](https://github.com/flutter/flutter/pull/184479) +* [CP-beta][Win32] FlutterDesktopEngineGetGraphicsAdapter should use out parameter by @flutteractionsbot in [185634](https://github.com/flutter/flutter/pull/185634) + +### Linux + +* fix build fail for wayland only platform by @HuQian in [182057](https://github.com/flutter/flutter/pull/182057) +* Remove unused function prototype by @robert-ancell in [182915](https://github.com/flutter/flutter/pull/182915) +* Support sending window constraints in metrics events by @robert-ancell in [182921](https://github.com/flutter/flutter/pull/182921) +* Add fl_view_new_sized_to_content() by @robert-ancell in [182924](https://github.com/flutter/flutter/pull/182924) +* Timeout when waiting for the correct sized frame from Flutter. by @robert-ancell in [182971](https://github.com/flutter/flutter/pull/182971) +* Update fl_texture_gl.h by @nmfisher in [182999](https://github.com/flutter/flutter/pull/182999) +* Add a platform OpenGL context. by @robert-ancell in [183715](https://github.com/flutter/flutter/pull/183715) +* Wrap EGL image usage in a GObject by @robert-ancell in [183539](https://github.com/flutter/flutter/pull/183539) +* Linux reuse sibling by @richardexfo in [183653](https://github.com/flutter/flutter/pull/183653) +* Revert "Linux reuse sibling (#183653)" by @robert-ancell in [183871](https://github.com/flutter/flutter/pull/183871) +* Use clearer return value for idle and timeout callbacks. by @robert-ancell in [183811](https://github.com/flutter/flutter/pull/183811) +* Protect access to renderables with a mutex by @robert-ancell in [183813](https://github.com/flutter/flutter/pull/183813) + +### Web + +* Move all getUniformX tests to web_ui/test. by @walley892 in [180910](https://github.com/flutter/flutter/pull/180910) +* [canvaskit] Fix image decoding in CPU-only mode by @harryterkelsen in [180706](https://github.com/flutter/flutter/pull/180706) +* [web] Fix loading of fragment shader with space in name. by @ksokolovskyi in [180919](https://github.com/flutter/flutter/pull/180919) +* Add support for reduced motion/disable animations on the web by @ditman in [180041](https://github.com/flutter/flutter/pull/180041) +* Skip flaky test on Firefox by @harryterkelsen in [180941](https://github.com/flutter/flutter/pull/180941) +* Fix style manager test by actually focusing the tested element. by @harryterkelsen in [181012](https://github.com/flutter/flutter/pull/181012) +* Reverts "Fix style manager test by actually focusing the tested element. (#181012)" by @auto-submit[bot] in [181060](https://github.com/flutter/flutter/pull/181060) +* Fix bug in multisurfacerenderer where canvases do not have "position: absolute" by @harryterkelsen in [181053](https://github.com/flutter/flutter/pull/181053) +* Add support for fetching array uniforms by name by @walley892 in [180647](https://github.com/flutter/flutter/pull/180647) +* Fix style_manager_test for Firefox by @harryterkelsen in [181084](https://github.com/flutter/flutter/pull/181084) +* Fixing getPositionForOffset by @Rusino in [180913](https://github.com/flutter/flutter/pull/180913) +* Don't pass bounds to saveLayer call when painting ImageFilter by @harryterkelsen in [181353](https://github.com/flutter/flutter/pull/181353) +* [Web] Fix flt-platform-view comment by @loic-sharma in [181576](https://github.com/flutter/flutter/pull/181576) +* fix(web_ui): handle non-invertible matrices in ImageFilter.matrix by @harryterkelsen in [181742](https://github.com/flutter/flutter/pull/181742) +* In the Web codec tests, skip an undecodable image that is used to test a Skia error handling code path. by @jason-simmons in [181870](https://github.com/flutter/flutter/pull/181870) +* perf: web ui loadFontFromList by @caijw in [181440](https://github.com/flutter/flutter/pull/181440) +* Add getUniformMatX support for desktop and mobile by @walley892 in [182117](https://github.com/flutter/flutter/pull/182117) +* Update web ui fragment shader tests by @walley892 in [181877](https://github.com/flutter/flutter/pull/181877) +* engine: Use a super-parameter in one missed case by @srawlins in [181914](https://github.com/flutter/flutter/pull/181914) +* Implement getUniformMatX and getUniformMatXArray functionality on web by @walley892 in [182249](https://github.com/flutter/flutter/pull/182249) +* [web] Stop double loading fonts for WebParagraph by @mdebbar in [182026](https://github.com/flutter/flutter/pull/182026) +* Manual roll Skia from 7bbdc51ab0aa to ce5854495a3a by @jason-simmons in [182637](https://github.com/flutter/flutter/pull/182637) +* fix(web_ui): use static whitelist for image codec tests by @harryterkelsen in [182648](https://github.com/flutter/flutter/pull/182648) +* [web] Run webparagraph tests in CI by @mdebbar in [182092](https://github.com/flutter/flutter/pull/182092) +* [web] Fix failure on Firefox 148 by @mdebbar in [182855](https://github.com/flutter/flutter/pull/182855) +* Paint the paragraph as a single image by @Rusino in [181206](https://github.com/flutter/flutter/pull/181206) +* [web] Roll Firefox to 148 by @mdebbar in [182859](https://github.com/flutter/flutter/pull/182859) +* [web] Fix stack corruption in Skwasm and harden withStackScope API by @harryterkelsen in [182912](https://github.com/flutter/flutter/pull/182912) +* Manual roll Dart SDK to 3.12.0-192.0.dev by @mraleph in [182883](https://github.com/flutter/flutter/pull/182883) +* Fix issue where web embedder is synthesizing key up events too eagerly by @O-Hannonen in [180692](https://github.com/flutter/flutter/pull/180692) +* Fixes future warning for `await`ing `Future` returns in `async` bodies inside `try` blocks by @FMorschel in [182301](https://github.com/flutter/flutter/pull/182301) +* [web] Roll Chrome to 145 by @mdebbar in [182860](https://github.com/flutter/flutter/pull/182860) +* Use isA to test for exceptions by @srujzs in [183129](https://github.com/flutter/flutter/pull/183129) +* Support mixed color spaces in `Color.lerp` by @spydon in [182934](https://github.com/flutter/flutter/pull/182934) +* [web] Use pointer-events: auto for non-interactive leaf semantics nodes by @flutter-zl in [183077](https://github.com/flutter/flutter/pull/183077) +* [web] Updates to the README by @mdebbar in [176292](https://github.com/flutter/flutter/pull/176292) +* [web] Prevent Firefox auto-updates by @mdebbar in [183330](https://github.com/flutter/flutter/pull/183330) +* [web] Fix occasional failure to find Chrome tab by @mdebbar in [183737](https://github.com/flutter/flutter/pull/183737) +* fix(web_ui): move prepareToDraw after raster to improve concurrency and stability by @harryterkelsen in [183791](https://github.com/flutter/flutter/pull/183791) +* fix(web): fix crash in Skwasm when transferring non-transferable texture sources by @harryterkelsen in [183799](https://github.com/flutter/flutter/pull/183799) +* fix(web): handle asynchronously disposed platform views by @harryterkelsen in [183666](https://github.com/flutter/flutter/pull/183666) +* refactor(web): use positive logic and platform defaults for accessibility features by @harryterkelsen in [183907](https://github.com/flutter/flutter/pull/183907) +* web_ui: Remove unused parameters in a few places by @srawlins in [183156](https://github.com/flutter/flutter/pull/183156) +* [web] Make it safe to call dispose multiple times on a CkSurface by @jason-simmons in [184270](https://github.com/flutter/flutter/pull/184270) +* fix(web): call ui.Picture.onDispose for the original picture only by @harryterkelsen in [184348](https://github.com/flutter/flutter/pull/184348) +* [web_ui] Fix avoid_type_to_string lint violation by @srawlins in [184342](https://github.com/flutter/flutter/pull/184342) + +### Tooling + +* [ Widget Preview ] Move widget_preview_scaffold tests to `dev/integration_tests/widget_preview_scaffold` by @bkonyi in [180658](https://github.com/flutter/flutter/pull/180658) +* [web] Don't serve files outside of project by @mdebbar in [180699](https://github.com/flutter/flutter/pull/180699) +* Unpin google_mobile_ads by @goderbauer in [180573](https://github.com/flutter/flutter/pull/180573) +* Reverts "Unpin google_mobile_ads (#180573)" by @auto-submit[bot] in [180761](https://github.com/flutter/flutter/pull/180761) +* [ Tool ] Add support for linux riscv64 architecture by @vhaudiquet in [178711](https://github.com/flutter/flutter/pull/178711) +* fix: there are no riscv fuchsia artifacts by @jtmcdole in [180779](https://github.com/flutter/flutter/pull/180779) +* [ Tool ] Fix `flutter run -d all` crash by @bkonyi in [180845](https://github.com/flutter/flutter/pull/180845) +* Roll pub packages by @flutter-pub-roller-bot in [180900](https://github.com/flutter/flutter/pull/180900) +* [ Tool ] Handle `DartDevelopmentServiceException` when launching web applications by @bkonyi in [180905](https://github.com/flutter/flutter/pull/180905) +* Roll pub packages by @flutter-pub-roller-bot in [180928](https://github.com/flutter/flutter/pull/180928) +* Roll pub packages by @flutter-pub-roller-bot in [180977](https://github.com/flutter/flutter/pull/180977) +* [ Tool ] Ensure `flutter.version.json` is regenerated on upgrade by @bkonyi in [180857](https://github.com/flutter/flutter/pull/180857) +* Roll pub packages by @flutter-pub-roller-bot in [181054](https://github.com/flutter/flutter/pull/181054) +* [ Widget Preview ] Fix crash when `@Preview` annotations appeared outside of `lib/` by @bkonyi in [180768](https://github.com/flutter/flutter/pull/180768) +* Allowlist for dependencies of sdk packages by @sigurdm in [180740](https://github.com/flutter/flutter/pull/180740) +* Add FlutterFramework as an Xcode SwiftPM local package override by @vashworth in [179512](https://github.com/flutter/flutter/pull/179512) +* Fixes macOS App.framework not being codesigned or find framework by @vashworth in [181348](https://github.com/flutter/flutter/pull/181348) +* [ Tool ] Fix `update-packages` failing due to mismatched dependencies between flutter_tools and the framework by @bkonyi in [181335](https://github.com/flutter/flutter/pull/181335) +* Look for project root for FeatureFlags manifest by @Albert221 in [180689](https://github.com/flutter/flutter/pull/180689) +* bump KGP and AGP max known versions by @AbdeMohlbi in [181325](https://github.com/flutter/flutter/pull/181325) +* Replace `pub run` mentions with `dart run` by @sigurdm in [181317](https://github.com/flutter/flutter/pull/181317) +* Fix generating both `settings.gradle` and `settings.gradle.kts` for plugins by @AbdeMohlbi in [181592](https://github.com/flutter/flutter/pull/181592) +* [hooks] Don't run build hooks for code assets in `flutter run` by @dcharkes in [181542](https://github.com/flutter/flutter/pull/181542) +* [flutter_tools] Deprecate `plugin_ffi` template by @dcharkes in [181588](https://github.com/flutter/flutter/pull/181588) +* Remove unused test file by @AbdeMohlbi in [181671](https://github.com/flutter/flutter/pull/181671) +* Roll pub packages by @flutter-pub-roller-bot in [181690](https://github.com/flutter/flutter/pull/181690) +* [native assets] Split debug info into `.dsym` files by @dcharkes in [181533](https://github.com/flutter/flutter/pull/181533) +* [ Tool ] Cleanup `ResidentCompiler` initialization logic by @bkonyi in [181421](https://github.com/flutter/flutter/pull/181421) +* Fix todo about `replacing URL with constants` in `gradle_errors.dart` by @AbdeMohlbi in [181673](https://github.com/flutter/flutter/pull/181673) +* [ Tool ] Don't use `globals.platform` in `getFlutterRoot()` by @bkonyi in [181859](https://github.com/flutter/flutter/pull/181859) +* Remove unused getters on AndroidProject class by @AbdeMohlbi in [181860](https://github.com/flutter/flutter/pull/181860) +* Make `android_plugin_new_output_dir_test` only build release by @gmackall in [181677](https://github.com/flutter/flutter/pull/181677) +* Remove the Flutter.xcframework as a swift dependency by @vashworth in [181739](https://github.com/flutter/flutter/pull/181739) +* Roll pub packages by @flutter-pub-roller-bot in [181871](https://github.com/flutter/flutter/pull/181871) +* Remove `Config complete` log when using `flutter build apk --config-only` by @AbdeMohlbi in [181864](https://github.com/flutter/flutter/pull/181864) +* [flutter_tools] Deprecate web hot reload flag by @nshahan in [181884](https://github.com/flutter/flutter/pull/181884) +* Roll pub packages by @flutter-pub-roller-bot in [181925](https://github.com/flutter/flutter/pull/181925) +* Bump minimum required Xcode version to 15 and recommended to 16 by @okorohelijah in [180531](https://github.com/flutter/flutter/pull/180531) +* Roll pub packages by @flutter-pub-roller-bot in [181965](https://github.com/flutter/flutter/pull/181965) +* Directly generate a Mach-O dynamic library using gen_snapshot. [reland] by @sstrickl in [181539](https://github.com/flutter/flutter/pull/181539) +* Roll pub packages by @flutter-pub-roller-bot in [181973](https://github.com/flutter/flutter/pull/181973) +* `flutter_tool` : Remove redundant enum types inside the enum definition scope by @AbdeMohlbi in [181910](https://github.com/flutter/flutter/pull/181910) +* Add a new flutter cli command, running-apps, using mDNS app discovery by @jwren in [180098](https://github.com/flutter/flutter/pull/180098) +* Remove unused getters in `user_messages.dart` by @AbdeMohlbi in [181867](https://github.com/flutter/flutter/pull/181867) +* Add command to build a Swift Package for Add to App and generate FlutterPluginRegistrant by @vashworth in [181224](https://github.com/flutter/flutter/pull/181224) +* Remove unused constant in `bundle.dart` by @AbdeMohlbi in [182023](https://github.com/flutter/flutter/pull/182023) +* [AGP 9] Added Warning Against Updating to AGP 9 by @jesswrd in [181977](https://github.com/flutter/flutter/pull/181977) +* Fix wrong comment about default impeller value by @AbdeMohlbi in [181831](https://github.com/flutter/flutter/pull/181831) +* [flutter_tools] Cleanup the unused DDC flag by @nshahan in [182177](https://github.com/flutter/flutter/pull/182177) +* [Tool] Remove redundant name fields in an enum by @AbdeMohlbi in [181674](https://github.com/flutter/flutter/pull/181674) +* Fix `flutter build web` ignoring `--web-define` flag by @mkucharski17 in [182079](https://github.com/flutter/flutter/pull/182079) +* [ Tool ] Allow creation of projects inside the engine's examples directory by @jason-simmons in [182268](https://github.com/flutter/flutter/pull/182268) +* Don't throw an exception if no web define variable is set by @EricApostal in [182273](https://github.com/flutter/flutter/pull/182273) +* Add plugin dependencies to Add to App FlutterPluginRegistrant by @vashworth in [182304](https://github.com/flutter/flutter/pull/182304) +* Update iOS/macOS plugin template to add dependency on FlutterFramework by @vashworth in [181416](https://github.com/flutter/flutter/pull/181416) +* refactor: Centralize table formatting logic into a new `formatTable` utility function. by @jwren in [182196](https://github.com/flutter/flutter/pull/182196) +* Filter error messages from `emulator -list-avds` output by @alex-medinsh in [180802](https://github.com/flutter/flutter/pull/180802) +* Remove more getters from userMessages class by @AbdeMohlbi in [182166](https://github.com/flutter/flutter/pull/182166) +* Analyzer, require 10.1.0, fix deprecations in dependency_graph.dart by @scheglov in [182507](https://github.com/flutter/flutter/pull/182507) +* flutter_tools: Copy vendored frameworks from plugin podspecs in ios/macos-framework builds by @MohammedTarigg in [180135](https://github.com/flutter/flutter/pull/180135) +* Update create template to always generate both SwiftPM and CocoaPods support for iOS/macOS plugins by @okorohelijah in [181251](https://github.com/flutter/flutter/pull/181251) +* Roll pub packages by @flutter-pub-roller-bot in [182579](https://github.com/flutter/flutter/pull/182579) +* Manual dart sdk flutter 174bcc79 25ff 4267 8e26 d0e902f18681 1771486449 by @gaaclarke in [182624](https://github.com/flutter/flutter/pull/182624) +* Refactor bin/ shell scripts for better performance and safety by @kevmoo in [182674](https://github.com/flutter/flutter/pull/182674) +* running-apps: update running-apps to use Duration.ago() by @jwren in [182172](https://github.com/flutter/flutter/pull/182172) +* [web] Remove --disable-gpu from flutter chrome tests by @mdebbar in [182618](https://github.com/flutter/flutter/pull/182618) +* Add progress indicator to artifact downloads by @Mr-Pepe in [181808](https://github.com/flutter/flutter/pull/181808) +* Copy Flutter framework to Add to App FlutterPluginRgistrant by @vashworth in [182523](https://github.com/flutter/flutter/pull/182523) +* Move more getters from userMessages class to the appropriate places by @AbdeMohlbi in [182656](https://github.com/flutter/flutter/pull/182656) +* flutter_tools: Use a super-parameter in several missed cases by @srawlins in [182581](https://github.com/flutter/flutter/pull/182581) +* Rename noFrequencyBasedMinification to useFrequencyBasedMinification by @jhonathanqz in [182684](https://github.com/flutter/flutter/pull/182684) +* feat: Add --no-uninstall flag to flutter test for integration tests by @Mastersam07 in [182714](https://github.com/flutter/flutter/pull/182714) +* Add a getter in run.dart to access use-application-binary flag. by @chingjun in [182931](https://github.com/flutter/flutter/pull/182931) +* Add a ResidentCompilerFactory to create ResidentCompiler instances. by @chingjun in [182930](https://github.com/flutter/flutter/pull/182930) +* Linux build hooks: Read compiler config from CMakeCache.txt by @simolus3 in [181004](https://github.com/flutter/flutter/pull/181004) +* When impellerc fails with a long shader compilation error, truncate it and output to a file by @b-luk in [182786](https://github.com/flutter/flutter/pull/182786) +* Enable SwiftPM by default on master and beta by @vashworth in [182923](https://github.com/flutter/flutter/pull/182923) +* Roll pub packages by @flutter-pub-roller-bot in [182640](https://github.com/flutter/flutter/pull/182640) +* Build App and native asset frameworks for Add to App FlutterPluginRegistrant by @vashworth in [183136](https://github.com/flutter/flutter/pull/183136) +* Pass --web-define through to web runner when using --machine mode by @DanTup in [183228](https://github.com/flutter/flutter/pull/183228) +* Give guided message when project is not compatible with SwiftPM by @vashworth in [182394](https://github.com/flutter/flutter/pull/182394) +* Show warning when plugins do not support SwiftPM by @vashworth in [182506](https://github.com/flutter/flutter/pull/182506) +* Make compileShader() retry without sksl if it fails with sksl. by @b-luk in [183146](https://github.com/flutter/flutter/pull/183146) +* Build CocoaPod plugin frameworks for Add to App FlutterPluginRegistrant by @vashworth in [183239](https://github.com/flutter/flutter/pull/183239) +* fix: use double quotes in settings.gradle.kts template by @ishaquehassan in [183081](https://github.com/flutter/flutter/pull/183081) +* Roll pub packages by @flutter-pub-roller-bot in [183319](https://github.com/flutter/flutter/pull/183319) +* Roll pub packages by @flutter-pub-roller-bot in [183344](https://github.com/flutter/flutter/pull/183344) +* [ Tool ] Fix --print-dtd not working for web targets by @bkonyi in [183171](https://github.com/flutter/flutter/pull/183171) +* Roll pub packages by @flutter-pub-roller-bot in [183411](https://github.com/flutter/flutter/pull/183411) +* Roll pub packages by @DanTup in [183527](https://github.com/flutter/flutter/pull/183527) +* Remove redundant VS Code code/tests by @DanTup in [183506](https://github.com/flutter/flutter/pull/183506) +* Fix macOS relative plugin Xcode file path by @vashworth in [183593](https://github.com/flutter/flutter/pull/183593) +* [flutter_tools] Support flavors and transformers for shaders by @Laurie-Lin in [181889](https://github.com/flutter/flutter/pull/181889) +* Update gradle utils to know about kgp 2.3.10 constraints by @reidbaker in [183416](https://github.com/flutter/flutter/pull/183416) +* Properly parse URIs for testPath when the host is running on Windows. by @Eyas in [176881](https://github.com/flutter/flutter/pull/176881) +* Fix Android Studio pluginsPath when version is unknown (do not use 0.0) by @jhonathanqz in [182681](https://github.com/flutter/flutter/pull/182681) +* Throw ToolExit when flutter downgrade receives positional arguments by @NamanGoyalK in [183375](https://github.com/flutter/flutter/pull/183375) +* Prompt plugin authors to add Swift Package Manager compatibility to their plugin by @okorohelijah in [182246](https://github.com/flutter/flutter/pull/182246) +* Add windows instruction to `Forcing Flutter Tools Snapshot Regeneration` by @AbdeMohlbi in [183977](https://github.com/flutter/flutter/pull/183977) +* Add progress bar to artifact downloads by @Mr-Pepe in [182836](https://github.com/flutter/flutter/pull/182836) +* [tools] Make sure `assemble` has a pubspec as cwd by @dcharkes in [184067](https://github.com/flutter/flutter/pull/184067) +* feat: Add --base-href support to flutter run for web by @Mastersam07 in [182709](https://github.com/flutter/flutter/pull/182709) +* Collect impeller analytics for appbundles by @gmackall in [184146](https://github.com/flutter/flutter/pull/184146) +* [ Tool ] Remove `flutter running-apps` command by @bkonyi in [183742](https://github.com/flutter/flutter/pull/183742) +* [ Tool ] Migrate `flutter analyze` to use LSP by @bkonyi in [183785](https://github.com/flutter/flutter/pull/183785) +* Inject FlutterFramework dependency in iOS Add2App swift packages by @vashworth in [184365](https://github.com/flutter/flutter/pull/184365) +* Improve error message when `dart-define` content are not `base64 encoded` and add more test cases by @AbdeMohlbi in [184219](https://github.com/flutter/flutter/pull/184219) +* [ Widget Preview ] Use analysis server for widget preview detection by @bkonyi in [184473](https://github.com/flutter/flutter/pull/184473) +* [data_assets] Cleanup tests by @dcharkes in [184209](https://github.com/flutter/flutter/pull/184209) +* Enable SPM by default on Stable by @okorohelijah in [184495](https://github.com/flutter/flutter/pull/184495) +* [ Widget Preview ] Handle collections and records in custom preview annotations by @bkonyi in [184518](https://github.com/flutter/flutter/pull/184518) +* forward an application name to DDS by @jakemac53 in [184459](https://github.com/flutter/flutter/pull/184459) +* Reverts "[data_assets] Cleanup tests (#184209)" by @auto-submit[bot] in [184575](https://github.com/flutter/flutter/pull/184575) +* Downgrade CocoaPods doctor check to warning and fix build error messaging by @okorohelijah in [184511](https://github.com/flutter/flutter/pull/184511) +* [AGP 9] Add Disable Built-in Kotlin and newDSL Migrators by @jesswrd in [184255](https://github.com/flutter/flutter/pull/184255) +* Parse scheme file with XML parser for SwiftPM migrator by @vashworth in [184525](https://github.com/flutter/flutter/pull/184525) +* `WindowsPlugin` should not crash when ffiPlugin enabled by @Renzo-Olivares in [184695](https://github.com/flutter/flutter/pull/184695) +* Have `flutter create` create a pubspec.lock to ensure pinned versions are being used. by @sigurdm in [175352](https://github.com/flutter/flutter/pull/175352) +* Introduce command to build a swift package for SwiftPM add to app integration by @vashworth in [184660](https://github.com/flutter/flutter/pull/184660) +* Reland "[data_assets] Cleanup tests" by @dcharkes in [184714](https://github.com/flutter/flutter/pull/184714) +* Collect HCPP adoption analytics for flutter run/build apk/build appbundle by @gmackall in [184225](https://github.com/flutter/flutter/pull/184225) +* Tool: Add search and filtering to widget preview scaffold by @NamanGoyalK in [184023](https://github.com/flutter/flutter/pull/184023) +* [cp-beta] Fix codesign verification test for SwiftPM Add to App by @eyebrowsoffire in [185000](https://github.com/flutter/flutter/pull/185000) +* [CP-beta]Use relative path for reloadedSourcesUri and reloaded modules by @flutteractionsbot in [185540](https://github.com/flutter/flutter/pull/185540) +* [CP-beta][Widget Preview] Fix flaky integration test timeout during flutter clean (#184991) by @bkonyi in [185300](https://github.com/flutter/flutter/pull/185300) +* [CP-beta]Fix `--enable-hcpp` flag being ignored in release by @flutteractionsbot in [185717](https://github.com/flutter/flutter/pull/185717) + +### Documentation + +* Update example description by @robert-ancell in [182067](https://github.com/flutter/flutter/pull/182067) + +### Other changes + +* Update flutter changelog for 3.38.6 by @walley892 in [180708](https://github.com/flutter/flutter/pull/180708) +* Update CODEOWNERS to remove chinmaygarde. by @chinmaygarde in [180703](https://github.com/flutter/flutter/pull/180703) +* Enabled some disabled impeller fragment shader dart tests by @gaaclarke in [180759](https://github.com/flutter/flutter/pull/180759) +* Reverts "Enabled some disabled impeller fragment shader dart tests (#180759)" by @auto-submit[bot] in [180785](https://github.com/flutter/flutter/pull/180785) +* Bump ffigen by @goderbauer in [180507](https://github.com/flutter/flutter/pull/180507) +* Fix: Allow dartpad embed clipboard-write permission for "Copy to clipboard" functionality by @dixita0607 in [178057](https://github.com/flutter/flutter/pull/178057) +* Reland `Enabled some disabled impeller fragment shader dart tests` by @gaaclarke in [180788](https://github.com/flutter/flutter/pull/180788) +* Turn on fragment shader equality test by @gaaclarke in [180784](https://github.com/flutter/flutter/pull/180784) +* Roll libpng to version 1.6.53 by @jason-simmons in [180712](https://github.com/flutter/flutter/pull/180712) +* Add build-time checks for ImpellerC's SkSL compiler by @b-luk in [180861](https://github.com/flutter/flutter/pull/180861) +* Adds metal background to engine dart tests by @gaaclarke in [180700](https://github.com/flutter/flutter/pull/180700) +* Reenable 4 fragment shader tests by @gaaclarke in [180875](https://github.com/flutter/flutter/pull/180875) +* In flutter_test_performance, consider the blank line at the start of "flutter test" output to be optional. by @jason-simmons in [180911](https://github.com/flutter/flutter/pull/180911) +* [Impeller] Fix crash trying to check for duplicate vertices in shadow_path code by @flar in [180920](https://github.com/flutter/flutter/pull/180920) +* Made the bad lines exception print out the bad lines by @gaaclarke in [180909](https://github.com/flutter/flutter/pull/180909) +* Fix 'ImageFilter.shader can be applied to canvas operations' test by @b-luk in [180929](https://github.com/flutter/flutter/pull/180929) +* Add missing 'throw' to ImageFilter.shader's validation check by @b-luk in [180923](https://github.com/flutter/flutter/pull/180923) +* Update CHANGELOG at head for 3.38.7 stable hotfix by @walley892 in [180986](https://github.com/flutter/flutter/pull/180986) +* Update discussion of iOS/macOS testing by @stuartmorgan-g in [180898](https://github.com/flutter/flutter/pull/180898) +* Roll pub packages by @flutter-pub-roller-bot in [181006](https://github.com/flutter/flutter/pull/181006) +* Manual roll of Dart SDK from ebaf52c13799 to 8fe983db0c99 (6 revisions) by @jason-simmons in [180978](https://github.com/flutter/flutter/pull/180978) +* Remove setup_hooks.dart and move _setupHooks back into natives.dart by @jason-simmons in [181008](https://github.com/flutter/flutter/pull/181008) +* Add table detailing AI rule file character limits for various tools by @jwren in [179817](https://github.com/flutter/flutter/pull/179817) +* Fix capitalization of the path to FlutterWindowControllerTest.mm in the macOS platform build script by @jason-simmons in [181045](https://github.com/flutter/flutter/pull/181045) +* Reverts "Fix capitalization of the path to FlutterWindowControllerTest.mm in the macOS platform build script (#181045)" by @auto-submit[bot] in [181091](https://github.com/flutter/flutter/pull/181091) +* Migrate gradient creation to the new SkShaders API by @bungeman in [180766](https://github.com/flutter/flutter/pull/180766) +* Remove use of SkDeserialProcs::fTypefaceProc by @bungeman in [181047](https://github.com/flutter/flutter/pull/181047) +* Add route for 'tmp' to Flutter runner by @chaopeng in [181044](https://github.com/flutter/flutter/pull/181044) +* [skia] Use renamed GNI filegroup by @kjlubick in [180853](https://github.com/flutter/flutter/pull/180853) +* [skia] Remove VMA from build logic by @kjlubick in [181183](https://github.com/flutter/flutter/pull/181183) +* Update triage docs by @Piinks in [181193](https://github.com/flutter/flutter/pull/181193) +* Roll pub packages by @flutter-pub-roller-bot in [181226](https://github.com/flutter/flutter/pull/181226) +* Use SkPathBuilder with SkPathMeasure::getSegment by @bungeman in [181205](https://github.com/flutter/flutter/pull/181205) +* Remove bringup flag from Mac_arm64_mokey task by @camsim99 in [178759](https://github.com/flutter/flutter/pull/178759) +* [packages_autoroller] Migrate to `dart build cli` by @dcharkes in [181273](https://github.com/flutter/flutter/pull/181273) +* Marks drive_perf_debug_warning to be unflaky by @jmagman in [181277](https://github.com/flutter/flutter/pull/181277) +* Marks Mac_mokey microbenchmarks to be unflaky by @jmagman in [181276](https://github.com/flutter/flutter/pull/181276) +* Bring Linux coverage out of bringup by @jmagman in [181280](https://github.com/flutter/flutter/pull/181280) +* Enables fragment shader test for impeller (fixes mat2 on vulkan) by @gaaclarke in [181013](https://github.com/flutter/flutter/pull/181013) +* Roll pub packages by @flutter-pub-roller-bot in [181295](https://github.com/flutter/flutter/pull/181295) +* Reland "Fix capitalization of the path to FlutterWindowControllerTest.mm in the macOS platform build script" by @jason-simmons in [181200](https://github.com/flutter/flutter/pull/181200) +* Roll Fuchsia GN SDK from NAEC5tfgSl8g94nwp... to JLBh4Z9PKsjIJcqDU... by @sutes-work in [181139](https://github.com/flutter/flutter/pull/181139) +* [Impeller] Make dynamically created shader metadata for runtime effects consistent with metadata for built-in shaders by @jason-simmons in [181201](https://github.com/flutter/flutter/pull/181201) +* Re-enable fragment_shader_tests.dart 'Shader Compiler appropriately pads vec3 uniform arrays' test on Vulkan by @b-luk in [181292](https://github.com/flutter/flutter/pull/181292) +* Reland hybrid views test by @gmackall in [181336](https://github.com/flutter/flutter/pull/181336) +* No longer exiting the application when the RegularWindow is destroyed + resolving the window created promise after runWidget by @mattkae in [181339](https://github.com/flutter/flutter/pull/181339) +* Adds contents of keys file when a skia gold error occurs. by @gaaclarke in [181401](https://github.com/flutter/flutter/pull/181401) +* [Impeller] Fix interpolation error in Rect::TransformAndClipBounds by @flar in [181420](https://github.com/flutter/flutter/pull/181420) +* [Impeller] Fix perspective clips with a large perspective bias by @flar in [181434](https://github.com/flutter/flutter/pull/181434) +* Fixes metal vec3 uniform padding by @gaaclarke in [181340](https://github.com/flutter/flutter/pull/181340) +* Marks linux_chrome_dev_mode to be unflaky by @jmagman in [181352](https://github.com/flutter/flutter/pull/181352) +* Roll FreeType to 2.14.1 by @jason-simmons in [181428](https://github.com/flutter/flutter/pull/181428) +* Change update_engine_version documenation by @reidbaker in [181508](https://github.com/flutter/flutter/pull/181508) +* Reverts "Fixes metal vec3 uniform padding (#181340)" by @auto-submit[bot] in [181552](https://github.com/flutter/flutter/pull/181552) +* Merge changelog for 3.38.8. by @eyebrowsoffire in [181558](https://github.com/flutter/flutter/pull/181558) +* Marks firebase_release_smoke_test to be unflaky by @jmagman in [181308](https://github.com/flutter/flutter/pull/181308) +* chore: Windows_mokey basic_material_app_win__compile !bringup by @jtmcdole in [180985](https://github.com/flutter/flutter/pull/180985) +* Remove chrome_and_driver dependency where it's not needed by @mdebbar in [178174](https://github.com/flutter/flutter/pull/178174) +* Adds impeller backend to skia gold client by @gaaclarke in [181503](https://github.com/flutter/flutter/pull/181503) +* fix: swap app and engine version in vk::ApplicationInfo by @jtmcdole in [181432](https://github.com/flutter/flutter/pull/181432) +* Fix the issue on macOS where, after a hot restart with multiple windows, unresponsive windows are left behind. by @yiiim in [180287](https://github.com/flutter/flutter/pull/180287) +* Account for vec3 padding in Metal by @walley892 in [181563](https://github.com/flutter/flutter/pull/181563) +* Fixes getUniformX for Vulkan by @walley892 in [181286](https://github.com/flutter/flutter/pull/181286) +* Merge changelog for 3.38.9 by @eyebrowsoffire in [181668](https://github.com/flutter/flutter/pull/181668) +* [Impeller] Fix off-by-one indices in the SimilarPointPair/SimilarPointTrio functions used by ShadowPathGeometryTest by @jason-simmons in [181623](https://github.com/flutter/flutter/pull/181623) +* Roll libpng to version 1.6.54 by @jason-simmons in [181625](https://github.com/flutter/flutter/pull/181625) +* Remove nonstandard ndkpath for `hybrid_android_views` integration test by @gmackall in [181666](https://github.com/flutter/flutter/pull/181666) +* [Impeller] Ensure that HostBuffers/DeviceBuffers allocated by RendererTest tests are valid for the lifetime of the RenderPass by @jason-simmons in [181635](https://github.com/flutter/flutter/pull/181635) +* Add `android_sdk` dependency to `android_engine_opengles_tests` by @gmackall in [181681](https://github.com/flutter/flutter/pull/181681) +* Extend the Windows tool_integration_tests_2_9 shard timeout to 1 hour by @jason-simmons in [181678](https://github.com/flutter/flutter/pull/181678) +* Make the Windows windowing_test in .ci.yaml have bringup as false by @mattkae in [181664](https://github.com/flutter/flutter/pull/181664) +* enable enhanced debugging for GLES playground by @planetmarshall in [181157](https://github.com/flutter/flutter/pull/181157) +* add stacktrace support when requested for host builds by @planetmarshall in [181264](https://github.com/flutter/flutter/pull/181264) +* update GLFW to latest and use EGL context creation on linux by @planetmarshall in [181259](https://github.com/flutter/flutter/pull/181259) +* add ccache support for custom toolchain by @planetmarshall in [180737](https://github.com/flutter/flutter/pull/180737) +* chore: deflake Linux_mokey flutter_engine_group_performance by @jtmcdole in [181624](https://github.com/flutter/flutter/pull/181624) +* Update New Android API Docs by @jesswrd in [180604](https://github.com/flutter/flutter/pull/180604) +* [Impeller] Fix type conversion warnings seen on Windows when Impeller GL API wrappers log arguments with function types by @jason-simmons in [181734](https://github.com/flutter/flutter/pull/181734) +* Roll pub packages by @flutter-pub-roller-bot in [181738](https://github.com/flutter/flutter/pull/181738) +* [ Tool ] Fix regression introduced in flutter/flutter#181421 by @bkonyi in [181826](https://github.com/flutter/flutter/pull/181826) +* Adds batch release doc for flutter/package by @chunhtai in [181676](https://github.com/flutter/flutter/pull/181676) +* Add Linux Foundation Health Score badge to README by @jonathimer in [175587](https://github.com/flutter/flutter/pull/175587) +* Roll customer tests by @loic-sharma in [181825](https://github.com/flutter/flutter/pull/181825) +* Unmark `hybrid_android_views_integration_test` as bringup by @gmackall in [181628](https://github.com/flutter/flutter/pull/181628) +* Organize and update fragment shader uniform tests. by @walley892 in [181822](https://github.com/flutter/flutter/pull/181822) +* [Impeller] Fix flattening of very large zoomed curves with tiny stroke widths by @flar in [181505](https://github.com/flutter/flutter/pull/181505) +* Marks platform_views_scroll_perf_impeller__timeline_summary unflaky by @jmagman in [181649](https://github.com/flutter/flutter/pull/181649) +* Re-enable AddressSanitizer on the linux_unopt builder by @jason-simmons in [181741](https://github.com/flutter/flutter/pull/181741) +* Temporarily remove the Pixel 9/API 36 device from the Firebase Test Lab tests. by @jason-simmons in [181956](https://github.com/flutter/flutter/pull/181956) +* Update Dart SDK to 3.12 beta1 by @iinozemtsev in [181948](https://github.com/flutter/flutter/pull/181948) +* Manual roll Skia from 39aa2a70213a to 9a983f6c2c06 by @jason-simmons in [181986](https://github.com/flutter/flutter/pull/181986) +* Add buffer around rerasterized input to fragment shaders to maintain coordinate space when clipped by @gaaclarke in [181743](https://github.com/flutter/flutter/pull/181743) +* Adds opengles to engine dart tests by @b-luk in [181933](https://github.com/flutter/flutter/pull/181933) +* Updated Shaderc dep by @gaaclarke in [180976](https://github.com/flutter/flutter/pull/180976) +* Add missing dependencies to framework_tests_misc_leak_tracking by @dkwingsmt in [181929](https://github.com/flutter/flutter/pull/181929) +* Delete the last remaining skia only fragment shader tests by @gaaclarke in [182127](https://github.com/flutter/flutter/pull/182127) +* [gn] fix --stripped being disabled for all targets by @martinetd in [181984](https://github.com/flutter/flutter/pull/181984) +* Roll pub packages by @flutter-pub-roller-bot in [182120](https://github.com/flutter/flutter/pull/182120) +* Update linux_unopt CI: Increase timeout and remove --quiet flag by @b-luk in [182162](https://github.com/flutter/flutter/pull/182162) +* Roll ANGLE to ad5b0084fe6b by @jason-simmons in [182183](https://github.com/flutter/flutter/pull/182183) +* [Impeller] Fix VkImageView leak in WrappedTextureSourceVK by @RickyvdBerg in [181966](https://github.com/flutter/flutter/pull/181966) +* Fix incorrect rendering from drawImageNine when running on impeller with opengles by @b-luk in [182179](https://github.com/flutter/flutter/pull/182179) +* Update `CHANGELOG` to include 3.41 stable release by @camsim99 in [182227](https://github.com/flutter/flutter/pull/182227) +* Changelog entry for 3.38.10 stable hotfix by @justinmc in [182237](https://github.com/flutter/flutter/pull/182237) +* Increase timeout for tracing_test.dart's "Canvas.saveLayer emits tracing" by @b-luk in [182225](https://github.com/flutter/flutter/pull/182225) +* Made sure no test() declaration happens asynchronously in fragment shader tests by @gaaclarke in [182306](https://github.com/flutter/flutter/pull/182306) +* [Impeller] Dispose thread local caches on each frame when using GPUSurfaceVulkanImpeller with a delegate by @jason-simmons in [182265](https://github.com/flutter/flutter/pull/182265) +* Update `CHANGELOG` for 3.41.1 release by @camsim99 in [182393](https://github.com/flutter/flutter/pull/182393) +* Turns on most of fragment_shader_test.dart for opengles by @gaaclarke in [182229](https://github.com/flutter/flutter/pull/182229) +* Adds impeller backend to golden workspace name by @gaaclarke in [182387](https://github.com/flutter/flutter/pull/182387) +* Disable multithread opengles, enables remaining fragment shader tests by @gaaclarke in [182384](https://github.com/flutter/flutter/pull/182384) +* Fix iOS CI tests for Xcode 26 Swift compatibility by @okorohelijah in [182132](https://github.com/flutter/flutter/pull/182132) +* Unmark stable vulkan platform view tests as bringup by @gmackall in [182554](https://github.com/flutter/flutter/pull/182554) +* Update android symbolication instructions by @gmackall in [181267](https://github.com/flutter/flutter/pull/181267) +* Bring Windows misc coverage out of bringup by @dkwingsmt in [182332](https://github.com/flutter/flutter/pull/182332) +* Marks Mac_arm64_mokey entrypoint_dart_registrant unflaky by @jmagman in [181648](https://github.com/flutter/flutter/pull/181648) +* [pv]add integration test for original untappable web view link behind context menu bug by @hellohuanlin in [182111](https://github.com/flutter/flutter/pull/182111) +* Update CHANGELOG for 3.41.2 stable hotfix by @LongCatIsLooong in [182647](https://github.com/flutter/flutter/pull/182647) +* [Impeller] libImpeller: Dispose thread local caches on each Vulkan frame by @jason-simmons in [182402](https://github.com/flutter/flutter/pull/182402) +* Don't compile shaders to SkSL unless --sksl arg is present by @b-luk in [182519](https://github.com/flutter/flutter/pull/182519) +* Clarify batch release mode requirements by @chunhtai in [182228](https://github.com/flutter/flutter/pull/182228) +* Update roadmap for 2026 by @twerske in [182798](https://github.com/flutter/flutter/pull/182798) +* Refactor impellerc_main to better organize some of its logic by @b-luk in [182783](https://github.com/flutter/flutter/pull/182783) +* Replace more references to `flutter/engine` with `flutter/flutter` by @AbdeMohlbi in [182654](https://github.com/flutter/flutter/pull/182654) +* Fix a race in EmbedderTest.CanSpecifyCustomUITaskRunner by @jason-simmons in [182649](https://github.com/flutter/flutter/pull/182649) +* [Impeller] Fix fail to render pixel buffer texture on Linux by @xiaowei-guan in [181656](https://github.com/flutter/flutter/pull/181656) +* docs(Path): clarify that zero-length contours are excluded from computeMetrics by @nathannewyen in [180165](https://github.com/flutter/flutter/pull/180165) +* Rename "dart-pkg" to "dart_pkg" in the Fuchsia Flutter Engine by @mbrase in [182574](https://github.com/flutter/flutter/pull/182574) +* Call dart::bin::Platform::Initialize during Dart VM startup by @jason-simmons in [182689](https://github.com/flutter/flutter/pull/182689) +* Update package contrib docs for batched release by @stuartmorgan-g in [182865](https://github.com/flutter/flutter/pull/182865) +* Roll ImGui to v1.92.6-docking by @jason-simmons in [182799](https://github.com/flutter/flutter/pull/182799) +* Fix typos in method names across multiple files by @itsAdityaRathore in [182584](https://github.com/flutter/flutter/pull/182584) +* Add calls to await `flutterDriver.waitUntilFirstFrameRasterized()` for all `android_engine_test` screenshot tests by @gmackall in [182961](https://github.com/flutter/flutter/pull/182961) +* [ CI ] Don't crash analysis when ktlint isn't on PATH by @bkonyi in [181854](https://github.com/flutter/flutter/pull/181854) +* Roll zlib to 7eda07b1e067 by @jason-simmons in [182692](https://github.com/flutter/flutter/pull/182692) +* chore: Don't unconditionally check tools/gn formatting by @harryterkelsen in [182973](https://github.com/flutter/flutter/pull/182973) +* licenses_cpp: pre-land changes for perfetto update by @gaaclarke in [182965](https://github.com/flutter/flutter/pull/182965) +* Ignore unawaited_futures lint in dev/automated_tests by @victorsanni in [182922](https://github.com/flutter/flutter/pull/182922) +* Adds float32 output to `Image.toByteData()` in float32 Image by @gaaclarke in [182847](https://github.com/flutter/flutter/pull/182847) +* [Impeller] For Android hardware buffers on Vulkan, use an alpha value of 1 if the buffer format always has opaque alpha by @jason-simmons in [182974](https://github.com/flutter/flutter/pull/182974) +* Add information to issue triage page by @stuartmorgan-g in [182145](https://github.com/flutter/flutter/pull/182145) +* [rules] Fix a few issues in the full-length rules file by @parlough in [182725](https://github.com/flutter/flutter/pull/182725) +* Merge changelog from 3.41.3. by @eyebrowsoffire in [183131](https://github.com/flutter/flutter/pull/183131) +* [workflow] Update the changelog merge action to fetch the stable branch by @itsjustkevin in [183132](https://github.com/flutter/flutter/pull/183132) +* fix: bump matcher by @jtmcdole in [183167](https://github.com/flutter/flutter/pull/183167) +* [ios]uitest for admob banner in scrollable list gesture issue by @hellohuanlin in [183128](https://github.com/flutter/flutter/pull/183128) +* Add dev/benchmarks/README.md by @loic-sharma in [182976](https://github.com/flutter/flutter/pull/182976) +* Use dart::bin::SetupDartIo to setup dart:io by @mraleph in [176714](https://github.com/flutter/flutter/pull/176714) +* Fix docs on SingletonFlutterWindow.supportsShowingSystemContextMenu by @loic-sharma in [183142](https://github.com/flutter/flutter/pull/183142) +* Merge changelog from 3.41.4 stable. by @eyebrowsoffire in [183243](https://github.com/flutter/flutter/pull/183243) +* Add Michal Kucharski to AUTHORS by @mkucharski17 in [182366](https://github.com/flutter/flutter/pull/182366) +* chore: convert android_verified_input to pub-workspace by @jtmcdole in [183175](https://github.com/flutter/flutter/pull/183175) +* Replace the rest of the references to `flutter/engine` with `flutter/flutter` by @AbdeMohlbi in [182938](https://github.com/flutter/flutter/pull/182938) +* Update Dart to 3.12 beta 2 by @liamappelbe in [183251](https://github.com/flutter/flutter/pull/183251) +* Extend the Linux web_skwasm_tests_1 timeout to 45 minutes by @jason-simmons in [183247](https://github.com/flutter/flutter/pull/183247) +* Simplify TesterContextGLES (multithreading logic not needed), and enable some tests that now pass by @b-luk in [183250](https://github.com/flutter/flutter/pull/183250) +* Roll pub packages by @flutter-pub-roller-bot in [183178](https://github.com/flutter/flutter/pull/183178) +* [Impeller] Fix new convex path shadow generation in perspective by @flar in [183187](https://github.com/flutter/flutter/pull/183187) +* Add GitHub workflows to assist with release tasks by @eyebrowsoffire in [181978](https://github.com/flutter/flutter/pull/181978) +* Fix typo in README by @mboetger in [183245](https://github.com/flutter/flutter/pull/183245) +* Add back in accidentally removed line from `create_updated_flutter_deps.py` by @eyebrowsoffire in [183314](https://github.com/flutter/flutter/pull/183314) +* [Impeller] Do not wait for a frame's acquire fence if the frame was never presented by @jason-simmons in [183288](https://github.com/flutter/flutter/pull/183288) +* [doc]add discord channel to ios triage meeting by @hellohuanlin in [183285](https://github.com/flutter/flutter/pull/183285) +* Support BGRA textures in BlitCopyTextureToBufferCommandGLES::Encode and fix improper mapping of BGRA to RGBA in blit_command_gles and texture_gles by @b-luk in [182397](https://github.com/flutter/flutter/pull/182397) +* Updates tests commit by @FMorschel in [183301](https://github.com/flutter/flutter/pull/183301) +* Cleanup MockVulkan when the vulkan instance is destroyed by @gaaclarke in [183324](https://github.com/flutter/flutter/pull/183324) +* Add a note to `arcTo` docs about the 2PI drawing angle issue by @AbdeMohlbi in [183293](https://github.com/flutter/flutter/pull/183293) +* Standardize skia includes. by @chingjun in [183404](https://github.com/flutter/flutter/pull/183404) +* Update org triage by @Piinks in [183254](https://github.com/flutter/flutter/pull/183254) +* Add Alexander Dmitriev to AUTHORS by @BrainLUX in [183357](https://github.com/flutter/flutter/pull/183357) +* Update 'a: text input' globs by @loic-sharma in [183405](https://github.com/flutter/flutter/pull/183405) +* Migrated circle sdf to euclidean 2d derivative by @gaaclarke in [183184](https://github.com/flutter/flutter/pull/183184) +* DlDeferredImageGPUImpeller::ImageWrapper texture thread safety improvements by @jason-simmons in [183429](https://github.com/flutter/flutter/pull/183429) +* [Impeller] Do not log VK_ERROR_SURFACE_LOST_KHR errors returned by vkAcquireNextImageKHR by @jason-simmons in [183338](https://github.com/flutter/flutter/pull/183338) +* dev: Use a super-parameter in several missed cases by @srawlins in [182251](https://github.com/flutter/flutter/pull/182251) +* Roll pub packages by @flutter-pub-roller-bot in [183467](https://github.com/flutter/flutter/pull/183467) +* Fix GitHub workflows to use the `flutteractionsbot` mirror for PR branches. by @eyebrowsoffire in [183470](https://github.com/flutter/flutter/pull/183470) +* Add GLES support for the same pixel formats for copying texture -> buffer as when copying buffer -> texture by @b-luk in [183428](https://github.com/flutter/flutter/pull/183428) +* [impeller] Use the GLES3 shaders in the embedder if supported by @planetmarshall in [180072](https://github.com/flutter/flutter/pull/180072) +* Rename ExecutionModelToString to ExecutionModelToStringName. by @chingjun in [183461](https://github.com/flutter/flutter/pull/183461) +* ci: Run orchestrator for windows_arm_host_engine on Linux by @Gustl22 in [181075](https://github.com/flutter/flutter/pull/181075) +* Use CLA-approved email and username for github workflow commits. by @eyebrowsoffire in [183540](https://github.com/flutter/flutter/pull/183540) +* Re-enable gpu_test.dart for opengles, but disable specific tests in the file by @b-luk in [183531](https://github.com/flutter/flutter/pull/183531) +* Roll pub packages by @flutter-pub-roller-bot in [183541](https://github.com/flutter/flutter/pull/183541) +* Made cp labels get rejected on issues. by @gaaclarke in [183595](https://github.com/flutter/flutter/pull/183595) +* [web] Fix Web SDK build on macOS by @harryterkelsen in [183549](https://github.com/flutter/flutter/pull/183549) +* Specified the repo the cp label will be removed from by @gaaclarke in [183611](https://github.com/flutter/flutter/pull/183611) +* Use operator<=> instead of std::less for UniqueID. by @chingjun in [183600](https://github.com/flutter/flutter/pull/183600) +* ci: Remove `bringup` from orchestrator for windows_arm_host_engine on Linux by @Gustl22 in [183574](https://github.com/flutter/flutter/pull/183574) +* Update android integration test to match the current android semantics by @chunhtai in [183548](https://github.com/flutter/flutter/pull/183548) +* Adds complex layout impeller startup benchmark by @gaaclarke in [183655](https://github.com/flutter/flutter/pull/183655) +* Add some quality of life improvements to the release GitHub workflows. by @eyebrowsoffire in [183658](https://github.com/flutter/flutter/pull/183658) +* Use properties to configure leak_tracking and test_randomization_off in .ci.yaml by @jason-simmons in [183605](https://github.com/flutter/flutter/pull/183605) +* Adds github action to reset cicd when new branches come by @gaaclarke in [183675](https://github.com/flutter/flutter/pull/183675) +* Filter 'waiting for customer response' issues from macOS triage by @loic-sharma in [183552](https://github.com/flutter/flutter/pull/183552) +* docs: add code review guidance to CONTRIBUTING.md by @lamek in [182778](https://github.com/flutter/flutter/pull/182778) +* Fix formatting, capitalization, and grammar in activation issue template by @sanketudaypatil in [183061](https://github.com/flutter/flutter/pull/183061) +* Adds flush to metal screenshotter. by @gaaclarke in [183758](https://github.com/flutter/flutter/pull/183758) +* Adds platform_view_test_macos_impeller by @gaaclarke in [183760](https://github.com/flutter/flutter/pull/183760) +* Update goldctl version by @mdebbar in [183538](https://github.com/flutter/flutter/pull/183538) +* [build] Generate debug info for assembly. by @rmacnak-google in [183425](https://github.com/flutter/flutter/pull/183425) +* Adds macos impeller new gallery transition perf test. by @gaaclarke in [183802](https://github.com/flutter/flutter/pull/183802) +* Update android triage process to not look at unassigned p1s every week by @gmackall in [183805](https://github.com/flutter/flutter/pull/183805) +* Encode source file patches as UTF-8 in the code formatter script by @jason-simmons in [183761](https://github.com/flutter/flutter/pull/183761) +* [Impeller] Do not delete the GL object in a HandleGLES if the handle has a cleanup callback by @jason-simmons in [183561](https://github.com/flutter/flutter/pull/183561) +* Update CHANGELOG for Flutter 3.41.5 release by @camsim99 in [183851](https://github.com/flutter/flutter/pull/183851) +* Roll pub packages by @flutter-pub-roller-bot in [183781](https://github.com/flutter/flutter/pull/183781) +* [wimp] MSAA support by @eyebrowsoffire in [183807](https://github.com/flutter/flutter/pull/183807) +* updates logic for determining if cicd label is outdated by @gaaclarke in [183905](https://github.com/flutter/flutter/pull/183905) +* Add some extra slack room for stroked and filled circles that use the SDF shader by @walley892 in [183536](https://github.com/flutter/flutter/pull/183536) +* Add note about gclient sync network failures and workaround by @ashoknarayan in [183794](https://github.com/flutter/flutter/pull/183794) +* chore: deflake Linux_android_emu android_display_cutout by @jtmcdole in [183522](https://github.com/flutter/flutter/pull/183522) +* Keep glyphs for variable fonts by @gmackall in [183857](https://github.com/flutter/flutter/pull/183857) +* fix gaussian blur getting clipped with negative scale by @walley892 in [184037](https://github.com/flutter/flutter/pull/184037) +* Add LeanCode and contributors to AUTHORS by @mkucharski17 in [182997](https://github.com/flutter/flutter/pull/182997) +* Refactor: Removes Geometry field from ColorSourceContents by @gaaclarke in [183952](https://github.com/flutter/flutter/pull/183952) +* Roll Dart DevTools to a version with correct CIPD tags by @jason-simmons in [184172](https://github.com/flutter/flutter/pull/184172) +* Adds explicit name to the cicd label job. by @gaaclarke in [184070](https://github.com/flutter/flutter/pull/184070) +* Add notes on HCPP to `Android-Platform-Views.md` by @gmackall in [183859](https://github.com/flutter/flutter/pull/183859) +* Fix merge changelog workflow. by @eyebrowsoffire in [184145](https://github.com/flutter/flutter/pull/184145) +* Expand simple shape path optimization logic and move it from dl_dispatcher to dl_builder by @b-luk in [184096](https://github.com/flutter/flutter/pull/184096) +* Revert "Keep glyphs for variable fonts (#183857)" by @jason-simmons in [184147](https://github.com/flutter/flutter/pull/184147) +* fix: use atomic write for engine.stamp to prevent race conditions by @b055man in [184131](https://github.com/flutter/flutter/pull/184131) +* [ios]add ci/cd label to ios triage by @hellohuanlin in [184214](https://github.com/flutter/flutter/pull/184214) +* Update changelog for 3.41.6 stable hotfix by @walley892 in [184220](https://github.com/flutter/flutter/pull/184220) +* Update iOS/macOS flutter_tools CODEOWNERS by @jmagman in [183287](https://github.com/flutter/flutter/pull/183287) +* Build engine for windows_arm on beta and stable by @Gustl22 in [176385](https://github.com/flutter/flutter/pull/176385) +* Add foundation for uber SDF shader and Contents by @gaaclarke in [183864](https://github.com/flutter/flutter/pull/183864) +* [Flutter GPU] Improve context initialization error messages by @bdero in [183986](https://github.com/flutter/flutter/pull/183986) +* [a11y] fix selected tristate flags mismatch by @hannah-hyj in [184223](https://github.com/flutter/flutter/pull/184223) +* Enables sdf lines for metalsdf by @gaaclarke in [183809](https://github.com/flutter/flutter/pull/183809) +* Add drawPath documentation about preferring other methods for drawing simple shapes by @b-luk in [184253](https://github.com/flutter/flutter/pull/184253) +* Roll HarfBuzz to 13.2.1 by @jason-simmons in [184210](https://github.com/flutter/flutter/pull/184210) +* Bump codecov/codecov-action from 5.5.0 to 6.0.0 in the all-github-actions group by @dependabot[bot] in [184364](https://github.com/flutter/flutter/pull/184364) +* Roll pub packages by @flutter-pub-roller-bot in [184045](https://github.com/flutter/flutter/pull/184045) +* Rick roll triagers on/near April 1st by @justinmc in [184355](https://github.com/flutter/flutter/pull/184355) +* Remove an obsolete script for setting up remote GDB sessions on Android devices by @jason-simmons in [184357](https://github.com/flutter/flutter/pull/184357) +* Fixes a flake in reload shaders tests by @gaaclarke in [184268](https://github.com/flutter/flutter/pull/184268) +* Remove the cupertino_icons dependency from the spell_check integration test by @jason-simmons in [184398](https://github.com/flutter/flutter/pull/184398) +* Remove the default_git_folder GN argument by @jason-simmons in [184152](https://github.com/flutter/flutter/pull/184152) +* [Impeller] Do not log an error when wrapping an empty texture as a TextureGLES by @jason-simmons in [184377](https://github.com/flutter/flutter/pull/184377) +* Adds uber sdf shader gradients with blend by @gaaclarke in [184090](https://github.com/flutter/flutter/pull/184090) +* Prepare for skills adoption by @reidbaker in [184129](https://github.com/flutter/flutter/pull/184129) +* [fix-forward] fix build_android_host_app_with_module_source integration test by @jesswrd in [184466](https://github.com/flutter/flutter/pull/184466) +* Moves android_semantics_integration_test out of staging by @chunhtai in [184079](https://github.com/flutter/flutter/pull/184079) +* Support different joins for stroked rects in uber_sdf, fix incorrect aa by @b-luk in [184395](https://github.com/flutter/flutter/pull/184395) +* Fix wide gamut macos integration test by @walley892 in [184427](https://github.com/flutter/flutter/pull/184427) +* Reverts "Roll ICU from ee5f27adc28b to ff7995a708a1 (5 revisions) (#184566)" by @auto-submit[bot] in [184586](https://github.com/flutter/flutter/pull/184586) +* Skill to find dart or flutter revision from a hash by @reidbaker in [184589](https://github.com/flutter/flutter/pull/184589) +* Add suggestion for what types of skills are helpful by @reidbaker in [184661](https://github.com/flutter/flutter/pull/184661) +* Fix go/ links in rbe.mde by @b-luk in [184672](https://github.com/flutter/flutter/pull/184672) +* [Fix-forward] Added Compose plugin to Add-to-app Integration Test by @jesswrd in [184681](https://github.com/flutter/flutter/pull/184681) +* Add a github workflow for reverting PRs. by @eyebrowsoffire in [184593](https://github.com/flutter/flutter/pull/184593) +* Remove bringup label for resharded Windows tool_integration_tests shards by @bkonyi in [184721](https://github.com/flutter/flutter/pull/184721) +* [ci] mac build_test bringup false by @dcharkes in [184738](https://github.com/flutter/flutter/pull/184738) +* Replace hard coded max path length with system defined one. by @robert-ancell in [184697](https://github.com/flutter/flutter/pull/184697) +* Remove custom `analysis_options.yaml` from `imitation_game_flutter` by @goderbauer in [184717](https://github.com/flutter/flutter/pull/184717) +* Try one more again by @Piinks in [184767](https://github.com/flutter/flutter/pull/184767) +* Allow personal skills to be gitignored by @vashworth in [184727](https://github.com/flutter/flutter/pull/184727) +* [ci] mac_arm64 build_test re-enable shard 1 presubmit by @dcharkes in [184751](https://github.com/flutter/flutter/pull/184751) +* Fix repo check on code freeze by @Piinks in [184771](https://github.com/flutter/flutter/pull/184771) +* Roll pub packages by @flutter-pub-roller-bot in [184772](https://github.com/flutter/flutter/pull/184772) +* Correctly handle failure to read /proc/self/exe link by @robert-ancell in [184700](https://github.com/flutter/flutter/pull/184700) +* [fuchsia] Give AOT runners the ability to copy FFI callback thunks. by @rmacnak-google in [184696](https://github.com/flutter/flutter/pull/184696) +* Update to the beta dart version for 3.44 branch cut. by @reidbaker in [184770](https://github.com/flutter/flutter/pull/184770) +* Change freeze flow to pull_request_target by @Piinks in [184785](https://github.com/flutter/flutter/pull/184785) +* 3 44 inital beta bump engine version by @reidbaker in [184883](https://github.com/flutter/flutter/pull/184883) +* [CP-beta]Disable multi-pack-index when calling flutter from Xcode by @flutteractionsbot in [185100](https://github.com/flutter/flutter/pull/185100) +* [flutter-3.44-candidate.0] Update Flutter DEPS to Dart 963eac24852a989a1244586fea61b173e98677dd by @flutteractionsbot in [185114](https://github.com/flutter/flutter/pull/185114) +* [CP-beta]Don't use `git add -N` in the sync engine workflow. by @flutteractionsbot in [185130](https://github.com/flutter/flutter/pull/185130) +* [flutter-3.44-candidate.0] Sync engine.version to 86ee39d2595de3a2a2cee84372bf925d774d3a6f by @flutteractionsbot in [185135](https://github.com/flutter/flutter/pull/185135) +* [CP-beta]Check for overflow when computing the pixel buffer size for an animated PNG frame by @flutteractionsbot in [185620](https://github.com/flutter/flutter/pull/185620) +* [CP-beta]Fix sdfs being enabled for MacOS regardless of FLTEnableSDFs value by @flutteractionsbot in [185680](https://github.com/flutter/flutter/pull/185680) +* [flutter-3.44-candidate.0] Update Flutter DEPS to Dart 9dc12969f5526d1bf1c2b48197d1608a68075866 by @flutteractionsbot in [185757](https://github.com/flutter/flutter/pull/185757) +* [flutter-3.44-candidate.0] Sync engine.version to 73dc1ccd62aec198da4aefde1dae20b1167b131d by @flutteractionsbot in [185771](https://github.com/flutter/flutter/pull/185771) + +## New contributors + +* @Koichi5 made their first contribution in [180172](https://github.com/flutter/flutter/pull/180172) +* @vhaudiquet made their first contribution in [178711](https://github.com/flutter/flutter/pull/178711) +* @augustocesarperin made their first contribution in [180824](https://github.com/flutter/flutter/pull/180824) +* @jonmountjoy made their first contribution in [178643](https://github.com/flutter/flutter/pull/178643) +* @ikramhasan made their first contribution in [181050](https://github.com/flutter/flutter/pull/181050) +* @chaopeng made their first contribution in [181044](https://github.com/flutter/flutter/pull/181044) +* @aaazlkm made their first contribution in [180100](https://github.com/flutter/flutter/pull/180100) +* @Enderjua made their first contribution in [181041](https://github.com/flutter/flutter/pull/181041) +* @Lilian-C made their first contribution in [180577](https://github.com/flutter/flutter/pull/180577) +* @IvoneDjaja made their first contribution in [177895](https://github.com/flutter/flutter/pull/177895) +* @chris-prenissl made their first contribution in [181082](https://github.com/flutter/flutter/pull/181082) +* @Turskyi made their first contribution in [181475](https://github.com/flutter/flutter/pull/181475) +* @AnishTiwari5077 made their first contribution in [180367](https://github.com/flutter/flutter/pull/180367) +* @westito made their first contribution in [181720](https://github.com/flutter/flutter/pull/181720) +* @jonathimer made their first contribution in [175587](https://github.com/flutter/flutter/pull/175587) +* @Erengun made their first contribution in [181657](https://github.com/flutter/flutter/pull/181657) +* @patrickBillingsley made their first contribution in [181579](https://github.com/flutter/flutter/pull/181579) +* @yeltayev22 made their first contribution in [181807](https://github.com/flutter/flutter/pull/181807) +* @GiancarloCante made their first contribution in [180944](https://github.com/flutter/flutter/pull/180944) +* @ashoknarayan made their first contribution in [180469](https://github.com/flutter/flutter/pull/180469) +* @caijw made their first contribution in [181440](https://github.com/flutter/flutter/pull/181440) +* @HuQian made their first contribution in [182057](https://github.com/flutter/flutter/pull/182057) +* @crackedhandle made their first contribution in [182051](https://github.com/flutter/flutter/pull/182051) +* @martinetd made their first contribution in [181984](https://github.com/flutter/flutter/pull/181984) +* @LailaiMaster made their first contribution in [180386](https://github.com/flutter/flutter/pull/180386) +* @RickyvdBerg made their first contribution in [181966](https://github.com/flutter/flutter/pull/181966) +* @safwanidrees made their first contribution in [180257](https://github.com/flutter/flutter/pull/180257) +* @mkucharski17 made their first contribution in [182079](https://github.com/flutter/flutter/pull/182079) +* @EricApostal made their first contribution in [182273](https://github.com/flutter/flutter/pull/182273) +* @gbolahan507 made their first contribution in [182211](https://github.com/flutter/flutter/pull/182211) +* @ilyosbek22 made their first contribution in [181721](https://github.com/flutter/flutter/pull/181721) +* @devnoaman made their first contribution in [180814](https://github.com/flutter/flutter/pull/180814) +* @akhil-ge0rge made their first contribution in [181658](https://github.com/flutter/flutter/pull/181658) +* @Akshat-Shuklaaa made their first contribution in [182461](https://github.com/flutter/flutter/pull/182461) +* @Valansch made their first contribution in [181716](https://github.com/flutter/flutter/pull/181716) +* @twerske made their first contribution in [182798](https://github.com/flutter/flutter/pull/182798) +* @xiaowei-guan made their first contribution in [181656](https://github.com/flutter/flutter/pull/181656) +* @jhonathanqz made their first contribution in [182684](https://github.com/flutter/flutter/pull/182684) +* @serbandin made their first contribution in [181931](https://github.com/flutter/flutter/pull/181931) +* @iamvikashtiwari made their first contribution in [181238](https://github.com/flutter/flutter/pull/181238) +* @BrainLUX made their first contribution in [182093](https://github.com/flutter/flutter/pull/182093) +* @mbcorona made their first contribution in [182785](https://github.com/flutter/flutter/pull/182785) +* @itsAdityaRathore made their first contribution in [182584](https://github.com/flutter/flutter/pull/182584) +* @sero583 made their first contribution in [182224](https://github.com/flutter/flutter/pull/182224) +* @eMxPi made their first contribution in [182362](https://github.com/flutter/flutter/pull/182362) +* @nmfisher made their first contribution in [182999](https://github.com/flutter/flutter/pull/182999) +* @SpiralMomentum made their first contribution in [183070](https://github.com/flutter/flutter/pull/183070) +* @wangfeihang made their first contribution in [180563](https://github.com/flutter/flutter/pull/180563) +* @spydon made their first contribution in [182934](https://github.com/flutter/flutter/pull/182934) +* @Laurie-Lin made their first contribution in [181889](https://github.com/flutter/flutter/pull/181889) +* @Eyas made their first contribution in [176881](https://github.com/flutter/flutter/pull/176881) +* @lamek made their first contribution in [182778](https://github.com/flutter/flutter/pull/182778) +* @sanketudaypatil made their first contribution in [183061](https://github.com/flutter/flutter/pull/183061) +* @gktirkha made their first contribution in [180789](https://github.com/flutter/flutter/pull/180789) +* @mayanksharma9 made their first contribution in [183351](https://github.com/flutter/flutter/pull/183351) +* @NamanGoyalK made their first contribution in [183375](https://github.com/flutter/flutter/pull/183375) +* @algor made their first contribution in [183680](https://github.com/flutter/flutter/pull/183680) +* @b055man made their first contribution in [184131](https://github.com/flutter/flutter/pull/184131) +* @Silfalion made their first contribution in [183724](https://github.com/flutter/flutter/pull/183724) +* @nikb7 made their first contribution in [183650](https://github.com/flutter/flutter/pull/183650) +* @TrangLeQuynh made their first contribution in [183488](https://github.com/flutter/flutter/pull/183488) + +**Full Changelog**: https://github.com/flutter/flutter/compare/3.41.0...3.44.0-0.3.pre diff --git a/sites/docs/src/content/release/whats-new.md b/sites/docs/src/content/release/whats-new.md index 62279afed9..386a32d5c5 100644 --- a/sites/docs/src/content/release/whats-new.md +++ b/sites/docs/src/content/release/whats-new.md @@ -49,7 +49,7 @@ In addition to many smaller updates, here are some of the more significant changes: * We have introduced a new getting started experience for - both Flutter and Dart, as announced in a recent [blog post][fwe]. + both Flutter and Dart, as announced in a recent [blog post][few]. You can find the Flutter [learning pathway][] under the **Learn** tab at the top of [docs.flutter.dev][]. To return to the rest of the site, select the **Guides** tab. As always, the **Reference** @@ -68,7 +68,7 @@ significant changes: [bc-3-41]: /release/breaking-changes#released-in-flutter-3-41 [docs.flutter.dev]: / [Flutter API docs]: {{site.api}} -[fwe]: {{site.flutter-blog}}/announcing-our-new-dart-and-flutter-getting-started-experience-b8c4b2be0984 +[few]: {{site.flutter-blog}}/announcing-our-new-dart-and-flutter-getting-started-experience-b8c4b2be0984 [learning pathway]: /learn [navaronbracke]: {{site.github}}/navaronbracke [official glossary]: /resources/glossary diff --git a/sites/docs/src/content/resources/ads-overview.md b/sites/docs/src/content/resources/ads-overview.md index 69a210350a..6f8ce56025 100644 --- a/sites/docs/src/content/resources/ads-overview.md +++ b/sites/docs/src/content/resources/ads-overview.md @@ -10,14 +10,14 @@ showBreadcrumbs: false The Google Mobile Ads SDK for Flutter works with both AdMob and Ad Manager. It supports a variety -of ads formats such as app open, banner, interstitial, +of ad formats such as app open, banner, interstitial, native, rewarded, and rewarded interstitial formats, and features like mediation. Easily integrate Google AdMob and Ad Manager ads directly in your Flutter App -The the following resources can help get you started: +The following resources can help get you started: * [Add ads to your mobile Flutter app or game][] (cookbook recipe) * [Adding AdMob ads to a Flutter app][] (codelab) diff --git a/sites/docs/src/content/resources/in-app-purchases-overview.md b/sites/docs/src/content/resources/in-app-purchases-overview.md index 10aa2875ba..c50a70d2e4 100644 --- a/sites/docs/src/content/resources/in-app-purchases-overview.md +++ b/sites/docs/src/content/resources/in-app-purchases-overview.md @@ -11,7 +11,7 @@ showBreadcrumbs: false Build in-app revenue with Google Play and App Store support for Flutter -The the following resources can help get you started: +The following resources can help get you started: * [Add in-app purchases to your Flutter app][] (codelab) diff --git a/sites/docs/src/content/testing/common-errors.md b/sites/docs/src/content/testing/common-errors.md index ea18d0ddd7..e653dbda88 100644 --- a/sites/docs/src/content/testing/common-errors.md +++ b/sites/docs/src/content/testing/common-errors.md @@ -112,7 +112,7 @@ the `Column` tries to be wider than the space the `Row` (its parent) can allocate to it, causing an overflow error. Why does the `Column` try to do that? To understand this layout behavior, you need to know -how Flutter framework performs layout: +how the Flutter framework performs layout: "_To perform layout, Flutter walks the render tree in a depth-first traversal and **passes down size constraints** from parent to child… Children respond by diff --git a/sites/docs/src/content/tools/antigravity.md b/sites/docs/src/content/tools/antigravity.md index 5f5be92390..609c97b941 100644 --- a/sites/docs/src/content/tools/antigravity.md +++ b/sites/docs/src/content/tools/antigravity.md @@ -34,7 +34,7 @@ the [Antigravity site](https://antigravity.google/download). more or less control. Even if you select **Agent driven development**, which allows Antigravity to directly run commands without approval, you can specify certain commands that will _always_ ask - for your approval, such as the `rm` command to removes files. + for your approval, such as the `rm` command to remove files. 1.

Install the Dart and Flutter extensions

@@ -86,6 +86,14 @@ the [Antigravity site](https://antigravity.google/download). {:.steps} +## Agentic Hot Reload {: #agentic-hot-reload} + +If you are using Antigravity in Agent mode, +the agent can automatically hot reload your running application +when you prompt it to modify your app. +This enables a hands-free, "prompt-to-reload" workflow +that reduces context switching and development latency. + [ag-video]: {{site.youtube-site}}/watch?v=YY2w2JEX2xk&t=1s [Create a new Flutter app]: /reference/create-new-app#antigravity [vs-code]: /tools/vs-code diff --git a/sites/docs/src/content/tools/devtools/cpu-profiler.md b/sites/docs/src/content/tools/devtools/cpu-profiler.md index 83e36c9e7c..a927e7035e 100644 --- a/sites/docs/src/content/tools/devtools/cpu-profiler.md +++ b/sites/docs/src/content/tools/devtools/cpu-profiler.md @@ -70,10 +70,10 @@ pass the `--profile-startup` flag to `dart run` or `flutter run`. This table provides a bottom-up representation of a CPU profile. This means that each top-level method, -or root, in the bottom up table is actually the +or root, in the bottom-up table is actually the top method in the call stack for one or more CPU samples. -In other words, each top-level method in a bottom up -table is a leaf node from the top down table +In other words, each top-level method in a bottom-up +table is a leaf node from the top-down table (the call tree). In this table, a method can be expanded to show its _callers_. @@ -82,7 +82,7 @@ in a CPU profile. When a root node in this table has a high _self_ time, that means that many CPU samples in this profile ended with that method on top of the call stack. -![Screenshot of the Bottom up view](/assets/images/docs/tools/devtools/bottom-up-view.png) +![Screenshot of the Bottom-up view](/assets/images/docs/tools/devtools/bottom-up-view.png) See the [Guidelines](#guidelines) section below to learn how to enable the blue and green vertical lines seen in this image. @@ -105,7 +105,7 @@ this is the self time of the top-level method (the callee) when called through the child method (the caller). **Table element** (self time) -![Screenshot of a bottom up table](/assets/images/docs/tools/devtools/table-element.png) +![Screenshot of a bottom-up table](/assets/images/docs/tools/devtools/table-element.png) ### Call tree diff --git a/sites/docs/src/content/tools/devtools/inspector.md b/sites/docs/src/content/tools/devtools/inspector.md index fb6d45f043..16118bc0d7 100644 --- a/sites/docs/src/content/tools/devtools/inspector.md +++ b/sites/docs/src/content/tools/devtools/inspector.md @@ -875,7 +875,7 @@ Let us know if there are issues preventing you from using the new inspector by [ By default, DevTools limits the widgets displayed in the widget tree to those created in the project's root directory. To see all widgets, including those created outside -of a the project's root directory, toggle on [Show implementation widgets][] +of a project's root directory, toggle on [Show implementation widgets][] In order to include other widgets in the default widget tree, a parent directory of theirs must be added to the Package Directories. diff --git a/sites/docs/src/content/tools/devtools/legacy-inspector.md b/sites/docs/src/content/tools/devtools/legacy-inspector.md index 0c44c87690..cc359a3b71 100644 --- a/sites/docs/src/content/tools/devtools/legacy-inspector.md +++ b/sites/docs/src/content/tools/devtools/legacy-inspector.md @@ -112,7 +112,7 @@ constraints. Additionally, the explorer shows layout constraint violations and render overflow errors. Violated layout constraints are colored red, and overflow errors are presented in the -standard "yellow-tape" pattern, as you might see on a running +standard "yellow-tape" pattern, as you might see on a running device. These visualizations aim to improve understanding of why overflow errors occur as well as how to fix them. diff --git a/sites/docs/src/content/tools/devtools/release-notes/release-notes-2.28.5.md b/sites/docs/src/content/tools/devtools/release-notes/release-notes-2.28.5.md index b370b2f7cc..0712b262a8 100644 --- a/sites/docs/src/content/tools/devtools/release-notes/release-notes-2.28.5.md +++ b/sites/docs/src/content/tools/devtools/release-notes/release-notes-2.28.5.md @@ -19,7 +19,7 @@ To learn about the improvements included in DevTools 2.28.4, please read the * Only cache pub root directories added by the user. - [#6897](https://github.com/flutter/devtools/pull/6897) -* Remove Flutter pub root if it was accidently cached. - [#6911](https://github.com/flutter/devtools/pull/6911) +* Remove Flutter pub root if it was accidentally cached. - [#6911](https://github.com/flutter/devtools/pull/6911) ## DevTools Extension updates diff --git a/sites/docs/src/content/tools/hot-reload.md b/sites/docs/src/content/tools/hot-reload.md index b98e9fc5a5..fab579aee4 100644 --- a/sites/docs/src/content/tools/hot-reload.md +++ b/sites/docs/src/content/tools/hot-reload.md @@ -32,9 +32,19 @@ Flutter 框架会自动重新构建 widget 树,以便你可以快速查看更 ## 如何进行热重载 -To hot reload a Flutter app: +If you are using an AI coding assistant like [Google Antigravity](/tools/antigravity), +you can use Agent mode to automatically hot reload your running application +as soon as you prompt the agent to apply changes. +For details, see [Agentic Hot Reload](/tools/antigravity#agentic-hot-reload). -想要热重载 Flutter 应用: +如果你正在使用类似 [Google Antigravity](/tools/antigravity) 这样的 AI 编程助手, +你可以通过 Agent 模式,在你使用提示词 (prompt) 更改应用后, +自动热重载正在运行的应用程序。 +详情请参见 [Agentic 热重载](/tools/antigravity#agentic-hot-reload)。 + +To hot reload a Flutter app manually: + +想要手动热重载 Flutter 应用: 1. Run the app from a supported [Flutter editor][] or a terminal window. Either a physical or virtual device can be the target. @@ -147,11 +157,11 @@ and full restart?** * **Hot reload** loads code changes into the VM or the browser, and re-builds the widget tree, preserving the app state; it doesn't rerun `main()` or `initState()`. - (`⌘\` in Intellij and Android Studio, `⌃F5` in VSCode) + (`⌘\` in IntelliJ and Android Studio, `⌃F5` in VSCode) **热重载** 会将代码更改转入 VM 或者浏览器,重建 widget 树并保持应用的状态, 整个过程不会重新运行 `main()` 或者 `initState()`。 - (在 IDEA 中的快捷键是 `⌘\`,在 VSCode 中是 `⌃F5`) + (在 IntelliJ 和 Android Studio 中的快捷键是 `⌘\`,在 VSCode 中是 `⌃F5`) * **Hot restart** loads code changes into the VM or the browser, and restarts the Flutter app, losing the app state. diff --git a/sites/docs/src/content/tools/pubspec.md b/sites/docs/src/content/tools/pubspec.md index b69f932828..27e3fd007e 100644 --- a/sites/docs/src/content/tools/pubspec.md +++ b/sites/docs/src/content/tools/pubspec.md @@ -110,7 +110,7 @@ publish_to: none version: 1.0.0+1 environment: - sdk: ^3.11.0 + sdk: ^3.12.0 dependencies: [!flutter:!] # Required for every Flutter project @@ -235,7 +235,7 @@ flutter: ``` ```yaml -# flavor_path_field strucure +# flavor_path_field structure - path: path/to/directory flavors: - flavor_name diff --git a/sites/docs/src/content/ui/adaptive-responsive/more-info.md b/sites/docs/src/content/ui/adaptive-responsive/more-info.md index 71d4c4f117..91f15b8c78 100644 --- a/sites/docs/src/content/ui/adaptive-responsive/more-info.md +++ b/sites/docs/src/content/ui/adaptive-responsive/more-info.md @@ -9,7 +9,7 @@ shortTitle: Learn ## Examples If you'd like to see how the adaptive and responsive -concepts (as described in these pages) come together. +concepts (as described in these pages) come together, check out the source code for the following apps: * [Wonderous][] diff --git a/sites/docs/src/content/ui/assets/asset-transformation.md b/sites/docs/src/content/ui/assets/asset-transformation.md index ed443d1e3f..d38da5d249 100644 --- a/sites/docs/src/content/ui/assets/asset-transformation.md +++ b/sites/docs/src/content/ui/assets/asset-transformation.md @@ -73,7 +73,7 @@ the file to transform and `--output`, which is the location where the transformer code must write its output to. If the transformer finishes with a non-zero exit code, the application build -fails with error message explaining that transformation of the asset failed. +fails with an error message explaining that transformation of the asset failed. Anything written to the [`stderr`] stream of the process by the transformer is included in the error message. diff --git a/sites/docs/src/content/ui/interactivity/focus.md b/sites/docs/src/content/ui/interactivity/focus.md index 83c5401984..855feedff4 100644 --- a/sites/docs/src/content/ui/interactivity/focus.md +++ b/sites/docs/src/content/ui/interactivity/focus.md @@ -531,7 +531,7 @@ to switch between a "touch" mode and a "traditional" (mouse and keyboard) mode for their focus highlights. When a user is using touch to navigate, the focus highlight is usually hidden, and when they switch to a mouse or keyboard, the focus highlight needs to be shown again so they know what is focused. The -`hightlightStrategy` tells the focus manager how to interpret changes in the +`highlightStrategy` tells the focus manager how to interpret changes in the usage mode of the device: it can either automatically switch between the two based on the most recent input events, or it can be locked in touch or traditional modes. The provided widgets in Flutter already know how to use this diff --git a/sites/docs/src/content/ui/internationalization/index.md b/sites/docs/src/content/ui/internationalization/index.md index 3cdb6d817f..872b0f0a62 100644 --- a/sites/docs/src/content/ui/internationalization/index.md +++ b/sites/docs/src/content/ui/internationalization/index.md @@ -1624,7 +1624,7 @@ check out the [flutter_localizations README][]. Once you've implemented your language-specific subclasses of `GlobalMaterialLocalizations` and `LocalizationsDelegate`, -you need to add the language and a delegate instance to your app. +you need to add the language and a delegate instance to your app. The following code sets the app's language to Nynorsk and adds the `NnMaterialLocalizations` delegate instance to the app's `localizationsDelegates` list: @@ -1788,7 +1788,7 @@ Rebuilding `l10n/messages_all.dart` requires two steps. 2. With the app's root directory as the current directory, generate `intl_messages_.dart` for each `intl_.arb` file and `intl_messages_all.dart`, - which imports all of the messages files: + which imports all the message files: 在 app 的根目录,生成每个 `intl_.arb` 文件对应的 `intl_messages_.dart` 文件, diff --git a/sites/docs/src/data/sidenav/default.yml b/sites/docs/src/data/sidenav/default.yml index 37dfad8e88..e88cb9663a 100644 --- a/sites/docs/src/data/sidenav/default.yml +++ b/sites/docs/src/data/sidenav/default.yml @@ -419,14 +419,14 @@ permalink: /platform-integration/ios/ios-debugging - title: 在 iOS 上恢复状态 permalink: /platform-integration/ios/restore-state-ios - - title: Linux 操作系统平台 + - title: Linux 平台 permalink: /platform-integration/linux children: - title: 配置 Linux 开发 permalink: /platform-integration/linux/setup - title: 构建 Linux 桌面软件 permalink: /platform-integration/linux/building - - title: macOS 操作系统平台 + - title: macOS 平台 permalink: /platform-integration/macos children: - title: 配置 macOS 开发 @@ -460,7 +460,7 @@ permalink: /platform-integration/web/web-images - title: Web 平台常见问题 permalink: /platform-integration/web/faq - - title: Windows 操作系统平台 + - title: Windows 平台 permalink: /platform-integration/windows children: - title: 配置 Windows 开发 @@ -602,7 +602,7 @@ children: - title: 概览 permalink: /add-to-app - - title: 将 Flutter 添加到现有 Android 应用 + - title: 添加到现有 Android 应用 permalink: /add-to-app/android children: - title: 工程设定 @@ -615,14 +615,21 @@ permalink: /add-to-app/android/add-flutter-view - title: Plugin 初始化 permalink: /add-to-app/android/plugin-setup - - title: 将 Flutter 添加到现有 iOS 应用 + - title: 添加到现有 iOS 应用 permalink: /add-to-app/ios children: - title: 工程设定 permalink: /add-to-app/ios/project-setup - title: 添加单个 Flutter 页面 permalink: /add-to-app/ios/add-flutter-screen - - title: 添加到 Web 应用 + - title: 添加到现有 macOS 应用 + permalink: /add-to-app/macos + children: + - title: 工程设定 + permalink: /add-to-app/macos/project-setup + - title: 添加单个 Flutter 页面 + permalink: /add-to-app/macos/add-flutter-screen + - title: 添加到现有 Web 应用 permalink: /platform-integration/web/embedding-flutter-web - title: 调试内嵌的 Flutter module permalink: /add-to-app/debugging diff --git a/sites/docs/src/data/site.yml b/sites/docs/src/data/site.yml index 38013c997e..ca59ca9327 100644 --- a/sites/docs/src/data/site.yml +++ b/sites/docs/src/data/site.yml @@ -69,7 +69,7 @@ bili: embed: 'https://player.bilibili.com/player.html' std-size: 'width="560" height="315"' -currentFlutterVersion: '3.41.5' +currentFlutterVersion: '3.44.0' # Settings for Jaspr. diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/build-phase-run-script.png b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/build-phase-run-script.png new file mode 100644 index 0000000000..7befb12423 Binary files /dev/null and b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/build-phase-run-script.png differ diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutter-build-mode.png b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutter-build-mode.png new file mode 100644 index 0000000000..6edbf8df94 Binary files /dev/null and b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutter-build-mode.png differ diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutternativeintegration-library.png b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutternativeintegration-library.png new file mode 100644 index 0000000000..2e709c9af3 Binary files /dev/null and b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutternativeintegration-library.png differ diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutternativeintegration-relative-location.png b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutternativeintegration-relative-location.png new file mode 100644 index 0000000000..e855a1195c Binary files /dev/null and b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/flutternativeintegration-relative-location.png differ diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/pre-action.png b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/pre-action.png new file mode 100644 index 0000000000..ce32a202f3 Binary files /dev/null and b/sites/docs/web/assets/images/docs/development/add-to-app/ios/project-setup-swiftpm/pre-action.png differ diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/allow-jit-build-setting.png b/sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/allow-jit-build-setting.png new file mode 100644 index 0000000000..153beb5392 Binary files /dev/null and b/sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/allow-jit-build-setting.png differ diff --git a/sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/flutternativeintegration-relative-location.png b/sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/flutternativeintegration-relative-location.png new file mode 100644 index 0000000000..46972d4471 Binary files /dev/null and b/sites/docs/web/assets/images/docs/development/add-to-app/macos/project-setup-swiftpm/flutternativeintegration-relative-location.png differ diff --git a/tool/dash_site/lib/dash_site.dart b/tool/dash_site/lib/dash_site.dart index 77f556bf18..c81144bc65 100644 --- a/tool/dash_site/lib/dash_site.dart +++ b/tool/dash_site/lib/dash_site.dart @@ -10,9 +10,11 @@ import 'src/commands/check_all.dart'; import 'src/commands/check_link_references.dart'; import 'src/commands/check_links.dart'; import 'src/commands/clean.dart'; +import 'src/commands/deploy.dart'; import 'src/commands/format_dart.dart'; import 'src/commands/refresh_excerpts.dart'; import 'src/commands/serve.dart'; +import 'src/commands/stage_preview.dart'; import 'src/commands/test_dart.dart'; import 'src/commands/verify_firebase_json.dart'; import 'src/sites.dart'; @@ -40,9 +42,11 @@ final class DashSiteCommandRunner extends CommandRunner { addCommand(CheckLinksCommand()); addCommand(CheckLinkReferencesCommand()); addCommand(CleanSiteCommand()); + addCommand(DeployCommand()); addCommand(FormatDartCommand()); addCommand(RefreshExcerptsCommand()); addCommand(ServeSiteCommand()); + addCommand(StagePreviewCommand()); addCommand(TestDartCommand()); addCommand(VerifyFirebaseJsonCommand()); } diff --git a/tool/dash_site/lib/src/commands/build.dart b/tool/dash_site/lib/src/commands/build.dart index ed99969717..cd6e86065b 100644 --- a/tool/dash_site/lib/src/commands/build.dart +++ b/tool/dash_site/lib/src/commands/build.dart @@ -31,59 +31,77 @@ final class BuildSiteCommand extends Command { String get name => 'build'; @override - Future run() async { - installJasprCliIfNecessary(); - - final productionRelease = argResults.get(_releaseFlag, false); - final site = selectedSite; - - final process = await Process.start( - Platform.resolvedExecutable, - [ - 'pub', - 'global', - 'run', - 'jaspr_cli:jaspr', - 'build', - // Use build_web_compiler options specified in build.yaml instead of - // those specified by jaspr_cli. - '--no-managed-build-options', - '--sitemap-domain=${site.baseUrl}', - // Exclude secondary Markdown output files from sitemap. - r'--sitemap-exclude=\.html\.md$', - '--dart-define=PRODUCTION=$productionRelease', - ], - workingDirectory: site.directory, - mode: ProcessStartMode.inheritStdio, - ); + Future run() async => buildSite( + selectedSite, + productionRelease: argResults.get(_releaseFlag, false), + ); +} - final processExitCode = await process.exitCode; +Future buildSite(Site site, {required bool productionRelease}) async { + if (installJasprCliIfNecessary() case final jasprInstallResult + when jasprInstallResult != 0) { + return jasprInstallResult; + } - final originalOutputDirectoryPath = path.join( - repositoryRoot, - site.directory, + final process = await Process.start( + Platform.resolvedExecutable, + [ + 'pub', + 'global', + 'run', + 'jaspr_cli:jaspr', 'build', - 'jaspr', + // Use build_web_compiler options specified in build.yaml instead of + // those specified by jaspr_cli. + '--no-managed-build-options', + '--sitemap-domain=${site.baseUrl}', + // Exclude secondary Markdown output files from sitemap. + r'--sitemap-exclude=\.html\.md$', + '--dart-define=PRODUCTION=$productionRelease', + ], + workingDirectory: site.directory, + mode: ProcessStartMode.inheritStdio, + ); + + if (await process.exitCode case final processExitCode + when processExitCode != 0) { + return processExitCode; + } + + final originalOutputDirectoryPath = path.join( + repositoryRoot, + site.jasprBuildOutputDirectory, + ); + if (!Directory(originalOutputDirectoryPath).existsSync()) { + stderr.writeln( + 'Error: Jaspr output directory not found at: ' + '$originalOutputDirectoryPath', ); - if (!Directory(originalOutputDirectoryPath).existsSync()) { - stderr.writeln( - 'Error: Jaspr output directory not found at: ' - '$originalOutputDirectoryPath', - ); - return 1; + return 1; + } + + final siteOutputDirectoryPath = path.join( + repositoryRoot, + site.buildOutputDirectory, + ); + if (path.normalize(originalOutputDirectoryPath) != + path.normalize(siteOutputDirectoryPath)) { + final outputDirectory = Directory(siteOutputDirectoryPath); + if (outputDirectory.existsSync()) { + outputDirectory.deleteSync(recursive: true); } - // Copy the entire site output to the _site directory. + // Copy the entire site output to the configured output directory. io.copyPathSync(originalOutputDirectoryPath, siteOutputDirectoryPath); + } - _move404File(); + _move404File(siteOutputDirectoryPath); - return processExitCode; - } + return 0; } /// Moves the 404 file to the location expected by Firebase hosting. -void _move404File() { +void _move404File(String siteOutputDirectoryPath) { final initial404Directory = path.join(siteOutputDirectoryPath, '404'); final original404File = File(path.join(initial404Directory, 'index.html')); if (original404File.existsSync()) { diff --git a/tool/dash_site/lib/src/commands/check_all.dart b/tool/dash_site/lib/src/commands/check_all.dart index 4d33fee4cd..53d25364cf 100644 --- a/tool/dash_site/lib/src/commands/check_all.dart +++ b/tool/dash_site/lib/src/commands/check_all.dart @@ -19,11 +19,13 @@ final class CheckAllCommand extends Command { @override Future run() async { - const verificationTasks = [ + final selectedSite = this.selectedSite; + final verificationTasks = [ ['format-dart', '--check'], ['analyze-dart'], ['test-dart'], - ['refresh-excerpts', '--fail-on-update', '--dry-run'], + if (selectedSite.supportsCodeExcerpts) + ['refresh-excerpts', '--fail-on-update', '--dry-run'], ]; final siteName = selectedSite.name; diff --git a/tool/dash_site/lib/src/commands/check_link_references.dart b/tool/dash_site/lib/src/commands/check_link_references.dart index 5debe91e13..fb0d540d89 100644 --- a/tool/dash_site/lib/src/commands/check_link_references.dart +++ b/tool/dash_site/lib/src/commands/check_link_references.dart @@ -7,6 +7,9 @@ import 'dart:io'; import 'package:args/command_runner.dart'; import 'package:path/path.dart' as path; +import '../sites.dart'; +import '../utils.dart'; + final class CheckLinkReferencesCommand extends Command { @override String get description => @@ -17,13 +20,16 @@ final class CheckLinkReferencesCommand extends Command { String get name => 'check-link-references'; @override - Future run() async => _checkLinkReferences(); + Future run() async => _checkLinkReferences(selectedSite); } -int _checkLinkReferences() { +int _checkLinkReferences(Site site) { print('Checking for broken Markdown link references...'); - const generatedSiteDirectory = '_site'; + final generatedSiteDirectory = path.join( + repositoryRoot, + site.buildOutputDirectory, + ); final directory = Directory(generatedSiteDirectory); diff --git a/tool/dash_site/lib/src/commands/check_links.dart b/tool/dash_site/lib/src/commands/check_links.dart index 935031574e..17b9217eb9 100644 --- a/tool/dash_site/lib/src/commands/check_links.dart +++ b/tool/dash_site/lib/src/commands/check_links.dart @@ -9,6 +9,8 @@ import 'package:args/command_runner.dart'; import 'package:linkcheck/linkcheck.dart' as linkcheck show run; import 'package:path/path.dart' as path; +import '../firebase.dart'; +import '../sites.dart'; import '../utils.dart'; final class CheckLinksCommand extends Command { @@ -30,15 +32,12 @@ final class CheckLinksCommand extends Command { String get name => 'check-links'; @override - Future run() async => - _checkLinks(checkExternal: argResults.get(_externalFlag, false)); + Future run() async => _checkLinks( + site: selectedSite, + checkExternal: argResults.get(_externalFlag, false), + ); } -/// The port that the firebase emulator runs on by default. -/// This must match what's declared in the `firebase.json` -/// and can't be 5000, since Airplay uses it. -const int _emulatorPort = 5502; - /// The path from root where the linkcheck skip list lives. final String _skipFilePath = path.join( 'tool', @@ -46,20 +45,22 @@ final String _skipFilePath = path.join( 'linkcheck-skip-list.txt', ); -Future _checkLinks({bool checkExternal = false}) async { - if (await _isPortInUse(_emulatorPort)) { +Future _checkLinks({ + required Site site, + bool checkExternal = false, +}) async { + final emulatorPort = site.firebaseEmulatorPort; + + if (await _isPortInUse(emulatorPort)) { stderr.writeln( - 'Error: Port $_emulatorPort is already in use! ' + 'Error: Port $emulatorPort is already in use! ' 'Are you running the emulator elsewhere?', ); return 1; } - final toolVersionOutput = await Process.run('firebase', const ['--version']); - - final firebaseToolsVersion = (toolVersionOutput.stdout as String?)?.trim(); - if (firebaseToolsVersion == null || firebaseToolsVersion.isEmpty) { - stderr.writeln('Error: Could not determine firebase-tools version!'); + final firebaseToolsVersion = await validateFirebaseCli(); + if (firebaseToolsVersion == null) { return 1; } @@ -67,15 +68,27 @@ Future _checkLinks({bool checkExternal = false}) async { 'Using firebase-tools $firebaseToolsVersion to start the ' 'Firebase hosting emulator asynchronously...', ); - final emulatorProcess = await Process.start('firebase', const [ - 'emulators:start', - '--only', - 'hosting', - '--project', - 'default', - '--log-verbosity', - 'QUIET', - ], mode: ProcessStartMode.inheritStdio); + final firebaseConfigDirectory = path.join( + repositoryRoot, + site.firebaseConfigDirectory, + ); + final firebaseConfigFileName = path.basename(site.firebaseConfigPath); + final emulatorProcess = await Process.start( + firebaseCliExecutable, + [ + 'emulators:start', + '--only', + 'hosting', + '--project', + 'default', + '--config', + firebaseConfigFileName, + '--log-verbosity', + 'QUIET', + ], + workingDirectory: firebaseConfigDirectory, + mode: ProcessStartMode.inheritStdio, + ); print('Connecting to the emulator...'); // Give the emulator a few seconds to start up. @@ -83,14 +96,14 @@ Future _checkLinks({bool checkExternal = false}) async { try { // Check to see if the emulator is running. - if (!(await _isPortInUse(_emulatorPort))) { + if (!(await _isPortInUse(emulatorPort))) { stderr.writeln('Error: The Firebase hosting emulator did not start!'); return 1; } try { final result = await linkcheck.run([ - ':$_emulatorPort', + ':$emulatorPort', '--skip-file', _skipFilePath, if (checkExternal) 'external', diff --git a/tool/dash_site/lib/src/commands/clean.dart b/tool/dash_site/lib/src/commands/clean.dart index c17eae29ac..faa292ee74 100644 --- a/tool/dash_site/lib/src/commands/clean.dart +++ b/tool/dash_site/lib/src/commands/clean.dart @@ -5,6 +5,7 @@ import 'dart:io'; import 'package:args/command_runner.dart'; +import 'package:path/path.dart' as path; import '../sites.dart'; import '../utils.dart'; @@ -22,7 +23,12 @@ final class CleanSiteCommand extends Command { Future run() async { print('Cleaning the Jaspr setup...'); - installJasprCliIfNecessary(); + if (installJasprCliIfNecessary() case final jasprInstallResult + when jasprInstallResult != 0) { + return jasprInstallResult; + } + + final selectedSite = this.selectedSite; final process = await Process.start( Platform.resolvedExecutable, @@ -34,7 +40,9 @@ final class CleanSiteCommand extends Command { final processExitCode = await process.exitCode; print('Cleaning the site output directory...'); - final outputDirectory = Directory(siteOutputDirectoryPath); + final outputDirectory = Directory( + path.join(repositoryRoot, selectedSite.buildOutputDirectory), + ); if (outputDirectory.existsSync()) { outputDirectory.deleteSync(recursive: true); } diff --git a/tool/dash_site/lib/src/commands/deploy.dart b/tool/dash_site/lib/src/commands/deploy.dart new file mode 100644 index 0000000000..08ad3ef73d --- /dev/null +++ b/tool/dash_site/lib/src/commands/deploy.dart @@ -0,0 +1,83 @@ +// Copyright 2026 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:args/command_runner.dart'; +import 'package:path/path.dart' as path; + +import '../firebase.dart'; +import '../sites.dart'; +import '../utils.dart'; +import 'build.dart'; + +/// Builds and deploys the selected site to Firebase Hosting. +final class DeployCommand extends Command { + static const String _projectOption = 'project'; + static const String _onlyOption = 'only'; + + DeployCommand() { + argParser + ..addOption( + _projectOption, + help: + 'The Firebase project ID or alias to deploy to. ' + 'Defaults to the selected site production project. ' + 'Use this to test deploys against a personal Firebase project.', + valueHelp: 'project-id', + ) + ..addOption( + _onlyOption, + defaultsTo: 'hosting', + help: + 'The Firebase deploy target. ' + 'Use "hosting:target" for projects with multiple Hosting targets.', + valueHelp: 'hosting[:target]', + ); + } + + @override + String get description => + 'Build a production release of the site and ' + 'deploy it to Firebase Hosting.'; + + @override + String get name => 'deploy'; + + @override + Future run() async { + final selectedSite = this.selectedSite; + final argResults = this.argResults!; + final project = + argResults.option(_projectOption) ?? + selectedSite.defaultFirebaseProjectId; + final only = argResults.option(_onlyOption)!; + + final firebaseToolsVersion = await validateFirebaseCli(); + if (firebaseToolsVersion == null) { + return 1; + } + + if (await buildSite(selectedSite, productionRelease: true) + case final buildResult when buildResult != 0) { + return buildResult; + } + + print('Using firebase-tools $firebaseToolsVersion.'); + print( + 'Deploying ${selectedSite.host} to Firebase project $project ' + 'with target $only...', + ); + final deploy = await Process.start( + firebaseCliExecutable, + ['deploy', '--project=$project', '--only=$only'], + workingDirectory: path.join( + repositoryRoot, + selectedSite.firebaseConfigDirectory, + ), + mode: ProcessStartMode.inheritStdio, + ); + return deploy.exitCode; + } +} diff --git a/tool/dash_site/lib/src/commands/refresh_excerpts.dart b/tool/dash_site/lib/src/commands/refresh_excerpts.dart index b6e2525bc3..9f1558e0df 100644 --- a/tool/dash_site/lib/src/commands/refresh_excerpts.dart +++ b/tool/dash_site/lib/src/commands/refresh_excerpts.dart @@ -55,6 +55,13 @@ Future _refreshExcerpts({ bool dryRun = false, bool failOnUpdate = false, }) async { + if (!site.supportsCodeExcerpts) { + stderr.writeln( + 'Error: The ${site.name} site does not support code excerpts.', + ); + return 1; + } + final updater = Updater( baseSourcePath: path.join(repositoryRoot, 'examples'), defaultPlasterContent: '···', @@ -68,7 +75,7 @@ Future _refreshExcerpts({ print('Running the code excerpt updater...'); final updateResult = await updater.update( - path.join(repositoryRoot, site.directory, 'src', 'content'), + path.join(repositoryRoot, site.contentDirectory), makeUpdates: !dryRun, ); diff --git a/tool/dash_site/lib/src/commands/serve.dart b/tool/dash_site/lib/src/commands/serve.dart index 44d8d0621e..e770dd0e3f 100644 --- a/tool/dash_site/lib/src/commands/serve.dart +++ b/tool/dash_site/lib/src/commands/serve.dart @@ -26,9 +26,14 @@ final class ServeSiteCommand extends Command { @override Future run() async { - final release = argResults!.flag('release'); + if (installJasprCliIfNecessary() case final jasprInstallResult + when jasprInstallResult != 0) { + return jasprInstallResult; + } - installJasprCliIfNecessary(); + final release = argResults!.flag('release'); + final selectedSite = this.selectedSite; + final jasprPorts = selectedSite.jasprPorts; final process = await Process.start( Platform.resolvedExecutable, @@ -38,6 +43,9 @@ final class ServeSiteCommand extends Command { 'run', 'jaspr_cli:jaspr', 'serve', + '--port=${jasprPorts.serve}', + '--web-port=${jasprPorts.webDev}', + '--proxy-port=${jasprPorts.proxy}', // Use build_web_compiler options specified in build.yaml instead of // those specified by jaspr_cli. '--no-managed-build-options', diff --git a/tool/dash_site/lib/src/commands/stage_preview.dart b/tool/dash_site/lib/src/commands/stage_preview.dart new file mode 100644 index 0000000000..a87c76aeb2 --- /dev/null +++ b/tool/dash_site/lib/src/commands/stage_preview.dart @@ -0,0 +1,375 @@ +// Copyright 2026 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; + +import 'package:args/command_runner.dart'; +import 'package:github/github.dart' as github; +import 'package:path/path.dart' as path; + +import '../firebase.dart'; +import '../sites.dart'; +import '../utils.dart'; +import 'build.dart'; + +/// Builds the selected or default site, +/// deploys it to a Firebase Hosting preview channel, +/// and posts or updates a comment on the source GitHub PR when requested. +final class StagePreviewCommand extends Command { + static const String _projectOption = 'project'; + static const String _channelOption = 'channel'; + static const String _expiresOption = 'expires'; + static const String _prNumberOption = 'pr-number'; + static const String _repoOption = 'repo'; + static const String _commitShaOption = 'commit-sha'; + static const String _headBranchOption = 'head-branch'; + + StagePreviewCommand() { + argParser + ..addOption( + _projectOption, + help: + 'The Firebase project ID or alias to stage to. ' + 'Defaults to the selected site production project. ' + 'Use this to test previews against a personal Firebase project.', + valueHelp: 'project-id', + ) + ..addOption( + _channelOption, + help: + 'The Firebase Hosting preview channel name. ' + 'Defaults to a stable name based on the selected site and PR.', + valueHelp: 'channel', + ) + ..addOption( + _expiresOption, + defaultsTo: '7d', + help: 'How long the Firebase Hosting preview channel should live.', + valueHelp: 'duration', + ) + ..addOption( + _prNumberOption, + help: + 'The pull request number to comment on. ' + 'Required together with --$_repoOption to post a preview comment.', + ) + ..addOption( + _repoOption, + help: + 'The full repository name in "owner/repository" form. ' + 'Required together with --$_prNumberOption to ' + 'post a preview comment.', + valueHelp: 'owner/repository', + ) + ..addOption( + _commitShaOption, + help: + 'The commit SHA being staged. ' + 'Required to post a preview comment.', + ) + ..addOption( + _headBranchOption, + help: 'The branch name to include in the staging channel name.', + ); + } + + @override + String get description => + 'Build the site, deploy it to a Firebase staging channel, ' + 'and comment the preview URL on GitHub.'; + + @override + String get name => 'stage-preview'; + + @override + Future run() async { + final selectedSite = this.selectedSite; + final argResults = this.argResults!; + + final project = + argResults.option(_projectOption) ?? + selectedSite.defaultFirebaseProjectId; + final channel = _nonEmpty(argResults.option(_channelOption)); + final expires = argResults.option(_expiresOption)!; + final prNumberArg = _nonEmpty(argResults.option(_prNumberOption)); + final repoFullName = _nonEmpty(argResults.option(_repoOption)); + final commitSha = _nonEmpty(argResults.option(_commitShaOption)); + final headBranch = _nonEmpty(argResults.option(_headBranchOption)); + + // Validate PR-context preconditions up front so a misconfigured + // trigger fails before the build and deploy runs unnecessarily. + final _PullRequestContext? prContext; + if (prNumberArg != null && repoFullName != null) { + final prNumber = int.tryParse(prNumberArg); + if (prNumber == null) { + stderr.writeln('Error: --$_prNumberOption must be an integer.'); + return 1; + } + if (!repoFullName.contains('/')) { + stderr.writeln( + 'Error: --$_repoOption must be in the form "owner/repository".', + ); + return 1; + } + if (commitSha == null) { + stderr.writeln( + 'Error: --$_commitShaOption must be set to ' + 'comment on the pull request.', + ); + return 1; + } + const githubPatTokenEnv = 'GH_PAT_TOKEN'; + final githubToken = _nonEmpty(Platform.environment[githubPatTokenEnv]); + if (githubToken == null) { + stderr.writeln( + 'Error: $githubPatTokenEnv must be set to ' + 'comment on the pull request.', + ); + return 1; + } + prContext = ( + prNumber: prNumber, + repoFullName: repoFullName, + githubToken: githubToken, + commitSha: commitSha, + ); + } else { + if (prNumberArg != null || repoFullName != null) { + stderr.writeln( + 'Warning: Both --$_prNumberOption and --$_repoOption must be set ' + 'to comment on the pull request; skipping the GitHub comment.', + ); + } + prContext = null; + } + + final firebaseToolsVersion = await validateFirebaseCli(); + if (firebaseToolsVersion == null) { + return 1; + } + + if (await buildSite(selectedSite, productionRelease: false) + case final buildResult when buildResult != 0) { + return buildResult; + } + + print('Using firebase-tools $firebaseToolsVersion.'); + final branchOrSha = headBranch ?? commitSha ?? 'manual'; + final stagingUrl = await _deploySiteToStaging( + selectedSite, + project: project, + channel: + channel ?? + _firebaseChannelForSite( + selectedSite, + prNumber: prNumberArg, + branchOrSha: branchOrSha, + ), + expires: expires, + ); + if (stagingUrl == null) { + return 1; + } + + if (prContext == null) { + print('No pull request context available; skipping GitHub comment.'); + print(stagingUrl); + return 0; + } + + return _commentStagingUrlOnGitHub( + site: selectedSite, + stagingUrl: stagingUrl, + context: prContext, + ); + } +} + +/// Deploys [site] to a Firebase Hosting preview channel and +/// returns the channel's public URL on success, or +/// `null` if the deploy fails or no URL can be extracted. +Future _deploySiteToStaging( + Site site, { + required String project, + required String channel, + required String expires, +}) async { + print( + 'Deploying ${site.host} to Firebase project $project ' + 'preview channel $channel...', + ); + + final result = await Process.run( + firebaseCliExecutable, + [ + 'hosting:channel:deploy', + channel, + '--project=$project', + '--expires', + expires, + '--json', + ], + workingDirectory: path.join(repositoryRoot, site.firebaseConfigDirectory), + ); + + if (result.exitCode != 0) { + stderr.writeln(result.stderr); + stderr.writeln(result.stdout); + return null; + } + + stdout.write(result.stdout); + stderr.write(result.stderr); + + final stagingUrl = _extractDeployedUrl(result.stdout as String); + if (stagingUrl == null) { + stderr.writeln('Failed to find a Firebase staging URL for ${site.host}.'); + return null; + } + + return stagingUrl; +} + +/// Extracts the deployed preview URL from +/// `firebase hosting:channel:deploy --json` output. +/// +/// Returns `null` if the input isn't valid JSON or doesn't contain a URL. +String? _extractDeployedUrl(String firebaseJsonOutput) { + final Object? parsed; + try { + parsed = jsonDecode(firebaseJsonOutput); + } on FormatException { + return null; + } + if (parsed case { + 'result': final Map result, + }) { + for (final entry in result.values) { + if (entry case {'url': final String url}) { + return url; + } + } + } + return null; +} + +/// Posts a new preview comment on the pull request, +/// or updates the existing one identified by an HTML marker that +/// includes the [site]'s name. +/// +/// Returns `0` on success or `1` if the GitHub API call fails. +Future _commentStagingUrlOnGitHub({ + required Site site, + required String stagingUrl, + required _PullRequestContext context, +}) async { + final commentMarker = ''; + final commentBody = + ''' +$commentMarker +Staged preview of the updated ${site.host} site (updated for commit ${context.commitSha}): + +$stagingUrl'''; + + print('Commenting ${site.host} staging URL on the PR...'); + final gitHub = github.GitHub( + auth: github.Authentication.withToken(context.githubToken), + ); + try { + final repository = github.RepositorySlug.full(context.repoFullName); + final existingCommentId = await _findExistingPreviewCommentId( + gitHub: gitHub, + repository: repository, + issueNumber: context.prNumber, + commentMarker: commentMarker, + ); + + if (existingCommentId == null) { + await gitHub.issues.createComment( + repository, + context.prNumber, + commentBody, + ); + } else { + // package:github's IssuesService.updateComment issues a POST, + // but GitHub's REST API requires PATCH for this endpoint. + await gitHub.request( + 'PATCH', + '/repos/${repository.fullName}/issues/comments/$existingCommentId', + headers: {'Content-Type': 'application/json'}, + body: jsonEncode({'body': commentBody}), + statusCode: github.StatusCodes.OK, + ); + } + } on github.GitHubError catch (error) { + stderr.writeln('Error: Failed to comment on the pull request: $error'); + return 1; + } finally { + gitHub.dispose(); + } + + return 0; +} + +/// Returns the id of the first comment on the issue whose body +/// contains the specified [commentMarker]. +/// +/// Returns `null` if no matching comment exists. +Future _findExistingPreviewCommentId({ + required github.GitHub gitHub, + required github.RepositorySlug repository, + required int issueNumber, + required String commentMarker, +}) async { + await for (final comment in gitHub.issues.listCommentsByIssue( + repository, + issueNumber, + )) { + if (comment.body?.contains(commentMarker) ?? false) { + return comment.id; + } + } + return null; +} + +/// Builds a Firebase Hosting channel name for [site] that +/// incorporates [branchOrSha] and if specified, [prNumber], +/// and satisfies Firebase's naming constraints: +/// +/// - Lowercase a-z characters, 0-9 digits, and dashes (`-`). +/// - No longer than 63 characters. +/// - No trailing dashes. +String _firebaseChannelForSite( + Site site, { + String? prNumber, + required String branchOrSha, +}) { + final prefix = prNumber != null ? 'pr$prNumber-' : ''; + var channel = '${site.name}-$prefix$branchOrSha'.toLowerCase().replaceAll( + RegExp('[^a-z0-9-]+'), + '-', + ); + if (channel.length > 63) { + channel = channel.substring(0, 63); + } + return channel.replaceAll(RegExp(r'-+$'), ''); +} + +/// Returns [value] if it is non-null and non-empty, otherwise `null`. +String? _nonEmpty(String? value) { + if (value == null || value.isEmpty) return null; + return value; +} + +/// Everything required to post a preview comment on a GitHub pull request. +/// +/// Built during option parsing so that a misconfigured Cloud Build trigger +/// fails before the build and deploy runs. +typedef _PullRequestContext = ({ + int prNumber, + String repoFullName, + String githubToken, + String commitSha, +}); diff --git a/tool/dash_site/lib/src/commands/test_dart.dart b/tool/dash_site/lib/src/commands/test_dart.dart index 81f61d6cb1..3f86771a5a 100644 --- a/tool/dash_site/lib/src/commands/test_dart.dart +++ b/tool/dash_site/lib/src/commands/test_dart.dart @@ -7,6 +7,7 @@ import 'dart:io'; import 'package:args/command_runner.dart'; import 'package:path/path.dart' as path; +import '../sites.dart'; import '../utils.dart'; final class TestDartCommand extends Command { @@ -21,7 +22,7 @@ final class TestDartCommand extends Command { } @override - String get description => 'Run tests on the site infra and examples.'; + String get description => 'Run tests on the sites, site infra, and examples.'; @override String get name => 'test-dart'; @@ -32,16 +33,24 @@ final class TestDartCommand extends Command { } Future _testDart({bool verboseLogging = false}) async { - final directoriesToTest = [ - path.join('tool', 'dash_site'), - ...exampleProjectDirectories, + final directoriesToTest = <(String directory, String executable)>[ + (path.join('tool', 'dash_site'), 'dart'), + for (final site in Site.values) + if (Directory(path.join(site.directory, 'test')).existsSync()) + (site.directory, 'dart'), + for (final directory in exampleProjectDirectories) (directory, 'flutter'), ]; print('Testing code...'); final failedTests = [ - for (final directory in directoriesToTest) - if (!(await testsPassInDirectory(directory, verboseLogging))) directory, + for (final (directory, executable) in directoriesToTest) + if (!(await testsPassInDirectory( + directory, + verboseLogging, + executable: executable, + ))) + directory, ]; if (failedTests.isNotEmpty) { @@ -54,23 +63,28 @@ Future _testDart({bool verboseLogging = false}) async { return 0; } -Future testsPassInDirectory(String directory, bool verboseLogging) async { +Future testsPassInDirectory( + String directory, + bool verboseLogging, { + String executable = 'flutter', +}) async { if (verboseLogging) { - print('Testing code in $directory...'); + print('Testing code in $directory with $executable test...'); } - final flutterTestOutput = await Process.run('flutter', [ + final testOutput = await Process.run(executable, [ 'test', '--reporter', 'expanded', // Non-animated expanded output looks better in CI and logs. ], workingDirectory: directory); - if (flutterTestOutput.exitCode != 0) { - final normalOutput = flutterTestOutput.stdout.toString(); - final errorOutput = flutterTestOutput.stderr.toString(); + if (testOutput.exitCode != 0) { + final normalOutput = testOutput.stdout.toString(); + final errorOutput = testOutput.stderr.toString(); // It's ok if the test directory is not found. if (!errorOutput.contains('No test') && + !normalOutput.contains('No test files were passed') && !normalOutput.contains('Could not find package `test`') && !normalOutput.contains('No tests were') && !errorOutput.contains(RegExp(r'Test directory.*not found'))) { diff --git a/tool/dash_site/lib/src/commands/verify_firebase_json.dart b/tool/dash_site/lib/src/commands/verify_firebase_json.dart index 05642e8d52..bbb2b6555b 100644 --- a/tool/dash_site/lib/src/commands/verify_firebase_json.dart +++ b/tool/dash_site/lib/src/commands/verify_firebase_json.dart @@ -6,26 +6,31 @@ import 'dart:convert'; import 'dart:io'; import 'package:args/command_runner.dart'; +import 'package:path/path.dart' as path; + +import '../sites.dart'; +import '../utils.dart'; final class VerifyFirebaseJsonCommand extends Command { @override String get description => - 'Verify the firebase.json file is valid and ' + "Verify the site's Firebase config is valid and " 'meets the site standards.'; @override String get name => 'verify-firebase-json'; @override - Future run() async => _verifyFirebaseJson(); + Future run() async => _verifyFirebaseJson(selectedSite); } -int _verifyFirebaseJson() { - final firebaseFile = File('firebase.json'); +int _verifyFirebaseJson(Site site) { + final firebasePath = path.join(repositoryRoot, site.firebaseConfigPath); + final firebaseFile = File(firebasePath); if (!firebaseFile.existsSync()) { stderr.writeln( - 'Cannot find the firebase.json file in the current directory.', + 'Cannot find the ${site.name} Firebase config at $firebasePath.', ); return 1; } @@ -39,23 +44,30 @@ int _verifyFirebaseJson() { if (hostingConfig == null) { stderr.writeln( - "Error: The firebase.json file is missing a top-level 'hosting' entry.", + 'Error: The ${site.name} Firebase config is ' + "missing a top-level 'hosting' entry.", ); return 1; } + if (!_verifyHostingEmulatorPort(firebaseConfig, site)) { + return 1; + } + final redirects = hostingConfig['redirects']; if (redirects == null) { stdout.writeln( - 'There are no redirects specified within the firebase.json file.', + 'There are no redirects specified in ' + 'the ${site.name} Firebase config.', ); return 0; } if (redirects is! List) { stderr.writeln( - "Error: The firebase.json file's 'redirect' entry is not a list.", + "Error: The ${site.name} Firebase config 'hosting.redirects' " + 'entry is not a list.', ); return 1; } @@ -71,8 +83,8 @@ int _verifyFirebaseJson() { for (final redirect in redirects) { if (redirect is! Map) { stderr.writeln( - 'Error: Each redirect must be a map containing ' - "a 'source' or 'regex' field.", + 'Error: Each redirect in the ${site.name} Firebase config must be ' + "a map containing a 'source' or 'regex' field.", ); return 1; } @@ -80,7 +92,7 @@ int _verifyFirebaseJson() { final source = redirect['source'] ?? redirect['regex']; if (source == null) { stderr.writeln( - 'Error: The firebase.json file has a ' + 'Error: The ${site.name} Firebase config has a ' "redirect missing a 'source' or 'regex'.", ); return 1; @@ -88,7 +100,7 @@ int _verifyFirebaseJson() { if (source is! String) { stderr.writeln( - 'Error: The firebase.json redirect $redirect has a ' + 'Error: The ${site.name} Firebase config redirect $redirect has a ' "'source' or 'regex' specified which is not a string.", ); return 1; @@ -96,14 +108,17 @@ int _verifyFirebaseJson() { if (source.isEmpty) { stderr.writeln( - 'Error: The firebase.json redirect $redirect has an ' + 'Error: The ${site.name} Firebase config redirect $redirect has an ' "empty 'source' or 'regex'.", ); return 1; } if (sources.contains(source)) { - stderr.writeln("Error: Multiple redirects share the '$source' source."); + stderr.writeln( + 'Error: Multiple ${site.name} redirects ' + "share the '$source' source.", + ); duplicatesFound += 1; } @@ -113,7 +128,7 @@ int _verifyFirebaseJson() { if (destination == null) { stderr.writeln( - 'Error: The firebase.json file has a ' + 'Error: The ${site.name} Firebase config has a ' "redirect missing a 'destination'.", ); return 1; @@ -121,7 +136,7 @@ int _verifyFirebaseJson() { if (destination is! String) { stderr.writeln( - 'Error: The firebase.json redirect $redirect has a ' + 'Error: The ${site.name} Firebase config redirect $redirect has a ' "'destination' specified which is not a string.", ); return 1; @@ -129,8 +144,8 @@ int _verifyFirebaseJson() { if (destination.isEmpty) { stderr.writeln( - 'Error: The firebase.json redirect $redirect has ' - "an empty 'destination'.", + 'Error: The ${site.name} Firebase config redirect $redirect has an ' + "empty 'destination'.", ); return 1; } @@ -138,14 +153,15 @@ int _verifyFirebaseJson() { if (duplicatesFound > 0) { stderr.writeln( - 'Error: $duplicatesFound duplicate sources found ' - 'in the firebase.json redirects.', + 'Error: $duplicatesFound duplicate sources found in ' + 'the ${site.name} Firebase config redirects.', ); return 1; } } catch (e) { stderr.writeln( - 'Error: Encountered an error when loading the firebase.json file:', + 'Error: Encountered an error when loading ' + 'the ${site.name} Firebase config:', ); stderr.writeln(e); return 1; @@ -153,3 +169,39 @@ int _verifyFirebaseJson() { return 0; } + +/// Returns whether the Firebase hosting emulator port in +/// the [firebaseConfig] matches the one specified for [site]. +bool _verifyHostingEmulatorPort( + Map firebaseConfig, + Site site, +) { + final emulatorsConfig = firebaseConfig['emulators']; + if (emulatorsConfig is! Map) { + stderr.writeln( + 'Error: The ${site.name} Firebase config is ' + "missing a top-level 'emulators' entry.", + ); + return false; + } + + final hostingEmulatorConfig = emulatorsConfig['hosting']; + if (hostingEmulatorConfig is! Map) { + stderr.writeln( + 'Error: The ${site.name} Firebase config is ' + "missing an 'emulators.hosting' entry.", + ); + return false; + } + + final port = hostingEmulatorConfig['port']; + if (port != site.firebaseEmulatorPort) { + stderr.writeln( + "Error: The ${site.name} Firebase config 'emulators.hosting.port' " + 'value must be ${site.firebaseEmulatorPort}, but found $port.', + ); + return false; + } + + return true; +} diff --git a/tool/dash_site/lib/src/firebase.dart b/tool/dash_site/lib/src/firebase.dart new file mode 100644 index 0000000000..84c98975ef --- /dev/null +++ b/tool/dash_site/lib/src/firebase.dart @@ -0,0 +1,64 @@ +// Copyright 2026 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +/// The executable name for the Firebase CLI. +const String firebaseCliExecutable = 'firebase'; + +/// Validates that the Firebase CLI is available and returns its version. +/// +/// Returns `null` and prints actionable feedback if the CLI isn't available +/// or can't report its version. +Future validateFirebaseCli() async { + final ProcessResult versionResult; + try { + versionResult = await Process.run(firebaseCliExecutable, const [ + '--version', + ]); + } on ProcessException catch (error) { + stderr.writeln( + 'Error: The Firebase CLI is required, but ' + '`firebase --version` could not run.', + ); + stderr.writeln(_firebaseCliInstallMessage); + if (error.message.isNotEmpty) { + stderr.writeln(error.message); + } + return null; + } + + if (versionResult.exitCode != 0) { + stderr.writeln( + 'Error: The Firebase CLI is required, but ' + '`firebase --version` failed.', + ); + _writeErrorOutput(versionResult.stdout); + _writeErrorOutput(versionResult.stderr); + stderr.writeln(_firebaseCliInstallMessage); + return null; + } + + final version = versionResult.stdout.toString().trim(); + if (version.isEmpty) { + stderr.writeln('Error: Could not determine firebase-tools version.'); + stderr.writeln(_firebaseCliInstallMessage); + return null; + } + + return version; +} + +/// Help text shown when the Firebase CLI can't be validated. +const String _firebaseCliInstallMessage = + 'Install firebase-tools and make sure the `firebase` executable is ' + 'available on your PATH.'; + +/// Writes [output] to stderr if it contains non-whitespace content. +void _writeErrorOutput(Object? output) { + final trimmedOutput = output?.toString().trim() ?? ''; + if (trimmedOutput.isNotEmpty) { + stderr.writeln(trimmedOutput); + } +} diff --git a/tool/dash_site/lib/src/sites.dart b/tool/dash_site/lib/src/sites.dart index 5cf18b0681..2dbefe423f 100644 --- a/tool/dash_site/lib/src/sites.dart +++ b/tool/dash_site/lib/src/sites.dart @@ -8,20 +8,101 @@ import 'package:path/path.dart' as path; /// The sites maintained in this repository. enum Site { /// The Flutter documentation site. - docs(baseUrl: 'https://docs.flutter.cn'); + docs( + host: 'docs.flutter.cn', + buildOutputPathSegments: ['_site'], + contentPathSegments: ['src', 'content'], + firebaseConfigPathSegments: ['firebase.json'], + firebaseEmulatorPort: 5502, + defaultFirebaseProjectId: 'flutter-docs-prod', + supportsCodeExcerpts: true, + ); - const Site({required this.baseUrl}); + const Site({ + required this.host, + required this.buildOutputPathSegments, + required this.contentPathSegments, + required this.firebaseConfigPathSegments, + required this.firebaseEmulatorPort, + required this.defaultFirebaseProjectId, + this.supportsCodeExcerpts = false, + }); + + /// The host name where this site is served in production. + final String host; /// The canonical base URL where this site is hosted in production. - final String baseUrl; + String get baseUrl => 'https://$host'; + + /// The path segments for this site's production build output directory, + /// relative to the repository root. + final List buildOutputPathSegments; + + /// The path segments for this site's content directory, + /// relative to the site's [directory]. + final List contentPathSegments; + + /// The path segments for this site's Firebase config file. + final List firebaseConfigPathSegments; + + /// The hosting emulator port declared in this site's Firebase config. + /// + /// The value must match the `emulators.hosting.port` value in + /// the site's Firebase config (`firebase.json`) file. + /// Each site needs a unique port so the emulators can run concurrently, + /// and `5000` must be avoided since AirPlay can use it on macOS. + final int firebaseEmulatorPort; + + /// The default Firebase project ID for production and staging deploys. + /// + /// Commands expose this as an overrideable default so contributors can + /// deploy the site to their own Firebase projects for testing. + final String defaultFirebaseProjectId; + + /// Whether this site supports code excerpts managed by `refresh-excerpts`. + final bool supportsCodeExcerpts; /// The directory where this site's content and implementation is located. String get directory => path.join('sites', name); + + /// The directory where this site's content is located. + String get contentDirectory => + path.joinAll([directory, ...contentPathSegments]); + + /// The directory where this site's production build output should end up. + String get buildOutputDirectory => path.joinAll(buildOutputPathSegments); + + /// The directory where Jaspr writes this site's production build, + /// before it is copied to [buildOutputDirectory] if different. + String get jasprBuildOutputDirectory => + path.join(directory, 'build', 'jaspr'); + + /// The location of this site's Firebase config file. + String get firebaseConfigPath => path.joinAll(firebaseConfigPathSegments); + + /// The directory containing this site's Firebase config file. + String get firebaseConfigDirectory => path.dirname(firebaseConfigPath); + + /// The ports Jaspr uses when serving this site locally. + /// + /// Each port is derived from this site's declaration order in [Site] so + /// that multiple sites can be served concurrently without port conflicts. + /// Each is offset by one past Jaspr's default to avoid colliding with a + /// separate Jaspr project running with default port configuration. + ({int serve, int webDev, int proxy}) get jasprPorts => ( + serve: _jasprDefaultSitePort + index + 1, + webDev: _jasprDefaultWebDevPort + index + 1, + proxy: _jasprDefaultProxyPort + index + 1, + ); } /// The name of the global `--site` option. const String siteOptionName = 'site'; +const int _jasprDefaultSitePort = 8080; +const int _jasprDefaultWebDevPort = 5467; +const int _jasprDefaultProxyPort = 5567; + extension CommandSiteResolution on Command { /// The [Site] selected with the global `--site` option, /// defaulting to [Site.docs]. diff --git a/tool/dash_site/lib/src/utils.dart b/tool/dash_site/lib/src/utils.dart index 58f97f5c11..6e3f765812 100644 --- a/tool/dash_site/lib/src/utils.dart +++ b/tool/dash_site/lib/src/utils.dart @@ -22,9 +22,6 @@ final String repositoryRoot = () { return maybeRoot; }(); -/// The path of the site output directory. -final String siteOutputDirectoryPath = path.join(repositoryRoot, '_site'); - final bool _runningInCi = Platform.environment['CI'] == 'true'; int installJasprCliIfNecessary() { diff --git a/tool/dash_site/pubspec.yaml b/tool/dash_site/pubspec.yaml index 8ebe90d7d2..3afb34a8f5 100644 --- a/tool/dash_site/pubspec.yaml +++ b/tool/dash_site/pubspec.yaml @@ -4,12 +4,13 @@ publish_to: none resolution: workspace environment: - sdk: ^3.11.0 + sdk: ^3.12.0-0 dependencies: args: ^2.7.0 excerpter: path: ../../packages/excerpter + github: ^9.25.0 io: ^1.0.5 linkcheck: ^3.1.0 path: ^1.9.1