mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
## Summary - This PR adds a new boolean property `automaticallyImplyActions` to the `AppBar` widget. - It provides fine-grained control over whether an automatic menu icon (`Icons.menu`) is added when an `endDrawer` is present and `actions` are null or empty. ## Details ### Background In the current behavior of `AppBar`, if: - The `Scaffold` has a non-null `endDrawer`, and - The `AppBar.actions` is either `null` or an empty list `[]` Then Flutter **automatically inserts** a trailing menu icon (`Icons.menu`) into the `actions` list, which opens the `endDrawer`. ### New Behavior This PR introduces: ```dart final bool automaticallyImplyActions; // default: true ``` Developers can now control this behavior: - `automaticallyImplyActions: true` (default):\ The menu icon is automatically inserted when appropriate, as before. - `automaticallyImplyActions: false`:\ The `AppBar` will **not** add the automatic trailing menu icon, even if an `endDrawer` is present and `actions` are null or empty. ### All Possible Scenarios | `endDrawer` | `actions` | `automaticallyImplyActions` | Result | | ----------- | ----------------- | --------------------------- | ----------------------------------- | | ✅ present | `null` or `[]` | `true` (default) | Automatic menu icon is added | | ✅ present | `null` or `[]` | `false` | No menu icon is added | | ✅ present | `[customWidgets]` | `true` / `false` | Custom actions shown, no menu added | | ❌ absent | any value | any value | No menu icon is added | This provides predictable, developer-controlled behavior while maintaining backward compatibility. --- ## Use Case This change benefits developers who: - Want to **prevent automatic UI behaviors** when building custom app bars. - Need full control over the trailing icons without modifying internal logic. - Encounter issues where the menu icon appears unintentionally in minimal `AppBar` configurations. --- ## Default Behavior (No Breaking Change) - The default value is `true`, so existing applications are **not affected**. - The new behavior is **opt-in** by setting `automaticallyImplyActions: false`. --- ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [ ] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md