Skip to content

Bump github/codeql-action from 2.1.10 to 2.1.16 - #9

Closed
dependabot[bot] wants to merge 1 commit into
masterfrom
dependabot/github_actions/github/codeql-action-2.1.16
Closed

dependabot[bot] wants to merge 1 commit into
masterfrom
dependabot/github_actions/github/codeql-action-2.1.16

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jul 13, 2022

Copy link
Copy Markdown

Bumps github/codeql-action from 2.1.10 to 2.1.16.

Changelog

Sourced from github/codeql-action's changelog.

CodeQL Action Changelog

[UNRELEASED]

No user facing changes.

2.1.16 - 13 Jul 2022

  • You can now quickly debug a job that uses the CodeQL Action by re-running the job from the GitHub UI and selecting the "Enable debug logging" option. #1132
  • You can now see diagnostic messages produced by the analysis in the logs of the analyze Action by enabling debug mode. To enable debug mode, pass debug: true to the init Action, or enable step debug logging. This feature is available for CodeQL CLI version 2.10.0 and later. #1133

2.1.15 - 28 Jun 2022

  • CodeQL query packs listed in the packs configuration field will be skipped if their target language is not being analyzed in the current Actions job. Previously, this would throw an error. #1116
  • The combination of python2 and poetry is no longer supported. See actions/setup-python#374 for more details. #1124
  • Update default CodeQL bundle version to 2.10.0. #1123

2.1.14 - 22 Jun 2022

No user facing changes.

2.1.13 - 21 Jun 2022

  • Update default CodeQL bundle version to 2.9.4. #1100

2.1.12 - 01 Jun 2022

  • Update default CodeQL bundle version to 2.9.3. #1084

2.1.11 - 17 May 2022

  • Update default CodeQL bundle version to 2.9.2. #1074

2.1.10 - 10 May 2022

  • Update default CodeQL bundle version to 2.9.1. #1056
  • When wait-for-processing is enabled, the workflow will now fail if there were any errors that occurred during processing of the analysis results.

2.1.9 - 27 Apr 2022

  • Add working-directory input to the autobuild action. #1024
  • The analyze and upload-sarif actions will now wait up to 2 minutes for processing to complete after they have uploaded the results so they can report any processing errors that occurred. This behavior can be disabled by setting the wait-for-processing action input to "false". #1007
  • Update default CodeQL bundle version to 2.9.0.
  • Fix a bug where status reporting fails on Windows. #1042

2.1.8 - 08 Apr 2022

  • Update default CodeQL bundle version to 2.8.5. #1014
  • Fix error where the init action would fail due to a GitHub API request that was taking too long to complete #1025

... (truncated)

Commits
  • 3e7e3b3 Merge pull request #1140 from github/update-v2.1.16-548f07e3
  • 330d552 Update changelog for v2.1.16
  • 548f07e Merge pull request #1139 from github/aeisenberg/concat-not-push
  • a844fef Merge branch 'main' into aeisenberg/concat-not-push
  • 7ce9ef9 Use concat instead of push around listFolders
  • d750c6d Merge pull request #1138 from github/henrymercer/drop-token-check
  • 4cb248b Merge branch 'main' into henrymercer/drop-token-check
  • 1e7f770 Merge pull request #1132 from github/henrymercer/one-click-debug
  • 816b3e9 Update failure message
  • fbbd1dc Fix extra double quote
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

@dependabot @github

dependabot Bot commented on behalf of github Jul 13, 2022

Copy link
Copy Markdown
Author

Dependabot tried to add @hixie and @godofredoc as reviewers to this PR, but received the following error from GitHub:

POST https://api.github.com/repos/DanTup/flutter/pulls/9/requested_reviewers: 422 - Reviews may only be requested from collaborators. One or more of the users or teams you specified is not a collaborator of the DanTup/flutter repository. // See: https://docs.github.com/rest/reference/pulls#request-reviewers-for-a-pull-request

@dependabot @github

dependabot Bot commented on behalf of github Jul 13, 2022

Copy link
Copy Markdown
Author

The following labels could not be found: team, team: infra, waiting for tree to go green.

@dependabot @github

dependabot Bot commented on behalf of github Jul 28, 2022

Copy link
Copy Markdown
Author

Superseded by #11.

