Skip to content

Added imitation game benchmarks - #181

Merged
gaaclarke merged 1 commit into
flutter:masterfrom
gaaclarke:imitation_game
Aug 15, 2020
Merged

Added imitation game benchmarks#181
gaaclarke merged 1 commit into
flutter:masterfrom
gaaclarke:imitation_game

Conversation

@gaaclarke

@gaaclarkegaaclarke commented Jul 24, 2020

Copy link
Copy Markdown
Member

relevant issue: flutter/flutter#47561

imitation_game is a platform for performing automated tests to compare the
performance of different UI frameworks. For example, how much memory does the
same app written in Flutter and UIKit take?

This is an MVP implementation that has one test that checks the startup time of UIKit
versus Flutter when rendering one image.

@gaaclarke

Copy link
Copy Markdown
MemberAuthor

@liyuqian Here is the draft if you want to take a peek. The technical work is done. I have to make the output pretty and write up some README files and I'll be done with the PR.

@liyuqianliyuqian left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Having each implementation specify an IP.txt file somewhere and let imitation_game.dart find it recursively and modify its content is clever! I was just wondering how to circumvent the restriction that Flutter has to read from assets, and who knows if other UI frameworks couldn't have more strange constraints.

I didn't have time to dive into too many technical details but most part of smiley example look good.

My biggest concern is on how performance metrics are measured. Leaving it for each implementation seems to be not very scalable and hard to prove the fairness. I think we need to create a single measurement tool for a test and all implementations should share it. For the first frame metric, here's what I can think of:

  1. imitation_game.dart calls ios/smiley/[implementation]/install_app.sh to install the app and do all necessary initializations.
  2. imitation_game.dart calls ios/smiley/measure/first_frame_begin.sh to start recording iOS screen video either by triggering an iOS app to do it, or using some host side tools.
  3. imitation_game.dart calls ios/smiley/[implementation]/run_test.sh. Such script first opens a black screen app to provide reference frames for the video recording. Then the script switches to home screen and opens the smiley app.
  4. imitation_game.dart calls ios/smiley/measure/first_frame_end.sh to end the iOS screen video recording, compute the time between the last black screen frame and the first smiley frame, and use that time as the first frame metric.

The video recording may use up some CPU/GPU resources, but it's the same for all UI frameworks and implementations so the result should still be fair. And the measure/memory_begin.sh and measure/memory_end.sh could be much simpler using instruments or adb without screen recording.

I've also left some other high-level comments in README.md.

Comment threadpackages/imitation_game/README.md Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We could use a more general compare multiple UI frameworks than compare Flutter to alternative platforms. I can imagine that even if someone is only interested in comparing React Native and native Android/iOS, this package could still be helpful.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

done

Comment threadpackages/imitation_game/README.md Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

A local mode with a mobile device and a host computer is definitely needed for development. Additionally, I think it's nice to also have a cloud mode where the tests can run from something like Firebase test lab.

Comment threadpackages/imitation_game/README.md Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It would be nice for README.md to designate an implementation as the imitation goal so all other implementations should be compared to it for validation. When differences are found, other implementations should always try to match the imitation goal.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One more thing I just recalled today from checking this doc: the test README.md should also specify

  • the ideal device D*. D* is usually very fast/powerful that eliminates any user-perceivable performance differences. D* is used for imitation test: test if different UI implementations are distinguishable by users on D*. This ensures different implementations are implementing the same UIs.
  • the target device D. D is usually limited in power that will surface performance differences.

For example, we can probably use Pixel 4 as D* and Moto G4 as D for Android tests.

