From eb2d9de07e46430a69550589fe68df1f58e0363f Mon Sep 17 00:00:00 2001 From: fzyzcjy <5236035+fzyzcjy@users.noreply.github.com> Date: Wed, 7 Jun 2023 03:37:57 +0800 Subject: [PATCH] Fix `Null check operator used on a null value` on TextField with contextMenuBuilder (#128114) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close #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:
``` (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. (package:flutter/src/widgets/editable_text.dart:3331:43) #1 SelectionOverlay.showToolbar. (package:flutter/src/widgets/text_selection.dart:1357:36) #2 ContextMenuController.show. (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) #80 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #81 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #82 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #83 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #84 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #85 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #86 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #87 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #88 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #89 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #90 StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5) #91 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #92 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #93 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #94 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #95 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #96 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #97 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #98 StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5) #99 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #100 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #101 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #102 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #103 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #104 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #105 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #106 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #107 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #108 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #109 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #110 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #111 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #112 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #113 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #114 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #115 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #116 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #117 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #118 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #119 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #120 StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5) #121 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #122 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #123 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #124 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #125 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #126 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14) #127 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #128 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #129 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #130 StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5) #131 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #132 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #133 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #134 StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5) #135 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #136 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #137 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #138 StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5) #139 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #140 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #141 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #142 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #143 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #144 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #145 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #146 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #147 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #148 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14) #149 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #150 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #151 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #152 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #153 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #154 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #155 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14) #156 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #157 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #158 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #159 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #160 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11) #161 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #162 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #163 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #164 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #165 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #166 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #167 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #168 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #169 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #170 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #171 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #172 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #173 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #174 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #175 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #176 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #177 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #178 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #179 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #180 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #181 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14) #182 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #183 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #184 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #185 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #186 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11) #187 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #188 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #189 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #190 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #191 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #192 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #193 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #194 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #195 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #196 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #197 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #198 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #199 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #200 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #201 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #202 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #203 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #204 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #205 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #206 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #207 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14) #208 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #209 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #210 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #211 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #212 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11) #213 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #214 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #215 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #216 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #217 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #218 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #219 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #220 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #221 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #222 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #223 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #224 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #225 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #226 StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5) #227 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #228 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14) #229 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #230 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #231 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #232 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #233 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11) #234 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #235 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #236 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #237 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #238 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #239 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #240 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #241 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #242 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #243 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #244 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #245 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #246 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #247 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #248 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #249 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #250 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #251 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #252 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #253 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #254 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #255 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #256 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #257 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #258 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #259 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #260 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #261 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #262 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #263 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #264 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #265 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #266 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #267 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #268 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #269 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #270 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #271 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #272 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #273 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #274 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #275 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #276 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #277 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14) #278 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #279 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #280 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #281 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #282 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11) #283 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #284 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #285 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #286 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #287 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #288 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #289 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #290 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #291 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #292 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #293 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #294 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #295 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #296 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #297 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #298 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #299 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #300 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #301 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #302 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #303 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #304 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #305 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #306 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #307 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #308 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #309 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #310 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #311 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #312 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #313 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #314 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #315 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #316 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #317 StatelessElement.update (package:flutter/src/widgets/framework.dart:5162:5) #318 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #319 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1253:16) #320 RenderObjectToWidgetElement.update (package:flutter/src/widgets/binding.dart:1230:5) #321 RenderObjectToWidgetElement.performRebuild (package:flutter/src/widgets/binding.dart:1244:7) #322 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #323 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2780:19) #324 AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1396:19) #325 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:358:5) #326 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1297:15) #327 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1227:9) #328 AutomatedTestWidgetsFlutterBinding.pump. (package:flutter_test/src/binding.dart:1246:9) #331 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:68:41) #332 AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1232:27) #333 WidgetTester._pumpWidget (package:flutter_test/src/widget_tester.dart:587:20) #334 WidgetTester.pumpWidget. (package:flutter_test/src/widget_tester.dart:572:14) #337 TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:68:41) #338 WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:571:27) #339 main.. (file:///Volumes/MyExternal/ExternalRefCode/flutter/packages/flutter/test/material/text_field_test.dart:15687:20) (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) ```
--- .../lib/src/widgets/editable_text.dart | 5 ++- .../test/material/text_field_test.dart | 43 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index c8067f91d3512..1f722228e7e44 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -3312,6 +3312,7 @@ class EditableTextState extends State with AutomaticKeepAliveClien } TextSelectionOverlay _createSelectionOverlay() { + final EditableTextContextMenuBuilder? contextMenuBuilder = widget.contextMenuBuilder; final TextSelectionOverlay selectionOverlay = TextSelectionOverlay( clipboardStatus: clipboardStatus, context: context, @@ -3325,10 +3326,10 @@ class EditableTextState extends State with AutomaticKeepAliveClien selectionDelegate: this, dragStartBehavior: widget.dragStartBehavior, onSelectionHandleTapped: widget.onSelectionHandleTapped, - contextMenuBuilder: widget.contextMenuBuilder == null + contextMenuBuilder: contextMenuBuilder == null ? null : (BuildContext context) { - return widget.contextMenuBuilder!( + return contextMenuBuilder( context, this, ); diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart index 3aabe0f4e9f82..af2f20db2a352 100644 --- a/packages/flutter/test/material/text_field_test.dart +++ b/packages/flutter/test/material/text_field_test.dart @@ -15661,6 +15661,49 @@ void main() { }, skip: kIsWeb, // [intended] on web the browser handles the context menu. ); + + testWidgets('contextMenuBuilder changes from default to null', (WidgetTester tester) async { + final GlobalKey key = GlobalKey(); + final TextEditingController controller = TextEditingController(text: ''); + await tester.pumpWidget(MaterialApp(home: Material(child: TextField(key: key, controller: controller)))); + + await tester.pump(); // Wait for autofocus to take effect. + + // Long-press to bring up the context menu. + final Finder textFinder = find.byType(EditableText); + await tester.longPress(textFinder); + tester.state(textFinder).showToolbar(); + await tester.pump(); + + expect(find.byType(AdaptiveTextSelectionToolbar), findsOneWidget); + + // Set contextMenuBuilder to null. + await tester.pumpWidget( + MaterialApp( + home: Material( + child: TextField( + key: key, + controller: controller, + contextMenuBuilder: null, + ), + ), + ), + ); + + // Trigger build one more time... + await tester.pumpWidget( + MaterialApp( + home: Material( + child: Padding( + padding: EdgeInsets.zero, + child: TextField(key: key, controller: controller, contextMenuBuilder: null), + ), + ), + ), + ); + }, + skip: kIsWeb, // [intended] on web the browser handles the context menu. + ); }); group('magnifier builder', () {