Skip to content

[animations] Prevent SharedAxisTransition from resetting ongoing animations on entering page - #146

Closed
vasilich6107 wants to merge 1 commit into
flutter:masterfrom
artflutter:bugfix/scale-axis-transition-rendering
Closed

[animations] Prevent SharedAxisTransition from resetting ongoing animations on entering page#146
vasilich6107 wants to merge 1 commit into
flutter:masterfrom
artflutter:bugfix/scale-axis-transition-rendering

Conversation

@vasilich6107

@vasilich6107vasilich6107 commented Apr 28, 2020

Copy link
Copy Markdown
Contributor

This is a POC of the fix for flutter/flutter#55826

Investigation story :)

After I noticed the CircularProgressIndicator restart I start digging into the issues and found this - https://tppr.me/KSBAK

It renders the child component three times(1 for SignIn and 2 times for Courses) moving 'next' and only one time(SignIn widget) while moving back. As far as I know Flutter works with animations in the way that it does not perform useless rerenders and just works with the whole child.

When I removed all the transitions and left only the return child; in both switch cases everything started working as expected(without animations obviously)

switch (_effectiveAnimationStatus) {
case AnimationStatus.forward:
return child;
case AnimationStatus.dismissed:
case AnimationStatus.reverse:
case AnimationStatus.completed:
return child;
}

Then I replaced all the _EnterTransition with _ExitTransition and repeated the test - everything became smooth(the animation became a little bit different)

The main goal of this POC PR is to make the widget tree identical.

While performing the animations the widget tree changes from _EnterTransition to _ExitTransition, and the _ExitTransition adds additional Container to that tree. This changes was the root cause of useless rerenders.

If you debug the current released version you can see the the 'happy path' of single render in 'back' transition occurs cause widget.child passes through the identical _EnterTransition(or _ExitTransition I do not remember the precise details)

I decided to combine this 2 classes to guarantee that the widget tree will remain the same.

This is a result
ezgif com-video-to-gif

@vasilich6107

Copy link
Copy Markdown
ContributorAuthor

@shihaohong, @goderbauer
Could you review my PR?

@vasilich6107
vasilich6107force-pushed the bugfix/scale-axis-transition-rendering branch from 45f12f6 to e36b4eaCompareApril 28, 2020 16:25
@shihaohong

Copy link
Copy Markdown
Contributor

Hi @vasilich6107, thank you for filing the issues (with great gifs!) and submitting this POC PR.

Could you summarize what this PR aims to do in the first comment? It's hard to tell just from looking at the code what your approach to fixing this is, and the PR doesn't point out the root cause of the problem.

This helps with reviewing the code for me as well, since I can then verify that the intended behavior matches the code changes. Thank you!

@vasilich6107

Copy link
Copy Markdown
ContributorAuthor

Updated the comment

@goderbauer

Copy link
Copy Markdown
Member

Haven't looked at the code in detail yet, but in order to accept the PR we do require tests to ensure that this never regresses again in the future. Can you add some tests, please?

@vasilich6107

Copy link
Copy Markdown
ContributorAuthor

I’ll try to)

@vasilich6107

Copy link
Copy Markdown
ContributorAuthor

It would be great if you point me on same existing tests that verify rendering)

@shihaohong

Copy link
Copy Markdown
Contributor

Looking at the explanation and then the code for a few minutes, it's still not apparent to me how this change introduced that fixes the problem. I think it was mentioned that adding a Container caused a change in the render tree and triggered the additional re-render, but I don't see any part of the PR that removes a Container widget.

I think once the reasoning for why the fix works is clear, writing the test should be much more straightforward since I'm not sure how to test for a behavior I do not understand. Off the top of my head, checking the state to make sure the entering widget tree (the incoming page) does not lose state throughout the animation is one way (although I remember we have a test for that, so maybe it's something different or the test doesn't catch this particular scenario).

Another solution that comes to mind is introducing a key? That way, even if the widget tree changes, as long as the subtree remains, it does not get completely re-rendered from scratch.

@vasilich6107

Copy link
Copy Markdown
ContributorAuthor

I was working to figure out how to fix this for almost two days)
After I found a fix I did not have More time to experiment with another solutions.
May be there could be a better solution...

Current PR pipes the child widget through the single _Transition class which guaranties that the widget tree will be the same no matter how you change output. As far as Container was used to provide a fillColor I leaved it for both cases(entering and exiting).

Could you provide a links to the tests that you are talking about?

@shihaohong

Copy link
Copy Markdown
Contributor

The test I was thinking about was this one in particular.

@vasilich6107

Copy link
Copy Markdown
ContributorAuthor

Thanks. I'll try to find some time to test the approach with key)

@vasilich6107
vasilich6107force-pushed the bugfix/scale-axis-transition-rendering branch from e36b4ea to ebe6c07CompareMay 2, 2020 14:41
@vasilich6107

Copy link
Copy Markdown
ContributorAuthor

@vasilich6107

Copy link
Copy Markdown
ContributorAuthor

Any comments, thoughts?

