-
Notifications
You must be signed in to change notification settings - Fork 29.7k
Feat: TextField can scroll when disabled #140922
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
Feat: TextField can scroll when disabled #140922
Conversation
| import 'package:flutter/services.dart'; | ||
| import 'package:flutter_test/flutter_test.dart'; | ||
|
|
||
| import '../cupertino/text_field_restoration_test.dart'; |
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.
nit: I don't think this line is needed.
|
|
||
| /// If false the text field is "disabled" but still scrollable. | ||
| /// However, if [enabled] is true, then the text field is "active" and still scrollable. | ||
| final bool? ignorePointer; |
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.
Maybe instead of discussing the specific scrollable use-case this parameter is solving, you could talk about what it does in general. i.e. ignorePointer decides whether the widget will handle pointer events.
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.
+1, especially since this parameter doesn't actually cause the field to be disabled like enabled does.
| this.onAppPrivateCommand, | ||
| this.inputFormatters, | ||
| this.enabled, | ||
| this.ignorePointer, |
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.
nit: maybe ignoresPointers?
justinmc
left a comment
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.
The approach looks good, thanks for the PR! I'm on board with adding this parameter since it seems that we can't match textarea's behavior without it.
|
|
||
| /// If false the text field is "disabled" but still scrollable. | ||
| /// However, if [enabled] is true, then the text field is "active" and still scrollable. | ||
| final bool? ignorePointer; |
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.
+1, especially since this parameter doesn't actually cause the field to be disabled like enabled does.
|
|
||
| @override | ||
| bool get selectionEnabled => widget.selectionEnabled; | ||
| bool get selectionEnabled => widget.selectionEnabled && _isEnabled; |
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.
Why was this change needed?
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 change was made because the text selection menu (copy, paste, etc...) opens up when right-clicking on the textfield when disabled (and ignorePointers set to false). So the selectionEnabled should take into account for _isEnabled to prevent selection in all cases when the widget is disabled.
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.
Ah makes sense, thanks for the explanation.
| await gesture.moveBy(const Offset(0.0, -1000.0)); | ||
| await tester.pump(const Duration(seconds: 1)); | ||
| // Wait and drag again to trigger https://github.com/flutter/flutter/issues/6329 | ||
| // (No idea why this is necessary, but the bug wouldn't repro without it.) |
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.
Hmm we need to figure that out. Maybe try pumpAndSettle for the previous one on line 6573?
| final Offset newFirstPos = textOffsetToPosition(tester, kMoreThanFourLines.indexOf('First')); | ||
| final Offset newFourthPos = textOffsetToPosition(tester, kMoreThanFourLines.indexOf('Fourth')); |
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.
Maybe finalFirstPos etc.
7502f2f to
ec56971
Compare
d682ea8 to
f405eae
Compare
Renzo-Olivares
left a comment
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
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.
The only thing that I think should be changed is the tester.pump(const Duration(seconds: 1));, mentioned below. Otherwise this looks good.
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.
+1 to this suggestion.
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.
Does this work with pumpAndSettle instead? Same question for the similar pump a few lines below.
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.
Yes, using pumpAndSettle does work.
ce769e4 to
9cad5ae
Compare
justinmc
left a comment
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 fixes!
One last nit: don't forget this comment asking for a small change to the docs there.
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 pump is probably unnecessary.
4b7c5fe to
1743a58
Compare
Manual roll Flutter from 2f6fdf2 to ace9181 (57 revisions) Manual roll requested by [email protected] flutter/flutter@2f6fdf2...ace9181 2024-01-29 [email protected] Roll Flutter Engine from 9c3ebf67b5da to bedafa8794b6 (4 revisions) (flutter/flutter#142478) 2024-01-29 [email protected] onNavigationNotification for *App.router (flutter/flutter#142190) 2024-01-29 [email protected] Marks Mac_x64 framework_tests_misc to be unflaky (flutter/flutter#142118) 2024-01-29 [email protected] Roll Flutter Engine from 3e2b8975bd5b to 9c3ebf67b5da (1 revision) (flutter/flutter#142472) 2024-01-29 [email protected] Feat: TextField can scroll when disabled (flutter/flutter#140922) 2024-01-29 [email protected] Roll Flutter Engine from 436f91f3b06b to 3e2b8975bd5b (2 revisions) (flutter/flutter#142466) 2024-01-29 [email protected] Marks Mac_arm64 framework_tests_misc to be unflaky (flutter/flutter#142119) 2024-01-29 [email protected] Fix InputDecorationTheme copyWith fallback for iconColor (flutter/flutter#142462) 2024-01-29 [email protected] Add `SingleChildScrollView` for `NavigationRail` (flutter/flutter#137415) 2024-01-29 [email protected] [Windows Arm64] Run plugin test post-submit (flutter/flutter#141987) 2024-01-29 [email protected] Catch file system exceptions when trying to parse user-provided asset file paths (flutter/flutter#142214) 2024-01-29 [email protected] Implementing `switch` expressions in `foundation/` and `material/` (flutter/flutter#142279) 2024-01-29 [email protected] Roll Flutter Engine from bff1e46c0d65 to 436f91f3b06b (1 revision) (flutter/flutter#142455) 2024-01-29 [email protected] Opt out test from leak tracking. (flutter/flutter#142417) 2024-01-29 [email protected] Update Android minSdkVersion to 21 (flutter/flutter#142267) 2024-01-29 [email protected] Roll Flutter Engine from 3d87470655b1 to bff1e46c0d65 (1 revision) (flutter/flutter#142446) 2024-01-29 [email protected] Roll Packages from cbe8100 to 516648a (3 revisions) (flutter/flutter#142445) 2024-01-29 [email protected] Roll Flutter Engine from 1405cb7b6e74 to 3d87470655b1 (1 revision) (flutter/flutter#142444) 2024-01-29 [email protected] Roll Flutter Engine from 3e65f1720a6f to 1405cb7b6e74 (1 revision) (flutter/flutter#142432) 2024-01-29 [email protected] Roll Flutter Engine from 210ed1dfb8cf to 3e65f1720a6f (1 revision) (flutter/flutter#142429) 2024-01-29 [email protected] Roll Flutter Engine from f15cb86d31c3 to 210ed1dfb8cf (1 revision) (flutter/flutter#142426) 2024-01-29 [email protected] Roll Flutter Engine from f3d48be76630 to f15cb86d31c3 (11 revisions) (flutter/flutter#142425) 2024-01-27 [email protected] Roll Flutter Engine from 95e9a15fd909 to f3d48be76630 (1 revision) (flutter/flutter#142370) 2024-01-27 [email protected] Add no-shuffle to language_version_test.dart (flutter/flutter#142378) 2024-01-27 [email protected] Roll Flutter Engine from 2687ddb2655c to 95e9a15fd909 (8 revisions) (flutter/flutter#142369) 2024-01-27 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Roll Flutter Engine from 2687ddb2655c to 2adad88a39f4 (4 revisions)" (flutter/flutter#142366) 2024-01-27 [email protected] Roll Flutter Engine from 2687ddb2655c to 2adad88a39f4 (4 revisions) (flutter/flutter#142362) 2024-01-27 [email protected] Roll Flutter Engine from 45c06c22d5c7 to 2687ddb2655c (1 revision) (flutter/flutter#142359) 2024-01-27 [email protected] Remove suspicious constant from input decorator layout (flutter/flutter#142342) 2024-01-27 [email protected] Roll Flutter Engine from 2e32acf4c31a to 45c06c22d5c7 (2 revisions) (flutter/flutter#142353) 2024-01-27 [email protected] Roll Flutter Engine from a65a1b55e06a to 2e32acf4c31a (1 revision) (flutter/flutter#142351) 2024-01-26 [email protected] Roll Flutter Engine from 525bd7dcf7f3 to a65a1b55e06a (11 revisions) (flutter/flutter#142347) 2024-01-26 [email protected] Relands "Add runWidget to bootstrap a widget tree without a default View" (flutter/flutter#142344) 2024-01-26 [email protected] Fix assertion failure when reordering two dimensional children (flutter/flutter#141504) 2024-01-26 [email protected] Limit `fuchsia_precache` in presubmit to engine rolls (flutter/flutter#142333) 2024-01-26 49699333+dependabot[bot]@users.noreply.github.com Bump github/codeql-action from 3.23.1 to 3.23.2 (flutter/flutter#142345) 2024-01-26 [email protected] refactor asset bundle code to not depend on the global Cache.flutterRoot (flutter/flutter#142277) 2024-01-26 [email protected] [flutter_tools] remove await runZonedGuarded() in tests (flutter/flutter#142336) 2024-01-26 [email protected] Only use iOS 17 physical devices in staging tests (flutter/flutter#142323) 2024-01-26 [email protected] Roll deps from dart-lang/native in templates (flutter/flutter#142322) 2024-01-26 [email protected] Remove duplicate global declaration of `UserMessages` (flutter/flutter#142281) 2024-01-26 [email protected] Redistribute iOS TESTOWNERS (flutter/flutter#142315) 2024-01-26 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Add runWidget to bootstrap a widget tree without a default View" (flutter/flutter#142339) 2024-01-26 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Roll Flutter Engine from 525bd7dcf7f3 to 65d1291c3add (1 revision)" (flutter/flutter#142332) ...
This PR is adding a flag parameter to the
TextFieldwidget. This flag controls whether the TextField ignores pointers. The flag takes priority over other TextField behaviors such as enabled, so it can be useful when trying to have a disabled TextField that can be scrolled (behavior observed using TextArea on the web).Adding a flag parameter to
TextFieldhelps with more customization and flexibility to the widget which can improve user experience. I am open to other ideas.Fixes issue #140147
Before:
localhost_52348.-.Google.Chrome.2024-01-03.14-10-29.mp4
After:
localhost_52348.-.Google.Chrome.2024-01-03.14-03-39.mp4
Usage:
Pre-launch Checklist
///).