Comment threadpackages/imitation_game/README.md Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since we allow one UI framework to have multiple implementations (and we'll choose the best one to represent the UI framework), I think we should have one more level of subdirectories under flutter, uikit. For example

 ├─ smiley/
│ ├─ README.md
│ ├─ flutter/
│ │ ├─ liyuqian/
│ │ | └─ run_ios.sh
│ │ ├─ gaaclarke/
│ │ | └─ run_ios.sh

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

I don't know how well that is going to scale. The tests take a long time to execute since compiling and launching on a device takes so long. Seems like we should have the best implementation per platform. If there were 2 different approaches it might be better to name the implementation accordingly (ex flutter_with_fast_library).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Yes, we should only maintain the best implementation and the imitation goal implementation in the long run, and only use this extra level for a few new implementations to be uploaded and tested temporarily. They'll either be eliminated or replace the old best implementation. I also agree that the name should be more informative. Sorry for my bad naming examples 😄

Comment threadpackages/imitation_game/README.md Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There may need to be another OS subdirectory under tests like

tests/ios/smiley/...
tests/android/smiley/...

This may introduce some duplicate code if a UI framework is cross-platform (e.g., Flutter), or maybe we can symlink to make tests/ios/smiley/flutter and tests/android/smiley/flutter the same. But some UI framework only works for a single OS (e.g., uikit doesn't make sense for Android). It's also very likely that run_ios.sh and the measurement tool/code would be OS specific.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yep, I think there will be an opportunity for sharing more between tests. I think those things will become apparent when we have more implementations and they should come organically from that.

Comment threadpackages/imitation_game/README.md Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  1. Let rename run_ios.sh to run_test.sh as we can put ios in the upper level directory name. Similarly, there could also be .../android/.../run_test.sh, .../web/.../run_test.sh.
  2. We should have both run_test.sh and install_app.sh. The install_app.sh would install the app on the target OS so users can freely interact with the UI to see if they look and function the same on a powerful device. The run_test.sh is for automated testing often on a slow device where no human interaction would be needed or allowed.
    • If there's only run_test.sh that does the automated test, then one could potentially just submit an app that replays a recorded video of the test as the implementation.
    • The install_app.sh can also be used for setup and other costly operations that we don't want to measure the performance. For example, regarding the first frame performance, install_app.sh could be used to build, install, and set up everything, while run_test.sh would simply launch the app and see when the first frame is presented on screen.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

BTW, how do you think about changing run_test.sh to run_test.dart so the script can be run from Linux/Windows/Mac? See the discussion here.

Comment threadpackages/imitation_game/README.md Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I feel that the measurement code/tool should not live inside the implementation directory. There should only be a single measurement code/tool that's under the test (e.g., smiley) directory, and all implementations must share it to measure the performance. Otherwise, it's hard to prove that different implementations are measuring the same thing.

This might be critical when a UI framework that no one is familiar enters the arena. Say if someone invented a new framework called Glutter, we probably don't have the expertise and time to vet its measuring code and tools.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

We just have to rely on humans to read the code. Someone reading the code can say if it is measuring the same thing. Certain things are only measurable on device, like time since the process was launched. From the host computer we can just measure the time between when we asked it to launch which isn't as accurate.

If we find there is a way to share measurement code that can be factored out. Nothing about the current design disallows it.

Comment threadpackages/imitation_game/README.md Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

What do multiple results correspond to? Are they for different implementations such as some_result_name for smiley/flutter/liyuqian and some_result_name2 for smiley/flutter/gaaclarke?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No, it's a way to measure 2 different things for the same execution. For example, the startup test could measure memory as well as startup time.

Comment threadpackages/imitation_game/README.md Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I still feel that it's better to put the device-to-host reporting logic inside the test (e.g., smiley) so different target OSes and tests could choose reporting mechanisms differently. For example, for Android memory reporting, it's probably easier to just use adb on the host side so no HTTP communication is required from the device side. If multiple tests do want to use the HTTP reporting, then they could all import the same HTTP reporting module?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

There is value in having the reporting mechanism the same across all implementations. HTTP is the most universal mechanism that should be easy for users. Once we have a few tests we can probably just wrap it up in a library so when you implement a test you just call reportResult(result); and you don't even care how it's getting reported.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I like just calling reportResult without having to worry about HTTP. It feels better to me if we don't put this HTTP communication as a contract or API of the imitation game so we'll have the freedom to change.

@gaaclarke

Copy link
Copy Markdown
MemberAuthor

Thanks yuquian for your thoughts. I responded inline below:

Having each implementation specify an IP.txt file somewhere and let imitation_game.dart find it recursively and modify its content is clever! I was just wondering how to circumvent the restriction that Flutter has to read from assets, and who knows if other UI frameworks couldn't have more strange constraints.

I don't understand the concern. What is the problem with reading from assets? Reading from a text file that ships with an app should be standard and easy.

I didn't have time to dive into too many technical details but most part of smiley example look good.

My biggest concern is on how performance metrics are measured. Leaving it for each implementation seems to be not very scalable and hard to prove the fairness. I think we need to create a single measurement tool for a test and all implementations should share it. For the first frame metric, here's what I can think of:

Fairness is subjective. For example, is it fair to measure a garbage collected language versus a non garbage collected language in terms of performance? It will be up to us to judge if something is representative. When the invitation is open to submit a revision, eventually things will become more and more fair if people find fault with something and address it.

  1. imitation_game.dart calls ios/smiley/[implementation]/install_app.sh to install the app and do all necessary initializations.
  2. imitation_game.dart calls ios/smiley/measure/first_frame_begin.sh to start recording iOS screen video either by triggering an iOS app to do it, or using some host side tools.
  3. imitation_game.dart calls ios/smiley/[implementation]/run_test.sh. Such script first opens a black screen app to provide reference frames for the video recording. Then the script switches to home screen and opens the smiley app.
  4. imitation_game.dart calls ios/smiley/measure/first_frame_end.sh to end the iOS screen video recording, compute the time between the last black screen frame and the first smiley frame, and use that time as the first frame metric.

The video recording may use up some CPU/GPU resources, but it's the same for all UI frameworks and implementations so the result should still be fair. And the measure/memory_begin.sh and measure/memory_end.sh could be much simpler using instruments or adb without screen recording.

I've also left some other high-level comments in README.md.

Ideas about video recording are interesting but they are out of scope for the MVP. Their ROI is questionable. There is a lot of value to be had with comparing numerical results.

The point of the startup time test was to get a measurement of how fast it is to startup an app. For platforms like Unity this is a big concern. I wanted to show we were comparable to native speeds. The only way to measure this is on device. If we just measure a frame it isn't capturing everything.

@gaaclarke
gaaclarke marked this pull request as ready for review July 27, 2020 21:09
@gaaclarke
gaaclarke requested a review from xsterJuly 29, 2020 23:22
@liyuqian

Copy link
Copy Markdown
Contributor

Having each implementation specify an IP.txt file somewhere and let imitation_game.dart find it recursively and modify its content is clever! I was just wondering how to circumvent the restriction that Flutter has to read from assets, and who knows if other UI frameworks couldn't have more strange constraints.

I don't understand the concern. What is the problem with reading from assets? Reading from a text file that ships with an app should be standard and easy.

There's no concern. I was just trying to make some compliments about your way of circumventing possibly different asset directories enforced by different frameworks 😄

It seems that there's a lot to discuss about how to measure the performance metrics. I just scheduled a meeting this Friday to go over that.

Comment threadpackages/imitation_game/README.md Outdated

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.

I'd list out the currently existing scenarios tested and a brief description of the scenarios

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

That information should exist in the readme file for each test. I don't want it duplicated here.

Comment threadpackages/imitation_game/README.md Outdated

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.

memory is self explanatory. Maybe smiley needs a more descriptive name? :D

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

"Smiley" is just referencing the name in the example above. It could have been anything. What it is testing is ill-relevant to the point. =)

Comment threadpackages/imitation_game/README.md Outdated

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.

your tree above didn't list out the various platform implementations. Is it a partial tree for illustration? Maybe add that to the description.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Added <flutter project files> and '` as placeholders for those concepts.

Comment threadpackages/imitation_game/README.md Outdated

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.

looks like this directory isn't in this PR. Is this readme right?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

It's just an example of the layout

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

explicitly called it an example

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.

while we're here, should we add a cumulative cpu+gpu cost test? (in a different pr as needed)

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.

add a code comment for what this is for?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

done

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.

ditto, add code comment for what this is for?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

done

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.

this is probably right. Perhaps double check with Trace in observatory and assert that this callback indeed lines up time wise with the raster thread actually finishing drawing to the gpu?

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.

maybe add linux later if we end up using it?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Sure, I don't know how easy it is to add later, removed.

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.

ditto for macos

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

ditto

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.

I'm assuming this doesn't run right? Either edit it or remove it.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

done

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.

ditto for web

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

done

@xsterxsterJul 31, 2020

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.

can't you use flutter tool for this? Maybe add a comment for the reasoning here or in the top readme

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Nope, we didn't make it that generic to be used to launch an arbitrary app.

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.

change headers

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

done

Comment threadpackages/imitation_game/tests/smiley/uikit/smiley/smiley/SceneDelegate.h Outdated
@gaaclarke

Copy link
Copy Markdown
MemberAuthor

I had a chat with @liyuqian offline. It would be nice to also have an android example that uses adb to poll memory usage as an example of how to measure the results on the host computer.

(ex adb shell dumpsys meminfo 'your apps package name')

updated the description (yuqian feedback)
updated the tree in the readme file to show where project files should be
updated header name
removed linter errors and added comment
added comment
removed platforms we aren't using
removed widget test
removed autogenerated headers
added flutter headers
@gaaclarke
gaaclarke merged commit 9072dd2 into flutter:masterAug 15, 2020
@gaaclarke

Copy link
Copy Markdown
MemberAuthor

Leaving leftover discussions for future PRs.

stuartmorgan-g pushed a commit to stuartmorgan-g/packages that referenced this pull request Apr 30, 2021
stuartmorgan-g pushed a commit that referenced this pull request Oct 31, 2024
creatorpiyush pushed a commit to creatorpiyush/packages that referenced this pull request Jun 10, 2026
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

@gaaclarke@liyuqian@xster