@shihaohongshihaohong changed the title fix for scale axis transition useless renderingPrevent SharedAxisTransition from resetting ongoing animations on entering pageMay 6, 2020
@shihaohongshihaohong changed the title Prevent SharedAxisTransition from resetting ongoing animations on entering page[animations] Prevent SharedAxisTransition from resetting ongoing animations on entering pageMay 6, 2020
@shihaohong

shihaohong commented May 6, 2020

Copy link
Copy Markdown
Contributor

@vasilich6107 Thank you for your patience, I've been working on a different set of issues and finally got some time to get back to code reviews :)

I just tried my hand at this, and what I mean by adding a key is as follows to your application. Basically, by adding a key to the page you're transitioning to, you're telling Flutter that you want to retain the state in your keyed widget subtree and move them in your widget tree rather than rebuilding them from scratch.

Given that there's a working solution without modifying the animations package, the question now, becomes: Do we want to prevent this from occurring for users out of the box in the animations package, or would it preferable for users to provide keys to prevent losing track of state? What are the pros and cons of doing so?

@goderbauer can maybe chime in more on this. Personally, I prefer to leave it up to the user to decide whether or not to provide keys for their widgets. My primary concern is that it may take up unnecessary space (I'm not sure what the performance and size implications of adding keys haphazardly might be). Once we introduce a keyed widget into the transition, it might be difficult to remove it without it being a breaking change to our users.

A good article on keys in Flutter: https://medium.com/flutter/keys-what-are-they-good-for-13cb51742e7d

@shihaohong

Copy link
Copy Markdown
Contributor

Also, if we opt to not provide a key by default, we could add a recommendation to the API documentation for the transitions and recommend adding keys when this becomes a problem

@shihaohong
shihaohong self-requested a review May 6, 2020 23:43
@vasilich6107

Copy link
Copy Markdown
ContributorAuthor

Personally I think that if we have a working solution that does not require providing additional key's from user it will be better to apply it.
Better experience out of the box is more valuable to my mind.

What are the pros of leaving the SharedAxisTransition 'as is'?

@shihaohong

Copy link
Copy Markdown
Contributor

@vasilich6107 I think my concern was that there was some use case where users do not want to have a keyed widget for the incoming page. I'm not sure what those situations might be from my lack of experience with using/not using keys, so I want to be careful in the event there are some undesirable side effects (Questions I'm asking myself are along the lines of "In what situation would a developer not want a key here?"). I'll experiment a little more with it and see.

If I can't find any problems, I 100% agree with you that providing this convenience out of the box would be ideal.

@goderbauer

Copy link
Copy Markdown
Member

While ensuring that the tree structure is the same for both animations would work, it really makes the code more complicated to read and understand. I think we should just wrap the child here in a KeyedSubtree widget that applies a global key to it:

);

// builds once on start
expect(bottomState.rebuildCount, 1);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checking how often build was called is not appropriate. The framework is free to call build as often as it wants. Instead, you should check that the state object associated with the widget hasn't changed after the transition has started.

@goderbauer

Copy link
Copy Markdown
Member

Having said all this, I just saw #141, which fixes this in a very elegant way without using keys and it also removes some of the code duplication that we have in our transitions. I think that PR is the right way forward from here.

@vasilich6107

Copy link
Copy Markdown
ContributorAuthor

Great to hear!
I’ll close mine in favor of #141

stuartmorgan-g pushed a commit that referenced this pull request Oct 31, 2024
chunhtai pushed a commit to chunhtai/packages that referenced this pull request Jun 12, 2026
…extMenuBuilder (#128114)
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:
<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)
flutter#1 SelectionOverlay.showToolbar.<anonymous closure> (package:flutter/src/widgets/text_selection.dart:1357:36)
flutter#2 ContextMenuController.show.<anonymous closure> (package:flutter/src/widgets/context_menu_controller.dart:65:54)
flutter#3 _OverlayEntryWidgetState.build (package:flutter/src/widgets/overlay.dart:351:36)
flutter#4 StatefulElement.build (package:flutter/src/widgets/framework.dart:5198:27)
flutter#5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5086:15)
flutter#6 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#7 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#8 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#9 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#10 RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:6093:32)
flutter#11 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6595:17)
flutter#12 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#13 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#14 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#15 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#16 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#17 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#18 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#19 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#20 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#21 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#22 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#23 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#24 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#25 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
flutter#26 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#27 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#28 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#29 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#30 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#31 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#32 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#33 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#34 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#35 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
flutter#36 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#37 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#38 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#39 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#40 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#41 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#42 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#43 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#44 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#45 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#46 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#47 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
flutter#48 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#49 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
flutter#50 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#51 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#52 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#53 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#54 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#55 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#56 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#57 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#58 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#59 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#60 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#61 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#62 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#63 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11)
flutter#64 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#65 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14)
flutter#66 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#67 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#68 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11)
flutter#69 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#70 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5)
flutter#71 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#72 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#73 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#74 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#75 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15)
flutter#76 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16)
flutter#77 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7)
flutter#78 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5)
flutter#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>
Sign up for freeto 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.

3 participants

@vasilich6107@shihaohong@goderbauer