@dependabot dependabot Bot closed this Jul 28, 2022
@dependabot
dependabot Bot deleted the dependabot/github_actions/github/codeql-action-2.1.16 branch July 28, 2022 18:29
DanTup pushed a commit that referenced this pull request Jun 8, 2023
…extMenuBuilder (flutter#128114)

Close flutter#128113 

Fun fact: This is caught by monkey testing I have written (will soon be open sourced as well) that runs on my app!

Without the fix, the test fails as expected:

<details>

```
(base) �  flutter git:(feat/text-field-npe) /Volumes/MyExternal/ExternalRefCode/flutter/bin/flutter test test/material/text_field_test.dart --name 'changes from default'
00:06 +0: context menu contextMenuBuilder changes from default to null                                                                
��� EXCEPTION CAUGHT BY WIDGETS LIBRARY ������������������������������������������������������������
The following _TypeError was thrown building
_OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#e3717](state:
_OverlayEntryWidgetState#7666a):
Null check operator used on a null value

When the exception was thrown, this was the stack:
#0      EditableTextState._createSelectionOverlay.<anonymous closure> (package:flutter/src/widgets/editable_text.dart:3331:43)
#1      SelectionOverlay.showToolbar.<anonymous closure> (package:flutter/src/widgets/text_selection.dart:1357:36)
#2      ContextMenuController.show.<anonymous closure> (package:flutter/src/widgets/context_menu_controller.dart:65:54)
#3      _OverlayEntryWidgetState.build (package:flutter/src/widgets/overlay.dart:351:36)
#4      StatefulElement.build (package:flutter/src/widgets/framework.dart:5198:27)
#5      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5086:15)
#6      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
#7      Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#8      StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
#9      Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#10     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:6093:32)
#11     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6595:17)
#12     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#13     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#14     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
#15     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#16     StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
#17     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#18     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#19     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#20     ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
#21     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#22     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#23     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#24     ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
#25     _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
#26     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#27     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#28     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
#29     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#30     StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
#31     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#32     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#33     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#34     ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
#35     _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
#36     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#37     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#38     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
#39     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#40     StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
#41     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#42     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#43     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
#44     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#45     StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
#46     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#47     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
#48     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#49     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
#50     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#51     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#52     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#53     ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
#54     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#55     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#56     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
#57     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#58     StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
#59     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#60     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#61     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#62     ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
#63     _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
#64     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#65     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
#66     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#67     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#68     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
#69     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#70     StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
#71     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#72     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#73     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#74     ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
#75     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
#76     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
#77     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
#78     ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
#79     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#80     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#81     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#82     ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#83     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#84     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#85     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#86     ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#87     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#88     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#89     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#90     StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5)
flutter#91     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#92     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#93     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#94     ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#95     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#96     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#97     Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#98     StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5)
flutter#99     Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#100    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#101    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#102    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#103    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#104    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#105    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#106    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#107    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#108    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#109    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#110    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#111    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#112    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#113    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#114    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#115    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#116    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#117    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#118    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#119    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#120    StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5)
flutter#121    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#122    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#123    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#124    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#125    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#126    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
flutter#127    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#128    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#129    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#130    StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5)
flutter#131    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#132    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#133    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#134    StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5)
flutter#135    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#136    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#137    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#138    StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5)
flutter#139    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#140    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#141    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#142    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#143    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#144    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#145    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#146    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#147    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#148    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
flutter#149    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#150    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#151    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#152    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#153    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#154    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#155    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
flutter#156    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#157    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#158    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#159    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#160    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
flutter#161    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#162    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#163    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#164    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#165    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#166    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#167    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#168    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#169    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#170    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#171    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#172    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#173    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#174    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#175    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#176    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#177    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#178    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#179    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#180    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#181    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
flutter#182    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#183    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#184    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#185    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#186    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
flutter#187    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#188    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#189    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#190    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#191    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#192    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#193    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#194    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#195    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#196    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#197    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#198    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#199    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#200    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#201    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#202    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#203    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#204    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#205    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#206    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#207    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
flutter#208    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#209    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#210    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#211    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#212    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
flutter#213    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#214    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#215    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#216    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#217    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#218    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#219    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#220    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#221    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#222    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#223    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#224    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#225    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#226    StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5)
flutter#227    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#228    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
flutter#229    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#230    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#231    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#232    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#233    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
flutter#234    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#235    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#236    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#237    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#238    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#239    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#240    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#241    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#242    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#243    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#244    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#245    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#246    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#247    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#248    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#249    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#250    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#251    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#252    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#253    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#254    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#255    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#256    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#257    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#258    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#259    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#260    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#261    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#262    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#263    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#264    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#265    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#266    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#267    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#268    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#269    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#270    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#271    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#272    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#273    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#274    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#275    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#276    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#277    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
flutter#278    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#279    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#280    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#281    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#282    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
flutter#283    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#284    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#285    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#286    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#287    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#288    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#289    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#290    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#291    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#292    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#293    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#294    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#295    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#296    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#297    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#298    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#299    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#300    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#301    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#302    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#303    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#304    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#305    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#306    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#307    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#308    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#309    StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#310    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#311    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#312    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#313    ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#314    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#315    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#316    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#317    StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5)
flutter#318    Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#319    RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1253:16)
flutter#320    RenderObjectToWidgetElement.update (package:flutter/src/widgets/binding.dart:1230:5)
flutter#321    RenderObjectToWidgetElement.performRebuild (package:flutter/src/widgets/binding.dart:1244:7)
flutter#322    Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#323    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2780:19)
flutter#324    AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1396:19)
flutter#325    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:358:5)
flutter#326    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1297:15)
flutter#327    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1227:9)
flutter#328    AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:1246:9)
flutter#331    TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:68:41)
flutter#332    AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1232:27)
flutter#333    WidgetTester._pumpWidget (package:flutter_test/src/widget_tester.dart:587:20)
flutter#334    WidgetTester.pumpWidget.<anonymous closure> (package:flutter_test/src/widget_tester.dart:572:14)
flutter#337    TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:68:41)
flutter#338    WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:571:27)
flutter#339    main.<anonymous closure>.<anonymous closure> (file:///Volumes/MyExternal/ExternalRefCode/flutter/packages/flutter/test/material/text_field_test.dart:15687:20)
<asynchronous suspension>
<asynchronous suspension>
(elided 5 frames from dart:async and package:stack_trace)

����������������������������������������������������������������������������������������������������
00:06 +0 -1: context menu contextMenuBuilder changes from default to null [E]                                                         
  Test failed. See exception logs above.
  The test description was: contextMenuBuilder changes from default to null
  
To run this test again: /Volumes/MyExternal/ExternalRefCode/flutter/bin/cache/dart-sdk/bin/dart test /Volumes/MyExternal/ExternalRefCode/flutter/packages/flutter/test/material/text_field_test.dart -p vm --plain-name 'context menu contextMenuBuilder changes from default to null'
00:06 +0 -1: Some tests failed.                                                                                                       
(base) �  flutter git:(feat/text-field-npe) 

```

</details>
DanTup pushed a commit that referenced this pull request Aug 31, 2023
This is a follow up to the following pull requests:
- flutter#124514

I was finally able to reproduce this bug and found out why it was happening. Consider this code:

```dart
GestureDetector(
  behavior: HitTestBehavior.translucent,
  // Note: Make sure onTap is not null to ensure events
  // are captured by `GestureDetector`
  onTap: () {},
  child: _shouldShowSlider
    ? Slider(value: _value, onChanged: _handleSlide)
    : const SizedBox.shrink().
)
```

Runtime exception happens when:

1. User taps and holds the Slider (drag callback captured by `GestureDetector`)
2. `_shouldShowSlider` changes to false, Slider disappears and unmounts, and unregisters `_handleSlide`. But the callback is still registered by `GestureDetector`
3. Users moves finger as if Slider were still there
4. Drag callback is invoked, `_SliderState.showValueIndicator` is called
5. Exception - Slider is already disposed

This pull request fixes it by adding a mounted check inside `_SliderState.showValueIndicator` to ensure the Slider is actually mounted at the time of invoking drag event callback. I've added a unit test that will fail without this change.

The error stack trace is:

```
The following assertion was thrown while handling a gesture:
This widget has been unmounted, so the State no longer has a context (and should be considered
defunct).
Consider canceling any active work during "dispose" or using the "mounted" getter to determine if
the State is still active.

When the exception was thrown, this was the stack:
#0      State.context.<anonymous closure> (package:flutter/src/widgets/framework.dart:950:9)
#1      State.context (package:flutter/src/widgets/framework.dart:956:6)
#2      _SliderState.showValueIndicator (package:flutter/src/material/slider.dart:968:18)
#3      _RenderSlider._startInteraction (package:flutter/src/material/slider.dart:1487:12)
#4      _RenderSlider._handleDragStart (package:flutter/src/material/slider.dart:1541:5)
#5      DragGestureRecognizer._checkStart.<anonymous closure> (package:flutter/src/gestures/monodrag.dart:531:53)
#6      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:275:24)
#7      DragGestureRecognizer._checkStart (package:flutter/src/gestures/monodrag.dart:531:7)
#8      DragGestureRecognizer._checkDrag (package:flutter/src/gestures/monodrag.dart:498:5)
#9      DragGestureRecognizer.acceptGesture (package:flutter/src/gestures/monodrag.dart:431:7)
#10     _CombiningGestureArenaMember.acceptGesture (package:flutter/src/gestures/team.dart:45:14)
#11     GestureArenaManager._resolveInFavorOf (package:flutter/src/gestures/arena.dart:281:12)
#12     GestureArenaManager._resolve (package:flutter/src/gestures/arena.dart:239:9)
#13     GestureArenaEntry.resolve (package:flutter/src/gestures/arena.dart:53:12)
#14     _CombiningGestureArenaMember._resolve (package:flutter/src/gestures/team.dart:85:15)
#15     _CombiningGestureArenaEntry.resolve (package:flutter/src/gestures/team.dart:19:15)
#16     OneSequenceGestureRecognizer.resolve (package:flutter/src/gestures/recognizer.dart:375:13)
#17     DragGestureRecognizer.handleEvent (package:flutter/src/gestures/monodrag.dart:414:13)
#18     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:98:12)
#19     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:143:9)
#20     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:625:13)
#21     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:141:18)
#22     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:127:7)
#23     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:488:19)
#24     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:468:22)
#25     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:439:11)
#26     GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:413:7)
#27     GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:376:5)
#28     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:323:7)
#29     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:292:9)
#30     _invoke1 (dart:ui/hooks.dart:186:13)
#31     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:433:7)
#32     _dispatchPointerDataPacket (dart:ui/hooks.dart:119:31)

Handler: "onStart"
Recognizer:
  HorizontalDragGestureRecognizer#a5df2
```

*List which issues are fixed by this PR. You must list at least one issue.*

Internal bug: b/273666179, b/192329942

*If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].*
DanTup pushed a commit that referenced this pull request May 21, 2025
Fixes error found in rolling to google.

