Arindam Karmakar 2fbe9398bd
Add automaticallyImplyActions property to AppBar (#171113)
## 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
2025-07-24 00:02:06 +00:00
..