-
Notifications
You must be signed in to change notification settings - Fork 28.7k
Fixes initial validation with AutovalidateMode.always on first build #156708
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fixes initial validation with AutovalidateMode.always on first build #156708
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for making this fix!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm a huge fan of this change—I feel that the current fix is an effective solution for #142701 and is probably better than a fix that involves using a post-frame callback.
As far as how to approach a breaking change that gives an overall improvement, there are several different paths we could take, so it'd be good to get another reviewer's input here (which might take up to 2 weeks, so thanks in advance for your patience).
setState(() { | ||
hourHasError.value = newHour == null; | ||
}); | ||
hourHasError.value = newHour == null; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks like a clear improvement: FormState.validate
guarantees a rebuild, so I don't believe this setState
is necessary.
However: I'm a bit worried about the implications here.
There might be a bunch of Flutter projects outside of this codebase that build a Form
with a similar structure; sadly, migrating the code here isn't going to help them out.
(I personally feel that many different aspects of the Form
widget could be improved, but they'd require significant time investment and would definitely qualify as "breaking changes". I've also found that it's not very hard to just ignore Form
entirely by using a state management package like provider or riverpod.)
Assuming we go through with this change: much like how theme data has useMaterial3
, it'd be nice if Form
had something that allowed for a migration period.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've been eyeing Form for a rewrite for a long time. I wish I could just write a whole new class with a new name, but the name "Form" is so good I think we'd have to do something like userMaterial3.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks very much for the updates!
In my opinion, this change is worth it regardless of whether it qualifies as "breaking", but hopefully we can do it in a non-breaking way :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR! Still some questions but I think we should definitely fix this bug.
setState(() { | ||
hourHasError.value = newHour == null; | ||
}); | ||
hourHasError.value = newHour == null; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've been eyeing Form for a rewrite for a long time. I wish I could just write a whole new class with a new name, but the name "Form" is so good I think we'd have to do something like userMaterial3.
Unfortunately, my disliking toward certain aspects of the @Mairramer thanks again for all the improvements you've made here! I'll probably be ready to re-engage sometime later this week. |
I understand you. Over the weekend I was analyzing several parts of the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for your patience! I'm looking forward to getting this fix merged.
I was analyzing several parts of the
Form
code that do not seem to have the quality standard that we expect from Flutter.
Amen to that. The widget wasn't poorly designed, but this file was created 8 years ago, and much has changed since then.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks for the fix!
This comment was marked as resolved.
This comment was marked as resolved.
Roll Flutter from 8536b96ebb3e to 93d772c5cdd8 (37 revisions) flutter/flutter@8536b96...93d772c 2024-11-21 [email protected] Added additional logging to `_listCoreDevices` (flutter/flutter#159275) 2024-11-21 [email protected] Roll Flutter Engine from 78b87f3fe023 to d1a08064e193 (1 revision) (flutter/flutter#159280) 2024-11-21 [email protected] Shut down DevTools and DDS processes if flutter_tools is killed by a signal (flutter/flutter#159238) 2024-11-21 [email protected] Remove `RepaintBoundary` that is no longer needed. (flutter/flutter#159232) 2024-11-21 [email protected] Try a speculative fix for Gradle OOMs. (flutter/flutter#159234) 2024-11-21 [email protected] On-device Widget Inspector button exits widget selection (flutter/flutter#158219) 2024-11-21 [email protected] Roll Flutter Engine from 523d381893c8 to 78b87f3fe023 (2 revisions) (flutter/flutter#159270) 2024-11-21 [email protected] Remove `firebase_abstract_method_smoke_test` (flutter/flutter#159145) 2024-11-21 [email protected] Roll Packages from e95f6d8 to 913b99e (7 revisions) (flutter/flutter#159268) 2024-11-21 [email protected] Roll Flutter Engine from 69c325513a65 to 523d381893c8 (3 revisions) (flutter/flutter#159263) 2024-11-21 [email protected] [flutter_tools] opt iOS/macOS apps out of Metal API validation via migrator, update templates in repo. (flutter/flutter#159228) 2024-11-21 [email protected] Scribe Android handwriting text input (flutter/flutter#148784) 2024-11-21 [email protected] Terminate non-detached test devices on `flutter run` completion (flutter/flutter#159170) 2024-11-21 [email protected] Un-skip tests that use `flutter build apk`. (flutter/flutter#159231) 2024-11-20 [email protected] Roll Flutter Engine from 2d32cf3a7971 to 69c325513a65 (1 revision) (flutter/flutter#159229) 2024-11-20 [email protected] Roll Flutter Engine from 3828681d1f86 to 2d32cf3a7971 (3 revisions) (flutter/flutter#159226) 2024-11-20 [email protected] Roll Flutter Engine from 3245c8976976 to 3828681d1f86 (1 revision) (flutter/flutter#159217) 2024-11-20 [email protected] Add `--dry-run` to `dev/bots/test.dart`. (flutter/flutter#158956) 2024-11-20 [email protected] Add docs for setting up Android Studio to auto format Kotlin code (flutter/flutter#159209) 2024-11-20 [email protected] Roll Flutter Engine from 80d77505fdde to 3245c8976976 (1 revision) (flutter/flutter#159214) 2024-11-20 [email protected] Fix: The enableFeedback property of InkWell cannot be set to a nullab� (flutter/flutter#158907) 2024-11-20 [email protected] Roll Flutter Engine from 3f19207e820e to 80d77505fdde (1 revision) (flutter/flutter#159210) 2024-11-20 [email protected] Roll Packages from fc4adc7 to e95f6d8 (6 revisions) (flutter/flutter#159201) 2024-11-20 [email protected] Remove dependency on [Target] and instead operate on [Architecture] (flutter/flutter#159196) 2024-11-20 [email protected] Fix git command in Quality-Assurance.md (flutter/flutter#155146) 2024-11-20 [email protected] Roll Flutter Engine from 7eb87547cbc6 to 3f19207e820e (4 revisions) (flutter/flutter#159176) 2024-11-20 [email protected] Make `runner` non-nullable as it always is. (flutter/flutter#159156) 2024-11-19 [email protected] Update Material 3 `CircularProgressIndicator` for new visual style (flutter/flutter#158104) 2024-11-19 [email protected] Roll Flutter Engine from 4ff696b555dc to 7eb87547cbc6 (3 revisions) (flutter/flutter#159168) 2024-11-19 [email protected] Add platform-android label for all flutter_tools *android* files (flutter/flutter#159166) 2024-11-19 [email protected] Roll Flutter Engine from d5820a638885 to 4ff696b555dc (1 revision) (flutter/flutter#159164) 2024-11-19 [email protected] Reland Add UI Benchmarks (flutter/flutter#153368) 2024-11-19 [email protected] fix lint usage of `task` inside `resolve_dependecies.gradle` file (flutter/flutter#158022) 2024-11-19 [email protected] Roll Flutter Engine from cff1e751f853 to d5820a638885 (5 revisions) (flutter/flutter#159155) 2024-11-19 [email protected] Removing redundant backticks in `flutter\packages\flutter_tools\gradle\gradle.kts` (flutter/flutter#159051) 2024-11-19 [email protected] Fixes initial validation with AutovalidateMode.always on first build (flutter/flutter#156708) 2024-11-19 [email protected] Introduce new Material 3 `Slider` shapes (flutter/flutter#152237) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose ...
Does this issue, fixes this bug currently present in v3.24.5. The form for some reason triggers an setState when the underlying widgets are beeing build (for the first time i think). It happens because the
|
@stan-at-work unfortunately I don't think so—this PR did have to deal with the same problem, but it was with regards to initializing the widget, not with |
@nate-thegrate @stan-at-work @nate-thegrate Do you think this could be related or is it just a coincidence? |
Would you be able to share what you made ? |
Here are some changes: There's a lot of stuff in there that's just for testing purposes, as I'm trying to find these blind spots that cause errors in other widgets. |
Thanks |
Fixes #142701
This PR fixes an issue where on the first build
AutovalidateMode.always
was not called.Pre-launch Checklist
///
).If you need help, consider asking for advice on the #hackers-new channel on Discord.