```
[☠] Android toolchain - develop for Android devices (the doctor check crashed)
    ✗ Due to an error, the doctor check did not complete. If the error message
      below is not helpful, please let us know about this issue at
      https://github.com/flutter/flutter/issues.
    ✗ type 'Null' is not a subtype of type 'String' of 'executable'
    • #0      LocalProcessManager.canRun
      (package:process/src/interface/local_process_manager.dart:124)
      #1      getEmulatorVersion
      (package:flutter_tools/src/android/android_workflow.dart:64)
      #2      AndroidValidator.validateImpl
      (package:flutter_tools/src/android/android_workflow.dart:200)
      #3      DoctorValidator.validate
      (package:flutter_tools/src/doctor_validator.dart:58)
      #4      Doctor.startValidatorTasks.<anonymous closure>
      (package:flutter_tools/src/doctor.dart:244)
      #5      asyncGuard.<anonymous closure>
      (package:flutter_tools/src/base/async_guard.dart:109)
      #6      _rootRun (dart:async/zone.dart:1525)
      #7      _CustomZone.run (dart:async/zone.dart:1422)
      #8      _runZoned (dart:async/zone.dart:2033)
      #9      runZonedGuarded (dart:async/zone.dart:2019)
      #10     runZoned (dart:async/zone.dart:1952)
      #11     asyncGuard (package:flutter_tools/src/base/async_guard.dart:106)
      #12     Doctor.startValidatorTasks
      (package:flutter_tools/src/doctor.dart:234)
      #13     Doctor.diagnose (package:flutter_tools/src/doctor.dart:372)
      #14     DoctorCommand.runCommand
      (package:flutter_tools/src/commands/doctor.dart:59)
      #15     FlutterCommand.verifyThenRunCommand
      (package:flutter_tools/src/runner/flutter_command.dart:1897)
      <asynchronous suspension>
      #16     FlutterCommand.run.<anonymous closure>
      (package:flutter_tools/src/runner/flutter_command.dart:1551)
      <asynchronous suspension>
      #17     AppContext.run.<anonymous closure>
      (package:flutter_tools/src/base/context.dart:154)
      <asynchronous suspension>
      #18     CommandRunner.runCommand (package:args/command_runner.dart:212)
      <asynchronous suspension>
      #19     FlutterCommandRunner.runCommand.<anonymous closure>
      (package:flutter_tools/src/runner/flutter_command_runner.dart:501)
      <asynchronous suspension>
      #20     AppContext.run.<anonymous closure>
      (package:flutter_tools/src/base/context.dart:154)
      <asynchronous suspension>
      #21     FlutterCommandRunner.runCommand
      (package:flutter_tools/src/runner/flutter_command_runner.dart:438)
      <asynchronous suspension>
      #22     run.<anonymous closure>.<anonymous closure>
      (package:flutter_tools/runner.dart:98)
      <asynchronous suspension>
      #23     AppContext.run.<anonymous closure>
      (package:flutter_tools/src/base/context.dart:154)
      <asynchronous suspension>
      #24     AppContext.run.<anonymous closure>
      (package:flutter_tools/src/base/context.dart:154)
      <asynchronous suspension>
      #25     run (package:mobile.flutter.cli/flutter_tools.dart:106)
      <asynchronous suspension>
      #26     main (google3:///mobile/flutter/cli/bin/cli_usage_aot.dart:4)
```

## 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].
- [x] 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.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- 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
DanTup pushed a commit that referenced this pull request Jun 10, 2026
This patch:
1. Updates the `-mios-simulator-version-min` ldflag to `15.0` (this
fixes the crash during test discovery).
2. refactors swiftc.py a bit, moves the target triplet logic from
darwin/BUILD.gn to swiftc.py so you can override the ios version in a
test target (but it's not absolutely necessary for this change since
it's the linker flag that makes the difference).
3. Migrates a few xctest tests to swift testing tests. The names of the
tests are kept as-is so the diff is easier to read.


### The Crash 
```
(lldb) bt
* thread #9, name = '[Swift Testing] test discovery - loading test #0 (Task 3)', queue = 'com.apple.root.user-initiated-qos.cooperative', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x0000000000000000 
    frame #1: 0x000000010ad0fb80 libios_test_flutter.dylib`closure #1() in variable initialization expression of static AccessibilityFeaturesTests.$s22ios_test_flutter_swift26AccessibilityFeaturesTestsV43accessibilityFeatureFlagRawValuesAreCorrect4TestfMp_24accessorc8120add5c86a9e3fMu_ at @__swiftmacro_22ios_test_flutter_swift26AccessibilityFeaturesTestsV43accessibilityFeatureFlagRawValuesAreCorrect4TestfMp_.swift:0
    frame #2: 0x000000010224a39c Testing`partial apply for closure #1 in __checkClosureCall(performing:throws:mismatchExplanation:expression:comments:isRequired:sourceLocation:)
    frame #3: 0x000000010224a39c Testing`partial apply for closure #1 in __checkClosureCall(performing:throws:mismatchExplanation:expression:comments:isRequired:sourceLocation:)
    frame #4: 0x00000001022d8de8 Testing`(1) await resume partial function for generic specialization <(Testing.Test, Testing.Runner.Plan.Action)> of reabstraction thunk helper <τ_0_0 where τ_0_0: Swift.Sendable> from @escaping @isolated(any) @callee_guaranteed @async () -> (@out τ_0_0) to @escaping @callee_guaranteed @async () -> (@out τ_0_0, @error @owned Swift.Error)
    frame #5: 0x000000010224ae24 Testing`closure #1 in __checkClosureCall(throws:performing:expression:comments:isRequired:sourceLocation:)
```

Initially I thought swift testing doesn't support test discovery in
linked dylibs but it's apparently not the case. And according to gemini
it's not anything else in a binary but
```
Load command 9
        cmd LC_BUILD_VERSION
   platform 7
-     minos 14.0
+     minos 15.6
        sdk 26.4
```

As it tried to use `15.6` in `swift_flags` and put `14.0` in `ldflags`
and hit the same crash.

This is what gemini has to say:
> This is the definitive end of the road! 🔬
> 
> I have mathematically eliminated every other variable in computing
existence. Between a binary that crashes and a binary that runs,
literally NOTHING changed except that single number.


Also it thinks it's because of this in `dyld`:
> Look at the code in dyldMain.cpp at Line 430:
> 
> cpp
> // dyldMain.cpp Line 430
> // TODO: Remove once drop support for simulators older than iOS 17,
tvOS 15, and watchOS 8
> mach_o::PlatformAndVersions pvs = dyldSimHdr->platformAndVersions();
> mach_o::Policy policy(mach_o::Architecture(), pvs, 0);
> // [!!] THE SMOKING GUN [!!]
> // Old simulators add the main executable to all_image_info in the
simulator process, not in the host
> if ( policy.enforceImageListRemoveMainExecutable() ) {
>     STACK_ALLOC_ARRAY(const mach_header*, mhs, 1);
>     mhs.push_back(state.config.process.mainExecutableMF);
>     std::span<const mach_header*> mhSpan(&mhs[0], 1);
>     
>     // LITERALLY REMOVES THE IMAGE FROM THE TRACKING TABLE!!
> state.externallyViewable->removeImages(state.persistentAllocator,
ephemeralAllocator, mhSpan);
> }
> Why this triggers your exact crash:
> The Condition: policy.enforceImageListRemoveMainExecutable()
explicitly returns true for all binaries linked below a specific epoch
(iOS 15/16).
> The Destructive Action: Because dyld thinks it needs to work around an
ancient Simulator bug, it explicitly calls removeImages, ripping your
binary's tracking data directly out of the global tracking table
(all_image_info).
> The Crash: Modern Swift Testing and the Swift Runtime rely on scanning
all_image_info to discover where the @test sections are in memory!
> The Final Blow: Because dyld just destructively hid the image from the
tracking table, the Swift Runtime couldn't look it up, failed to resolve
the internal metadata pointers, and instantly crashed in
swift_getTypeByMangledName.
> By simply lying and writing minos 15.0 into the header, you caused
policy.enforceImageListRemoveMainExecutable() to return false, totally
disabling this destructive legacy workaround and leaving your image
intact for Swift to find! 🔬🏆🏁

## Pre-launch Checklist

- [ ] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [ ] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [ ] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [ ] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [ ] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [ ] I updated/added relevant documentation (doc comments with `///`).
- [ ] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [ ] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [ ] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

If this change needs to override an active code freeze, provide a
comment explaining why. The code freeze workflow can be overridden by
code reviewers. See pinned issues for any active code freezes with
guidance.

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[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
DanTup pushed a commit that referenced this pull request Aug 6, 2026
Fixes flutter#184725

This PR makes the tool exit when building with XCode and we didn't parse
any build setting. I understand that there are no cases where this map
can be empty, as it includes the app bundle ID, which is required when
building.

If we don't exit, it can show unrelated error messages to the users
which could be confusing and hard to debug.
For instance, from the linked issue, one could end up getting: `No valid
code signing certificates were found` simply because the development
team build setting was not available, despite having valid certificates
installed.

Sample output:
```
[  +63 ms] executing: [/Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj/] /usr/bin/arch -arm64e xcrun xcodebuild -project /Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj -scheme Runner -configuration Release -destination generic/platform=iOS -showBuildSettings BUILD_DIR=/Users/admin/builds/AEFj1IwjB/0/repo/build/ios
[        ] executing: [/Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj/] /usr/bin/arch -arm64e xcrun xcodebuild -project /Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj -scheme Runner -configuration Release -destination generic/platform=iOS -showBuildSettings BUILD_DIR=/Users/admin/builds/AEFj1IwjB/0/repo/build/ios
[ +765 ms] Command line invocation:
               /Applications/Xcode-26.3.0.app/Contents/Developer/usr/bin/xcodebuild -project /Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj -scheme Runner -configuration Release -destination generic/platform=iOS -showBuildSettings BUILD_DIR=/Users/admin/builds/AEFj1IwjB/0/repo/build/ios
           Build settings from command line:
               BUILD_DIR = /Users/admin/builds/AEFj1IwjB/0/repo/build/ios
           2026-04-06 17:36:53.692 xcodebuild[9020:45597] Writing error result bundle to /var/folders/4p/084k9rr96ld_w60n8rdr0wtm0000gn/T/ResultBundle_2026-06-04_17-36-0053.xcresult
           xcodebuild: error: Could not configure request to show build settings: Unable to find a destination matching the provided destination specifier:
           		{ generic:1, platform:iOS }
           	Ineligible destinations for the "Runner" scheme:
           		{ platform:iOS, id:dvtdevice-DVTiPhonePlaceholder-iphoneos:placeholder, name:Any iOS Device, error:iOS 26.2 is not installed. Please download and install the platform from Xcode > Settings > Components. }
[        ] Unexpected failure to get Xcode build settings: ProcessException: Process exited abnormally with exit code 64:
           Command line invocation:
               /Applications/Xcode-26.3.0.app/Contents/Developer/usr/bin/xcodebuild -project /Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj -scheme Runner -configuration Release -destination generic/platform=iOS -showBuildSettings BUILD_DIR=/Users/admin/builds/AEFj1IwjB/0/repo/build/ios
           Build settings from command line:
               BUILD_DIR = /Users/admin/builds/AEFj1IwjB/0/repo/build/ios
           2026-04-06 17:36:53.692 xcodebuild[9020:45597] Writing error result bundle to /var/folders/4p/084k9rr96ld_w60n8rdr0wtm0000gn/T/ResultBundle_2026-06-04_17-36-0053.xcresult
           xcodebuild: error: Could not configure request to show build settings: Unable to find a destination matching the provided destination specifier:
           		{ generic:1, platform:iOS }
           	Ineligible destinations for the "Runner" scheme:
           		{ platform:iOS, id:dvtdevice-DVTiPhonePlaceholder-iphoneos:placeholder, name:Any iOS Device, error:iOS 26.2 is not installed. Please download and install the platform from Xcode > Settings > Components. }
             Command: /usr/bin/arch -arm64e xcrun xcodebuild -project /Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj -scheme Runner -configuration Release -destination generic/platform=iOS -showBuildSettings BUILD_DIR=/Users/admin/builds/AEFj1IwjB/0/repo/build/ios.
[   +2 ms] Archiving example.com.myapp...
[  +25 ms] Migrating AppFrameworkInfo.plist contents
[        ] Upgrading AppFrameworkInfo.plist
[        ] Upgrading Podfile
[   +9 ms] The Swift Package Manager feature is off. Skipping the migration that adds Swift Package Manager integration...
[   +6 ms] executing: xattr -r -d com.apple.FinderInfo /Users/admin/builds/AEFj1IwjB/0/repo
[+1948 ms] Failed to remove xattr com.apple.FinderInfo from /Users/admin/builds/AEFj1IwjB/0/repo
[   +1 ms] executing: [/Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj/] /usr/bin/arch -arm64e xcrun xcodebuild -project /Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj -scheme Runner -configuration Release -destination generic/platform=iOS -showBuildSettings BUILD_DIR=/Users/admin/builds/AEFj1IwjB/0/repo/build/ios
[        ] executing: [/Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj/] /usr/bin/arch -arm64e xcrun xcodebuild -project /Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj -scheme Runner -configuration Release -destination generic/platform=iOS -showBuildSettings BUILD_DIR=/Users/admin/builds/AEFj1IwjB/0/repo/build/ios
[ +920 ms] Command line invocation:
               /Applications/Xcode-26.3.0.app/Contents/Developer/usr/bin/xcodebuild -project /Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj -scheme Runner -configuration Release -destination generic/platform=iOS -showBuildSettings BUILD_DIR=/Users/admin/builds/AEFj1IwjB/0/repo/build/ios
           Build settings from command line:
               BUILD_DIR = /Users/admin/builds/AEFj1IwjB/0/repo/build/ios
           2026-04-06 17:36:56.608 xcodebuild[9023:45646] Writing error result bundle to /var/folders/4p/084k9rr96ld_w60n8rdr0wtm0000gn/T/ResultBundle_2026-06-04_17-36-0056.xcresult
           xcodebuild: error: Could not configure request to show build settings: Unable to find a destination matching the provided destination specifier:
           		{ generic:1, platform:iOS }
           	Ineligible destinations for the "Runner" scheme:
           		{ platform:iOS, id:dvtdevice-DVTiPhonePlaceholder-iphoneos:placeholder, name:Any iOS Device, error:iOS 26.2 is not installed. Please download and install the platform from Xcode > Settings > Components. }
[        ] Unexpected failure to get Xcode build settings: ProcessException: Process exited abnormally with exit code 64:
           Command line invocation:
               /Applications/Xcode-26.3.0.app/Contents/Developer/usr/bin/xcodebuild -project /Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj -scheme Runner -configuration Release -destination generic/platform=iOS -showBuildSettings BUILD_DIR=/Users/admin/builds/AEFj1IwjB/0/repo/build/ios
           Build settings from command line:
               BUILD_DIR = /Users/admin/builds/AEFj1IwjB/0/repo/build/ios
           2026-04-06 17:36:56.608 xcodebuild[9023:45646] Writing error result bundle to /var/folders/4p/084k9rr96ld_w60n8rdr0wtm0000gn/T/ResultBundle_2026-06-04_17-36-0056.xcresult
           xcodebuild: error: Could not configure request to show build settings: Unable to find a destination matching the provided destination specifier:
           		{ generic:1, platform:iOS }
           	Ineligible destinations for the "Runner" scheme:
           		{ platform:iOS, id:dvtdevice-DVTiPhonePlaceholder-iphoneos:placeholder, name:Any iOS Device, error:iOS 26.2 is not installed. Please download and install the platform from Xcode > Settings > Components. }
             Command: /usr/bin/arch -arm64e xcrun xcodebuild -project /Users/admin/builds/AEFj1IwjB/0/repo/ios/Runner.xcodeproj -scheme Runner -configuration Release -destination generic/platform=iOS -showBuildSettings BUILD_DIR=/Users/admin/builds/AEFj1IwjB/0/repo/build/ios.
[  +66 ms] executing: which security
[   +4 ms] executing: which openssl
[  +22 ms] executing: security find-identity -p codesigning -v
[  +57 ms]   1) <ID> "Apple Distribution: ACME. (<ID>)"
                1 valid identities found
[   +1 ms] ════════════════════════════════════════════════════════════════════════════════
           No valid code signing certificates were found
           You can connect to your Apple Developer account by signing in with your Apple ID
           in Xcode and create an iOS Development Certificate as well as a Provisioning 
           Profile for your project by:
             1- Open the Flutter project's Xcode target with
                  open ios/Runner.xcworkspace
             2- Select the 'Runner' project in the navigator then the 'Runner' target
                in the project settings
             3- Make sure a 'Development Team' is selected under Signing & Capabilities > Team. 
                You may need to:
                    - Log in with your Apple ID in Xcode first
                    - Ensure you have a valid unique Bundle ID
                    - Register your device with your Apple Developer Account
                    - Let Xcode automatically provision a profile for your app
             4- Build or run your project again
             5- Trust your newly created Development Certificate on your iOS device
                via Settings > General > Device Management > [your new certificate] > Trust
           For more information, please visit:
             https://developer.apple.com/library/content/documentation/IDEs/Conceptual/
             AppDistributionGuide/MaintainingCertificates/MaintainingCertificates.html
           Or run on an iOS simulator without code signing
           ════════════════════════════════════════════════════════════════════════════════
[   +1 ms] "flutter ipa" took 7,479ms.
[   +2 ms] executing: sw_vers -productName
[   +8 ms] Exit code 0 from: sw_vers -productName
[        ] macOS
[        ] executing: sw_vers -productVersion
[   +6 ms] Exit code 0 from: sw_vers -productVersion
[        ] 26.0
[        ] executing: sw_vers -buildVersion
[   +6 ms] Exit code 0 from: sw_vers -buildVersion
[        ] 25A354
[        ] executing: uname -m
[  +10 ms] Exit code 0 from: uname -m
[        ] arm64
[  +20 ms] No development certificates available to code sign app for device deployment
[        ] 
           #0      throwToolExit (package:flutter_tools/src/base/common.dart:34:3)
           #1      XcodeCodeSigningSettings._getCodeSigningBuildSettings (package:flutter_tools/src/ios/code_signing.dart:340:9)
           <asynchronous suspension>
           #2      buildXcodeProject (package:flutter_tools/src/ios/mac.dart:322:26)
           <asynchronous suspension>
           #3      _BuildIOSSubCommand.runCommand (package:flutter_tools/src/commands/build_ios.dart:986:37)
           <asynchronous suspension>
           #4      BuildIOSArchiveCommand.runCommand (package:flutter_tools/src/commands/build_ios.dart:477:50)
           <asynchronous suspension>
           #5      FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1590:27)
           <asynchronous suspension>
           #6      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19)
           <asynchronous suspension>
           #7      CommandRunner.runCommand (package:args/command_runner.dart:212:13)
           <asynchronous suspension>
           #8      FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:496:9)
           <asynchronous suspension>
           #9      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19)
           <asynchronous suspension>
           #10     FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:431:5)
           <asynchronous suspension>
           #11     FlutterCommandRunner.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:307:33)
           <asynchronous suspension>
           #12     run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:104:11)
           <asynchronous suspension>
           #13     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:154:19)
           <asynchronous suspension>
           #14     main (package:flutter_tools/executable.dart:103:3)
           <asynchronous suspension>
[        ] Running 2 shutdown hooks
[        ] Shutdown hooks complete
[  +56 ms] exiting with code 1
```

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [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].
- [x] 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.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

**Note**: The Flutter team is currently trialing the use of [Gemini Code
Assist for
GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code).
Comments from the `gemini-code-assist` bot should not be taken as
authoritative feedback from the Flutter team. If you find its comments
useful you can update your code accordingly, but if you are unsure or
disagree with the feedback, please feel free to wait for a Flutter team
member's review for guidance on which automated comments should be
addressed.

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[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

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Elijah Okoroh <[email protected]>
DanTup pushed a commit that referenced this pull request Oct 21, 2026
…tter#193962)

PR 7 (flutter#193693) merged to master as `ecd1ab06865` and PR 8 (flutter#193717) as
`4249ccbc18a`. This branch merges master at `4521d8d6634`, so the Files
tab shows only PR 9's changes.

PR 9 commits:
- `86523c549fc` Move aar_init_script to public AGP APIs
- `3edc95d1fa0` Check requested AAR variants in the module and each
plugin
- `da9646aad53` Address review: derive requested variants from
components, register AAR tasks lazily
- `94a29907065` Clarify aar_init_script comments from the adversarial
review
- `ea08280d886` Merge commit '23ddd6b74e6' into agp-aar-init-script (PR
8's head with master at `ecd1ab06865`; no conflicts, no change to PR 9's
files)
- `a17fafcc35e` Merge commit '5ba8961b517' into agp-aar-init-script
(master with PR 8 at `4249ccbc18a`; no conflicts, no change to PR 9's
files)
- `77ba449ea4a` Filter requested AAR components before adding tasks
- `adbfb9cd640` Drop the AGP version list from the duplicate-variant
comment
- `f2b7111c51e` Docs: state the AAR variant requirement in plain words
- `cd10f766b5b` Register an AAR task for every variant, publish only
requested ones
- `b9493299916` Merge commit '4521d8d6634' into agp-aar-init-script
(master, including flutter#193649; no conflicts, no change to PR 9's files)

## Description

This is PR 9 of 11 in the AGP 9.1.0 / public `gradle-api` migration
stack ([flutter#180137](flutter#180137),
[flutter#166550](flutter#166550)).

`flutter build aar` passes
`packages/flutter_tools/gradle/aar_init_script.gradle` to Gradle with
`-I`. The script read `android.libraryVariants` and AGP's internal
`publishing.singleVariants`. With AGP 9's `android.newDsl=true`,
`flutter build aar` on a module fails on `5ba8961b517` with `Can't
generate AAR on a non Android library project.` (script line 13), and
then at line 178 (`Could not get unknown property 'libraryVariants'`).
With this PR the script uses only `pluginManager.hasPlugin`,
`Publishing.singleVariant`, software `components` and `tasks.register`,
and the build succeeds with `newDsl` on and off, on AGP 9.3.1 and on
master's minimum AGP 9.1.1, and on AGP 8.11.1 when FGP's version check
is skipped.

**Breaking:** no. Builds that succeed on `5ba8961b517` succeed with the
same artifacts. Two failing cases change: a module or plugin build file
that declares `singleVariant` for only some variants builds, and a
variant mismatch between the module and a plugin fails with a Flutter
error instead of `Task with name … not found`.

**Base:** `master` at `4521d8d6634`. `aar_init_script.gradle`,
`build_aar_module_test.dart` and both docs are the same at `4521d8d6634`
and `5ba8961b517`, so the comparisons below against `5ba8961b517` hold
for `4521d8d6634`.

<details>
<summary>Agent authored details</summary>

### Changes

All in `aar_init_script.gradle` unless noted. Line numbers are at
`b9493299916`.

1. **Library check** (`:13`):
`project.pluginManager.hasPlugin("com.android.library")` replaces
`android.hasProperty("libraryVariants")`. The error text is unchanged.
2. **Publishing declarations** (`afterProject`, `:185-219`): Flutter
calls `android.publishing.singleVariant(<variant>) { withSourcesJar();
withJavadocJar() }` for each variant, one variant at a time. If the
project's build file already declared that variant, AGP throws, and
`isDuplicateSingleVariantError` (`:125-134`) matches AGP's exact
message, so the build file's declaration is kept. Its comment links the
AGP source of the message ([`AbstractPublishing.kt` at
`studio-2025.3.2`, AGP
9.1.0](https://android.googlesource.com/platform/tools/base/+/refs/tags/studio-2025.3.2/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/dsl/AbstractPublishing.kt#38)).
Any other exception is rethrown (`:201-203`). The guard that read
`publishing.singleVariants` and skipped every Flutter declaration once
the build file declared any variant is deleted.
3. **No module-to-plugin `dependsOn`** (`projectsEvaluated`): the loop
over `moduleProject.android.libraryVariants` that made each module
`assembleAar<Variant>` depend on the plugin's task (with eager
`tasks.named(...).get()`) is deleted. The tool requests
`assembleAar<Variant>` without a project path (`gradle.dart`
`buildGradleAar`, `command.add(aarTask)`), and Gradle runs a task
selector that is only a task name in every project that has the task
([Gradle
docs](https://docs.gradle.org/current/userguide/command_line_interface.html#executing_tasks_in_multi_project_builds):
"You can also run a task for all subprojects using a task selector that
consists of only the task name."). Each plugin publishes from its own
task. The comment at `:247-248` says this.
4. **Tasks, publications and task name** (`configureProject` `:27-37`;
`aarTaskName` `:93-97`; `requestedAarComponents` `:99-103`): AGP adds
one software component for each `singleVariant` declaration, with the
variant's name. `registerAarTask` (`:105-110`) registers
`assembleAar<Variant>` for every component, so a misspelled `--flavor`
gets Gradle's candidate list (`Some candidates are: 'assembleAarDebug',
...`). `requestedAarComponents` returns the components whose
`assembleAar<Variant>` name is in `startParameter.taskNames`; only those
get a publication (`addAarPublication`, `:112-123`), because `publish`
publishes every publication in the project. The check uses the same
function. `aarTaskName` is the only place that builds
`assembleAar<Variant>`; its comment points to the tool's `getAarTaskFor`
(`gradle.dart`). Nothing parses a task name back into a variant. The
`component.name != "all"` filter from `5ba8961b517` is deleted (see "Why
removing the deleted code is safe").
5. **Lazy task registration** (`registerAarTask`):
`project.tasks.register` replaces `project.tasks.create(name:)`. The
configuration action only adds `finalizedBy "publish"`.
`publications.create` runs in `addAarPublication`, not in the action,
because maven-publish registers tasks for each publication and Gradle
rejects that while it realizes a task
(`DefaultTaskContainer#register(String, Class, Action) on task set
cannot be executed in the current context.`, seen when
`publications.create` was inside the action).
6. **Requested-variant check** (`checkProjectsHaveRequestedVariants`,
`:136-175`, called at `:252`): Gradle skips projects that lack the
requested task, so the script checks the module and each Android plugin.
The requested variants are the names of the components that
`requestedAarComponents` returns for those projects. A project without a
requested variant fails the build with a `GradleException` that names
the variant and the project:
- module: `Flutter can't build the AAR for variant 'debug' because
module project ':flutter' has no variant with that name. Its variants
are: demoDebug, demoProfile, demoRelease, fullDebug, fullProfile,
fullRelease. Pass the module's product flavor with --flavor, or omit
--flavor if the module has no product flavors.`
- plugin: `Flutter can't build the AAR for variant 'demoDebug' because
plugin project ':plugin_a' has no variant with that name, so the plugin
AAR that the module depends on can't be published. `flutter build aar`
requires the module and each of its Android plugins to declare the same
product flavors.`
- A requested task that matches no project's variant (for example
`--flavor foo`) is left to Gradle: `Task 'assembleAarFooDebug' not found
in root project 'android_generated' and its subprojects. Some candidates
are: 'assembleAarDebug', 'assembleAarDemoDebug',
'assembleAarFullDebug'.` That is the same error as on `5ba8961b517`. The
check's doc says so. (`3edc95d1fa0` parsed the task-name prefix and
reported a Flutter module error in this case; `da9646aad53` drops the
parsing per review.)
7. **Docs.** Both docs describe behavior only.
- `Migrating-Flutter-Gradle-Plugin-to-AGP-public-API.md`: the P8 row of
the phase table and "Features that must break" item 8 are rewritten. The
"Why" starting-state list (L38-39) is unchanged, as in other PRs of the
stack.
-
[`website-page-draft.md`](https://github.com/flutter/flutter/blob/master/docs/platforms/android/website-page-draft.md)
(publishing tracked in
[flutter#193713](flutter#193713)): the
`flutter build aar` section is rewritten. It said Flutter "detects the
overlap and reports it with an actionable error". The code keeps the
build file's declaration instead, so the docs were changed to match the
code. It says (L234-237) that when a build file declares `singleVariant`
for a variant, Flutter keeps that declaration and declares the other
variants, and (L238-241) that the module and each Android plugin need a
variant with the built name.
8. **Tests.** devicelab `build_aar_module_test` gets two final sections:
- With `android.newDsl=true` and `android.builtInKotlin=true` in
`.android/gradle.properties`, and
`android.publishing.singleVariant("release") { withSourcesJar() }` in
`.android/Flutter/build.gradle`, it runs `flutter build aar
--no-profile`. It checks that the edits survive, that release has the
AAR and sources jar and no javadoc jar, that debug has the javadoc jar,
and that the plugin AARs exist for release and debug.
- It replaces that declaration with a `demo` product flavor and checks
both errors: `flutter build aar --no-profile --no-release` fails with
the module error, and the same with `--flavor demo` fails with the
plugin error.

`da9646aad53`'s commit message says the check's doc "says when it
returns and when it throws". That doc sentence was added in
`94a29907065`.

### Bug history (moved out of the docs)

The docs describe behavior only, so the history that `3edc95d1fa0` put
in them is here:
- On `5ba8961b517`, the `afterProject` guard skipped all of Flutter's
`singleVariant` declarations for a project whose build file declared any
variant. For a module with at least one Android plugin that declared
only `release`, every `flutter build aar` failed with `Task with name
'assembleAarDebug' not found in project ':flutter'`. With this PR that
build succeeds (table 1 below).
- On `5ba8961b517`, the `dependsOn` loop failed with `Task with name
'assembleAar<Variant>' not found in project ':<plugin>'` whenever a
plugin lacked any module variant, requested or not, and nothing checked
that the module had the requested variant. With this PR only requested
variants are checked, in the module and in each plugin (table 2 below).

### Audit resolution

[PR 9 draft
audit](reidbaker-agent#9 (comment)),
and stack audit items M4 and L8:

| Item | Resolution |
| --- | --- |
| 1. Eager `.get()` and cross-project task lookup by name | The wiring
is deleted, not made lazy: it was redundant (Changes 3). No `.get()` or
`tasks.named` in the script. The check reads software components, and
`registerAarTask` uses `tasks.register`. |
| 2. Broad `catch (Exception)`; overstated `multipleVariants` warning |
Only AGP's exact duplicate message is ignored (`:130-134`); everything
else is rethrown (`:201-203`). No warning is logged, so there is no
`multipleVariants` claim. |
| 3. Ext property without `flutter.internal.` | No ext property.
`afterProject` fires once per project (instrumented: count 1 for `:`,
`:app`, `:flutter`, `:plugin_a` and the included FGP build), and a
second call would only hit ignored duplicates. The "fires more than once
in composite settings" claim is dropped. |

Why the message match and not the type: AGP reports the duplicate from
`AbstractPublishing.checkSingleVariantUniqueness` through
`SyncIssueReporterImpl`, which throws
`com.android.builder.errors.EvalIssueException` in STANDARD mode. That
class is in `com.android.tools.build:builder`, not in `gradle-api`, and
is not on the init script's classpath. `javap -v` on
`AbstractPublishing` shows the same text in AGP 8.11.1, 9.1.0 and 9.3.1.
AGP checks before it adds the component (8.11.1
`AbstractPublishing.kt:27-35`), so the build file's declaration stays.
If AGP changes the text, the exception is rethrown and the build fails
loudly; devicelab `build_aar_module_test` exercises the path on the
template AGP.

Why not declare first or query: the public `Publishing` DSL in
`gradle-api-9.1.0.jar` has only `singleVariant(String)` and
`singleVariant(String, Function1)`, and `LibraryPublishing` adds only
`multipleVariants(...)` (`javap`), so there is no public way to list
declared variants. Declaring Flutter's variants in `beforeProject` +
`pluginManager.withPlugin("com.android.library")` makes the build file
fail at its own `singleVariant("release")` line with the duplicate error
(probe).

Why not AGP types in the init script: `import
com.android.build.api.dsl.LibraryExtension` fails with `unable to
resolve class`. With `gradle-api:9.3.1` on the `initscript` classpath,
the init script gets its own copy of the class from a different
classloader, so `instanceof` is `false` and
`extensions.getByType(LibraryExtension)` throws `Extension of type
'LibraryExtension' does not exist. Currently registered extension types:
[..., LibraryExtension, ...]` (probes).

`multipleVariants`: `PublishingUtil.ensureComponentNameUniqueness`
errors only when a `multipleVariants` component name equals a
`singleVariant` name. Flutter declares the same `singleVariant`s on
`5ba8961b517` when the build file declares none, so that behavior is
unchanged. It is not tested here.

### Why removing the deleted code is safe

- `android.libraryVariants` does not exist with `newDsl=true`
(reproduced above). AGP 9.1.0 marks its class,
`com.android.build.gradle.LibraryExtension`, `@Deprecated` ("This class
is not used for the public extensions in AGP when android.newDsl=true,
which is the default in AGP 9.0, and will be removed in AGP 10.0."), and
the class is not in `gradle-api-9.1.0.jar`. `singleVariants` is an
internal property (`getSingleVariants()` on
`com.android.build.gradle.internal.dsl.AbstractPublishing`, `javap`). It
resolves from Groovy with `newDsl=true`, so it was not a failure, only
internal API.
- The `dependsOn`: with it removed, the task graph for
`assembleAarRelease` on case (a) has `:plugin_a:assembleAarRelease`,
`:plugin_a:bundleReleaseAar`,
`:plugin_a:publishReleasePublicationToMavenRepository` and
`:plugin_a:publish`. `:flutter:generatePomFileForReleasePublication`
depends on no `:plugin_a` task, and
`:flutter:publishReleasePublicationToMavenRepository` depends only on
the plugin's compile-classpath tasks, so the order between the module's
and the plugin's publishing doesn't matter. The module POM refers to the
plugin by coordinates (`plugin_a_release`). devicelab
`build_aar_module_test`, `build_android_host_app_with_module_aar` and
`android_java17_build_android_host_app_with_module_aar` pass (they check
the plugin AAR/POM and that the module POM depends on
`plugin_with_android_release`).
- The `all` filter (`component.name != "all"`, added in flutter#101891
`606e91ad63d`): AGP 7.x created an automatic multi-variant component
named `all` when a project used no publishing DSL ([`PublishingUtil.kt`
at
`studio-2021.3.1`](https://android.googlesource.com/platform/tools/base/+/refs/tags/studio-2021.3.1/build-system/gradle-core/src/main/java/com/android/build/gradle/internal/utils/PublishingUtil.kt),
`createPublishingInfoForLibrary` and `publishingFeatureOptIn`; same in
the AGP 7.3.1 jar). flutter#101891 published it separately with classifiers and
skipped it for the `_<variant>` publications; flutter#112149 (`8e30cc9c56b`)
removed that publication and kept the skip. AGP 8.0 disabled automatic
components by default ([AGP 8.0.0 release
notes](https://developer.android.com/build/releases/past-releases/agp-8-0-0-release-notes)),
and the AGP 8.11.1, 9.1.1 and 9.3.1 jars list
`android.disableAutomaticComponentCreation` as removed, with no `all`
component code. This script declares `singleVariant` for every variant,
which also turns automatic components off on AGP 7.x. A probe that
prints `project.components` after `projectsEvaluated` on all four matrix
configurations shows only per-variant names (`[debug, profile, release]`
for `:flutter`, `:app` and each plugin, `[demoDebug, …, fullRelease]`
for the flavored module, `[freeDebug, freeProfile, freeRelease]` for
`plugin_flavored`, `[debug, release]` for the root), never `all`.
- `tasks.register`: the publication is created at configuration time
only for a requested task name, as with `tasks.create`, whose
configuration closure ran immediately. Only the task object is created
lazily. Table rows below and the devicelab runs show the same artifacts.

### Removed comments, assertions and code

| Removed | Reason |
| --- | --- |
| `afterProject` comment item 2, "The project has already defined which
variants to publish…", and the `singleVariants.size()` guard it
described | The guard read internal API and skipped all of Flutter's
declarations once a build file declared any. Item 1 of that comment
became "Exit early if the project doesn't have the Android Gradle plugin
applied." |
| The `projectsEvaluated` comment "Configure the
`assembleAar<variantName>` task for each plugin's projects and make the
module's equivalent task depend on the plugin's task.", with the
`libraryVariants.all` loop, both `tasks.named(...).get()` calls, both
`assert(... != null)` and the `dependsOn` | The dependency is redundant
(see above). `tasks.named(...).get()` throws before the asserts could
fail, so they never checked anything. |
| `addAarTask` and its `variantName` local | Split into
`registerAarTask` (every component) and `addAarPublication` (requested
components). The task name comes from `aarTaskName`, which the check
also uses. |
| `addAarTask` comment "This check is required to be able to configure
the archives before `publish` runs.", with the check | The check is
`requestedAarComponents`, applied by the caller before
`addAarPublication`. Its reason is the comment on `addAarPublication`:
"`publish` publishes every publication in the project, so only requested
components get one." |
| The `component.name != "all"` filter in `configureProject`, and the
fragment "(except "all" since that is used to publish artifacts in the
new way)" from "Create a default MavenPublication for the variant" |
Nothing creates an `all` component where this script runs (see "Why
removing the deleted code is safe"). |
| From the migration doc item 8 and the website page draft: the
sentences about the deleted guard, the `Task with name … not found`
failures, and what the deleted code did and did not check | The docs
describe behavior only. The history is in "Bug history" above. |

### Behavioral and compatibility notes

Matrix projects (local scratch): (a) module + Android plugin `plugin_a`;
(b) module with flavors `demo`/`full` + `plugin_a`; (c) module +
`plugin_a` + `plugin_flavored` (flavor `free`); (d) module declaring
`singleVariant("release") { withSourcesJar() }` + `plugin_a`.

1. **A build file that declares `singleVariant` for some variants
builds.** Case (d), `flutter build aar`:

   | Script | Result |
   | --- | --- |
| `5ba8961b517` (AGP 9.3.1 `newDsl=false`) | exit 1: `Task with name
'assembleAarDebug' not found in project ':flutter'.` |
| This PR (all four configurations below) | exit 0. Release has the AAR,
POM and sources jar, and no javadoc jar (the build file's declaration).
Debug and profile have sources and javadoc jars. Plugin AAR/POM for all
three. |

2. **Variant mismatches fail with a Flutter error that names the
project.** Only requested variants are checked. The `5ba8961b517` column
is AGP 9.3.1 with `newDsl=false`.

   | Case | `5ba8961b517` | This PR (all four configurations) |
   | --- | --- | --- |
| (b) `--flavor demo` | `Task with name 'assembleAarDemoDebug' not found
in project ':plugin_a'.` | plugin error for `demoDebug` and `:plugin_a`
|
| (c) default | `Task with name 'assembleAarDebug' not found in project
':plugin_flavored'.` | plugin error for `debug` and `:plugin_flavored` |
| (b) no `--flavor`, `--no-profile --no-release` | `Task with name
'assembleAarDemoDebug' not found in project ':plugin_a'.` | module error
for `debug`, listing the module's variants |
| (c) `--flavor free`, `--no-profile --no-release` | `Task with name
'assembleAarDebug' not found in project ':plugin_flavored'.` | module
error for `freeDebug` |
| (b) `--flavor foo` | Gradle `Task 'assembleAarFooDebug' not found in
root project …` | same Gradle error |

Without the module check (`86523c549fc`), the module-error cases exit 0
with "✓ Built" and a repo that has only the plugin AAR.
3. **Path-qualified requests.** `./gradlew -I aar_init_script.gradle …
:flutter:assembleAarRelease` exits 0 and publishes nothing, on
`5ba8961b517` and on this PR: a publication is created only when
`startParameter.taskNames` contains the bare name. The tool sends only
the bare name (`gradle.dart` `command.add(aarTask)`). Not changed here.
4. **No warnings.** `flutter build aar` hides Gradle output on success
unless `-v` (`ProcessUtils.run` buffers it; `gradle.dart` prints it only
on failure, and verified with a `logger.error` probe). Keeping a build
file's declaration needs no action, so nothing is logged. Errors are
shown.
5. **Configuration cache:** with `org.gradle.configuration-cache=true`
in case (a)'s `.android/gradle.properties` (AGP 9.3.1 / Gradle 9.5.0),
`flutter build aar` reports the same single problem with the
`5ba8961b517` script and with this PR: ``Task
`:flutter:compileFlutterBuildDebug` of type
`com.flutter.gradle.tasks.FlutterTask`: invocation of 'Task.project' at
execution time is unsupported with the configuration cache.`` None comes
from the init script.
6. `newDsl=true` with `builtInKotlin=false` fails before the script with
any Kotlin plugin (`The 'org.jetbrains.kotlin.android' plugin is not
compatible with AGP's 9.0 new DSL`). The devicelab section and matrix
set `builtInKotlin=true`.
7. Related open work: no overlap with
[flutter#191681](flutter#191681)
(`gradle.dart`, `gradle_errors.dart` and tests). No open PR touches
`aar_init_script.gradle`.

### Follow-up candidates (pre-existing, not changed here)

- `allprojects { apply plugin: "maven-publish" }` applies maven-publish
to every project, including ones that never publish.
- The `afterProject` and `projectsEvaluated` hooks reach across
projects, which Gradle Isolated Projects does not allow.
- The `-SNAPSHOT` rewrite of `project.version` in `configureProject`.
- The `engine.realm` and `engine.stamp` file reads at configuration time
in `configureProject`.
- The `is-plugin` branch of `projectsEvaluated` looks unreachable from
the tool.
- The configuration cache problem in FGP `FlutterTask` (note 5).
- `newDsl=true` with KGP (`builtInKotlin=false`), for PR 10.
- Mapping between flavored module variants and plugin variants (for
example, plugin `release` for module `demoRelease`).
- `singleVariant` is declared on the root project and `:app`, which
never publish.
- Gradle output is hidden on success, so nothing the script logs at info
or warn level reaches the user without `-v`.

### Integration test coverage of the changed paths

Searched `dev/devicelab/bin/tasks` and
`packages/flutter_tools/test/integration.shard` for `build aar` and
`assembleAar`.

| Path | Tests |
| --- | --- |
| Library check, publishing declarations, lazy task registration, plugin
publishing without `dependsOn` (`newDsl=false`) | devicelab
`build_aar_module_test`, `build_android_host_app_with_module_aar`,
`android_java17_build_android_host_app_with_module_aar`;
`android_obfuscate_test` |
| `newDsl=true`, a build file's `singleVariant` declaration kept |
devicelab `build_aar_module_test`, `newDsl=true` section |
| Module and plugin variant mismatch errors | devicelab
`build_aar_module_test`, product flavor section |
| AGP 9.1.1 and 8.11.1; a variant that no project has | Manual matrix
only |

`Linux build_aar_module_test` runs in presubmit for this PR: in
`.ci.yaml` its `runIf` includes `dev/**` and
`packages/flutter_tools/**`, and it sets neither `presubmit: false` nor
`bringup`. It also ran locally on the head (below) with `cd
dev/devicelab && ../../bin/dart bin/test_runner.dart test -t
build_aar_module_test --exit`.

### Tests run locally (macOS, JDK 17)

On the head (`b9493299916`; master merged at `4521d8d6634`):

- `gradle test --rerun-tasks` in `packages/flutter_tools/gradle`, with
the engine's `third_party/gradle` binary that the README names: 33
suites, 277 tests, 0 failures.
- `dart format` and `dart analyze --fatal-infos` on
`build_aar_module_test.dart`: clean (unchanged since `3edc95d1fa0`).
- Tool tests: `test/commands.shard/hermetic/build_aar_test.dart`,
`test/commands.shard/permeable/build_aar_test.dart` and
`test/general.shard/android/android_gradle_builder_test.dart`: 56 tests,
all pass.
- `test/integration.shard/android_obfuscate_test.dart`: 2 tests pass.
- devicelab via `bin/test_runner.dart test --exit`, one at a time:
`build_aar_module_test` (including both added sections),
`build_android_host_app_with_module_aar`,
`android_java17_build_android_host_app_with_module_aar`,
`build_android_host_app_with_module_source`,
`module_host_with_custom_build_test`, all `success`.
- The configuration cache comparison (note 5).

Manual matrix on `b9493299916`, four configurations:
- **9.3.1 off:** AGP 9.3.1 / Gradle 9.5.0, `newDsl=false`,
`builtInKotlin=false`.
- **9.3.1 on:** AGP 9.3.1 / Gradle 9.5.0, `newDsl=true`,
`builtInKotlin=true`.
- **9.1.1 on:** AGP 9.1.1 / Gradle 9.3.1 (FGP's minimums on master since
flutter#193813), `newDsl=true`, `builtInKotlin=true`.
- **8.11.1:** AGP 8.11.1 / Gradle 8.14.3, `newDsl=false`, with
`skipDependencyChecks=true` in `.android/gradle.properties`. Without it,
FGP stops before the init script runs: `Your project's Gradle version
(8.14.3) is lower than Flutter's minimum supported version of 9.3.1.`

| Case | 9.3.1 off | 9.3.1 on | 9.1.1 on | 8.11.1 |
| --- | --- | --- | --- | --- |
| (a) | exit 0, AAR, POM, sources and javadoc jars for
`flutter_{debug,profile,release}` and `plugin_a_{debug,profile,release}`
| same | same | same |
| (b) `--flavor demo` | exit 1, plugin error | same | same | same |
| (b) no `--flavor` | exit 1, module error | same | same | same |
| (b) `--flavor foo` | exit 1, Gradle `Task 'assembleAarFooDebug' not
found in root project` | same | same | same |
| (c) | exit 1, plugin error | same | same | same |
| (c) `--flavor free` | exit 1, module error | same | same | same |
| (d) | exit 0, as (a), except module release has the sources jar and no
javadoc jar | same | same | same |

Case (a)'s `flutter_release-1.0.pom` depends on
`dev.pr9.plugin_a:plugin_a_release:1.0` (checked on `b9493299916`, AGP
9.1.1).

Negative control, the master script (same at `5ba8961b517` and
`4521d8d6634`), on `b9493299916`: with `newDsl=true` (AGP 9.3.1 and AGP
9.1.1), (a)-(d) all fail with `Can't generate AAR on a non Android
library project.`; with `newDsl=false` on AGP 9.3.1, (a) passes and
(b)-(d) fail with Gradle's `Task with name 'assembleAar<V>' not found in
project ':<p>'.` On `a17fafcc35e`, with only line 13 changed to
`hasPlugin`, `newDsl=true` fails at line 178 with `Could not get unknown
property 'libraryVariants' for object of type
com.android.build.gradle.internal.dsl.LibraryExtensionImpl$AgpDecorated.`
devicelab `build_aar_module_test` with that script fails at the
`newDsl=true` section with the same error.

</details>

---

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [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].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant in-code documentation (doc comments with
`///`).
- [x] If this PR introduces a new feature or capability, I created and
linked a website documentation issue or PR in [flutter/website] (or
verified none is needed).
- [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
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[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
[flutter/website]: https://github.com/flutter/website
[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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants