Skip to content

Commit 2a58bb7

Browse files
author
Casey Hillers
authored
Revert "InputDecorator: Switch hint to Opacity instead of AnimatedOpacity" (#107406)
1 parent 975ec10 commit 2a58bb7

File tree

4 files changed

+92
-41
lines changed

4 files changed

+92
-41
lines changed

packages/flutter/lib/src/material/input_decorator.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2157,8 +2157,10 @@ class _InputDecoratorState extends State<InputDecorator> with TickerProviderStat
21572157
final TextBaseline textBaseline = labelStyle.textBaseline!;
21582158

21592159
final TextStyle hintStyle = _getInlineHintStyle(themeData);
2160-
final Widget? hint = decoration!.hintText == null ? null : Opacity(
2160+
final Widget? hint = decoration!.hintText == null ? null : AnimatedOpacity(
21612161
opacity: (isEmpty && !_hasInlineLabel) ? 1.0 : 0.0,
2162+
duration: _kTransitionDuration,
2163+
curve: _kTransitionCurve,
21622164
alwaysIncludeSemantics: true,
21632165
child: Text(
21642166
decoration!.hintText!,

packages/flutter/test/material/input_date_picker_form_field_test.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,13 @@ void main() {
6161
}
6262

6363
double textOpacity(WidgetTester tester, String textValue) {
64-
return tester.widget<Opacity>(
64+
final FadeTransition opacityWidget = tester.widget<FadeTransition>(
6565
find.ancestor(
6666
of: find.text(textValue),
67-
matching: find.byType(Opacity),
67+
matching: find.byType(FadeTransition),
6868
).first,
69-
).opacity;
69+
);
70+
return opacityWidget.opacity.value;
7071
}
7172

7273
group('InputDatePickerFormField', () {

packages/flutter/test/material/input_decorator_test.dart

Lines changed: 82 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -144,15 +144,6 @@ double getOpacity(WidgetTester tester, String textValue) {
144144
return opacityWidget.opacity.value;
145145
}
146146

147-
double getStaticOpacity(WidgetTester tester, String textValue) {
148-
return tester.widget<Opacity>(
149-
find.ancestor(
150-
of: find.text(textValue),
151-
matching: find.byType(Opacity),
152-
).first,
153-
).opacity;
154-
}
155-
156147
void main() {
157148
testWidgets('InputDecorator input/label text layout', (WidgetTester tester) async {
158149
// The label appears above the input text
@@ -972,7 +963,7 @@ void main() {
972963
expect(tester.getBottomLeft(find.text('text')).dy, 44.0);
973964
expect(tester.getTopLeft(find.text('label')).dy, 20.0);
974965
expect(tester.getBottomLeft(find.text('label')).dy, 36.0);
975-
expect(getStaticOpacity(tester, 'hint'), 0.0);
966+
expect(getOpacity(tester, 'hint'), 0.0);
976967
expect(getBorderBottom(tester), 56.0);
977968
expect(getBorderWeight(tester), 1.0);
978969

@@ -988,6 +979,17 @@ void main() {
988979
),
989980
);
990981

982+
// The hint's opacity animates from 0.0 to 1.0.
983+
// The animation's duration is 200ms.
984+
{
985+
await tester.pump(const Duration(milliseconds: 50));
986+
final double hintOpacity50ms = getOpacity(tester, 'hint');
987+
expect(hintOpacity50ms, inExclusiveRange(0.0, 1.0));
988+
await tester.pump(const Duration(milliseconds: 50));
989+
final double hintOpacity100ms = getOpacity(tester, 'hint');
990+
expect(hintOpacity100ms, inExclusiveRange(hintOpacity50ms, 1.0));
991+
}
992+
991993
await tester.pumpAndSettle();
992994
expect(tester.getSize(find.byType(InputDecorator)), const Size(800.0, 56.0));
993995
expect(tester.getTopLeft(find.text('text')).dy, 28.0);
@@ -996,7 +998,7 @@ void main() {
996998
expect(tester.getBottomLeft(find.text('label')).dy, 24.0);
997999
expect(tester.getTopLeft(find.text('hint')).dy, 28.0);
9981000
expect(tester.getBottomLeft(find.text('hint')).dy, 44.0);
999-
expect(getStaticOpacity(tester, 'hint'), 1.0);
1001+
expect(getOpacity(tester, 'hint'), 1.0);
10001002
expect(getBorderBottom(tester), 56.0);
10011003
expect(getBorderWeight(tester), 2.0);
10021004

@@ -1010,6 +1012,17 @@ void main() {
10101012
),
10111013
);
10121014

1015+
// The hint's opacity animates from 1.0 to 0.0.
1016+
// The animation's duration is 200ms.
1017+
{
1018+
await tester.pump(const Duration(milliseconds: 50));
1019+
final double hintOpacity50ms = getOpacity(tester, 'hint');
1020+
expect(hintOpacity50ms, inExclusiveRange(0.0, 1.0));
1021+
await tester.pump(const Duration(milliseconds: 50));
1022+
final double hintOpacity100ms = getOpacity(tester, 'hint');
1023+
expect(hintOpacity100ms, inExclusiveRange(0.0, hintOpacity50ms));
1024+
}
1025+
10131026
await tester.pumpAndSettle();
10141027
expect(tester.getSize(find.byType(InputDecorator)), const Size(800.0, 56.0));
10151028
expect(tester.getTopLeft(find.text('text')).dy, 28.0);
@@ -1018,7 +1031,7 @@ void main() {
10181031
expect(tester.getBottomLeft(find.text('label')).dy, 24.0);
10191032
expect(tester.getTopLeft(find.text('hint')).dy, 28.0);
10201033
expect(tester.getBottomLeft(find.text('hint')).dy, 44.0);
1021-
expect(getStaticOpacity(tester, 'hint'), 0.0);
1034+
expect(getOpacity(tester, 'hint'), 0.0);
10221035
expect(getBorderBottom(tester), 56.0);
10231036
expect(getBorderWeight(tester), 2.0);
10241037
});
@@ -1058,7 +1071,7 @@ void main() {
10581071
expect(tester.getBottomLeft(find.text('text')).dy, 40.0);
10591072
expect(tester.getTopLeft(find.text('label')).dy, 16.0);
10601073
expect(tester.getBottomLeft(find.text('label')).dy, 32.0);
1061-
expect(getStaticOpacity(tester, 'hint'), 0.0);
1074+
expect(getOpacity(tester, 'hint'), 0.0);
10621075
expect(getBorderBottom(tester), 48.0);
10631076
expect(getBorderWeight(tester), 1.0);
10641077

@@ -1080,7 +1093,7 @@ void main() {
10801093
expect(tester.getBottomLeft(find.text('text')).dy, 40.0);
10811094
expect(tester.getTopLeft(find.text('label')).dy, 8.0);
10821095
expect(tester.getBottomLeft(find.text('label')).dy, 20.0);
1083-
expect(getStaticOpacity(tester, 'hint'), 1.0);
1096+
expect(getOpacity(tester, 'hint'), 1.0);
10841097
expect(getBorderBottom(tester), 48.0);
10851098
expect(getBorderWeight(tester), 2.0);
10861099
});
@@ -1855,7 +1868,7 @@ void main() {
18551868
expect(tester.getBottomLeft(find.text('text')).dy, 40.0);
18561869
expect(tester.getTopLeft(find.text('label')).dy, 16.0);
18571870
expect(tester.getBottomLeft(find.text('label')).dy, 32.0);
1858-
expect(getStaticOpacity(tester, 'hint'), 0.0);
1871+
expect(getOpacity(tester, 'hint'), 0.0);
18591872
expect(getBorderBottom(tester), 48.0);
18601873
expect(getBorderWeight(tester), 1.0);
18611874

@@ -1872,6 +1885,17 @@ void main() {
18721885
),
18731886
);
18741887

1888+
// The hint's opacity animates from 0.0 to 1.0.
1889+
// The animation's duration is 200ms.
1890+
{
1891+
await tester.pump(const Duration(milliseconds: 50));
1892+
final double hintOpacity50ms = getOpacity(tester, 'hint');
1893+
expect(hintOpacity50ms, inExclusiveRange(0.0, 1.0));
1894+
await tester.pump(const Duration(milliseconds: 50));
1895+
final double hintOpacity100ms = getOpacity(tester, 'hint');
1896+
expect(hintOpacity100ms, inExclusiveRange(hintOpacity50ms, 1.0));
1897+
}
1898+
18751899
await tester.pumpAndSettle();
18761900
expect(tester.getSize(find.byType(InputDecorator)), const Size(800.0, 48.0));
18771901
expect(tester.getTopLeft(find.text('text')).dy, 24.0);
@@ -1880,7 +1904,7 @@ void main() {
18801904
expect(tester.getBottomLeft(find.text('label')).dy, 24.0);
18811905
expect(tester.getTopLeft(find.text('hint')).dy, 24.0);
18821906
expect(tester.getBottomLeft(find.text('hint')).dy, 40.0);
1883-
expect(getStaticOpacity(tester, 'hint'), 1.0);
1907+
expect(getOpacity(tester, 'hint'), 1.0);
18841908
expect(getBorderBottom(tester), 48.0);
18851909
expect(getBorderWeight(tester), 2.0);
18861910

@@ -1895,6 +1919,17 @@ void main() {
18951919
),
18961920
);
18971921

1922+
// The hint's opacity animates from 1.0 to 0.0.
1923+
// The animation's duration is 200ms.
1924+
{
1925+
await tester.pump(const Duration(milliseconds: 50));
1926+
final double hintOpacity50ms = getOpacity(tester, 'hint');
1927+
expect(hintOpacity50ms, inExclusiveRange(0.0, 1.0));
1928+
await tester.pump(const Duration(milliseconds: 50));
1929+
final double hintOpacity100ms = getOpacity(tester, 'hint');
1930+
expect(hintOpacity100ms, inExclusiveRange(0.0, hintOpacity50ms));
1931+
}
1932+
18981933
await tester.pumpAndSettle();
18991934
expect(tester.getSize(find.byType(InputDecorator)), const Size(800.0, 48.0));
19001935
expect(tester.getTopLeft(find.text('text')).dy, 24.0);
@@ -1903,7 +1938,7 @@ void main() {
19031938
expect(tester.getBottomLeft(find.text('label')).dy, 24.0);
19041939
expect(tester.getTopLeft(find.text('hint')).dy, 24.0);
19051940
expect(tester.getBottomLeft(find.text('hint')).dy, 40.0);
1906-
expect(getStaticOpacity(tester, 'hint'), 0.0);
1941+
expect(getOpacity(tester, 'hint'), 0.0);
19071942
expect(getBorderBottom(tester), 48.0);
19081943
expect(getBorderWeight(tester), 2.0);
19091944
});
@@ -1927,7 +1962,7 @@ void main() {
19271962
expect(tester.getBottomLeft(find.text('text')).dy, 48.0);
19281963
expect(tester.getTopLeft(find.text('label')).dy, 24.0);
19291964
expect(tester.getBottomLeft(find.text('label')).dy, 40.0);
1930-
expect(getStaticOpacity(tester, 'hint'), 0.0);
1965+
expect(getOpacity(tester, 'hint'), 0.0);
19311966
expect(getBorderBottom(tester), 64.0);
19321967
expect(getBorderWeight(tester), 1.0);
19331968

@@ -1944,6 +1979,17 @@ void main() {
19441979
),
19451980
);
19461981

1982+
// The hint's opacity animates from 0.0 to 1.0.
1983+
// The animation's duration is 200ms.
1984+
{
1985+
await tester.pump(const Duration(milliseconds: 50));
1986+
final double hintOpacity50ms = getOpacity(tester, 'hint');
1987+
expect(hintOpacity50ms, inExclusiveRange(0.0, 1.0));
1988+
await tester.pump(const Duration(milliseconds: 50));
1989+
final double hintOpacity100ms = getOpacity(tester, 'hint');
1990+
expect(hintOpacity100ms, inExclusiveRange(hintOpacity50ms, 1.0));
1991+
}
1992+
19471993
await tester.pumpAndSettle();
19481994
expect(tester.getSize(find.byType(InputDecorator)), const Size(800.0, 64.0));
19491995
expect(tester.getTopLeft(find.text('text')).dy, 32.0);
@@ -1952,7 +1998,7 @@ void main() {
19521998
expect(tester.getBottomLeft(find.text('label')).dy, 24.0);
19531999
expect(tester.getTopLeft(find.text('hint')).dy, 32.0);
19542000
expect(tester.getBottomLeft(find.text('hint')).dy, 48.0);
1955-
expect(getStaticOpacity(tester, 'hint'), 1.0);
2001+
expect(getOpacity(tester, 'hint'), 1.0);
19562002
expect(getBorderBottom(tester), 64.0);
19572003
expect(getBorderWeight(tester), 2.0);
19582004

@@ -1967,6 +2013,17 @@ void main() {
19672013
),
19682014
);
19692015

2016+
// The hint's opacity animates from 1.0 to 0.0.
2017+
// The animation's duration is 200ms.
2018+
{
2019+
await tester.pump(const Duration(milliseconds: 50));
2020+
final double hintOpacity50ms = getOpacity(tester, 'hint');
2021+
expect(hintOpacity50ms, inExclusiveRange(0.0, 1.0));
2022+
await tester.pump(const Duration(milliseconds: 50));
2023+
final double hintOpacity100ms = getOpacity(tester, 'hint');
2024+
expect(hintOpacity100ms, inExclusiveRange(0.0, hintOpacity50ms));
2025+
}
2026+
19702027
await tester.pumpAndSettle();
19712028
expect(tester.getSize(find.byType(InputDecorator)), const Size(800.0, 64.0));
19722029
expect(tester.getTopLeft(find.text('text')).dy, 32.0);
@@ -1975,7 +2032,7 @@ void main() {
19752032
expect(tester.getBottomLeft(find.text('label')).dy, 24.0);
19762033
expect(tester.getTopLeft(find.text('hint')).dy, 32.0);
19772034
expect(tester.getBottomLeft(find.text('hint')).dy, 48.0);
1978-
expect(getStaticOpacity(tester, 'hint'), 0.0);
2035+
expect(getOpacity(tester, 'hint'), 0.0);
19792036
expect(getBorderBottom(tester), 64.0);
19802037
expect(getBorderWeight(tester), 2.0);
19812038
});
@@ -3213,7 +3270,7 @@ void main() {
32133270
expect(tester.getSize(find.byType(InputDecorator)), const Size(800.0, 18.0));
32143271
expect(tester.getSize(find.text('text')).height, 16.0);
32153272
expect(tester.getTopLeft(find.text('text')).dy, 1.0);
3216-
expect(getStaticOpacity(tester, 'hint'), 0.0);
3273+
expect(getOpacity(tester, 'hint'), 0.0);
32173274
expect(getBorderWeight(tester), 1.0);
32183275

32193276
await tester.pumpWidget(
@@ -3236,7 +3293,7 @@ void main() {
32363293
expect(tester.getSize(find.byType(InputDecorator)), const Size(800.0, 16.0));
32373294
expect(tester.getSize(find.text('text')).height, 16.0);
32383295
expect(tester.getTopLeft(find.text('text')).dy, 0.0);
3239-
expect(getStaticOpacity(tester, 'hint'), 0.0);
3296+
expect(getOpacity(tester, 'hint'), 0.0);
32403297
expect(getBorderWeight(tester), 1.0);
32413298

32423299
await tester.pumpWidget(
@@ -3258,7 +3315,7 @@ void main() {
32583315
expect(tester.getSize(find.byType(InputDecorator)), const Size(800.0, kMinInteractiveDimension));
32593316
expect(tester.getSize(find.text('text')).height, 16.0);
32603317
expect(tester.getTopLeft(find.text('text')).dy, 16.0);
3261-
expect(getStaticOpacity(tester, 'hint'), 0.0);
3318+
expect(getOpacity(tester, 'hint'), 0.0);
32623319
expect(getBorderWeight(tester), 0.0);
32633320
});
32643321

@@ -3280,7 +3337,7 @@ void main() {
32803337
expect(tester.getSize(find.byType(InputDecorator)), const Size(800.0, 16.0));
32813338
expect(tester.getSize(find.text('text')).height, 16.0);
32823339
expect(tester.getTopLeft(find.text('text')).dy, 0.0);
3283-
expect(getStaticOpacity(tester, 'hint'), 0.0);
3340+
expect(getOpacity(tester, 'hint'), 0.0);
32843341
expect(getBorderWeight(tester), 0.0);
32853342

32863343
// The hint should appear
@@ -5026,7 +5083,7 @@ void main() {
50265083
);
50275084
await tester.pumpAndSettle();
50285085

5029-
expect(getStaticOpacity(tester, 'hint'), 1.0);
5086+
expect(getOpacity(tester, 'hint'), 1.0);
50305087
});
50315088

50325089
testWidgets('InputDecorator floating label width scales when focused', (WidgetTester tester) async {

packages/flutter/test/material/text_field_test.dart

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -131,15 +131,6 @@ double getOpacity(WidgetTester tester, Finder finder) {
131131
).opacity.value;
132132
}
133133

134-
double getStaticOpacity(WidgetTester tester, Finder finder) {
135-
return tester.widget<Opacity>(
136-
find.ancestor(
137-
of: finder,
138-
matching: find.byType(Opacity),
139-
).first,
140-
).opacity;
141-
}
142-
143134
class TestFormatter extends TextInputFormatter {
144135
TestFormatter(this.onFormatEditUpdate);
145136
FormatEditUpdateCallback onFormatEditUpdate;
@@ -3681,15 +3672,15 @@ void main() {
36813672
// Neither the prefix or the suffix should initially be visible, only the hint.
36823673
expect(getOpacity(tester, find.text('Prefix')), 0.0);
36833674
expect(getOpacity(tester, find.text('Suffix')), 0.0);
3684-
expect(getStaticOpacity(tester, find.text('Hint')), 1.0);
3675+
expect(getOpacity(tester, find.text('Hint')), 1.0);
36853676

36863677
await tester.tap(find.byKey(secondKey));
36873678
await tester.pumpAndSettle();
36883679

36893680
// Focus the Input. The hint, prefix, and suffix should appear
36903681
expect(getOpacity(tester, find.text('Prefix')), 1.0);
36913682
expect(getOpacity(tester, find.text('Suffix')), 1.0);
3692-
expect(getStaticOpacity(tester, find.text('Hint')), 1.0);
3683+
expect(getOpacity(tester, find.text('Hint')), 1.0);
36933684

36943685
// Enter some text, and the hint should disappear and the prefix and suffix
36953686
// should continue to be visible
@@ -3698,7 +3689,7 @@ void main() {
36983689

36993690
expect(getOpacity(tester, find.text('Prefix')), 1.0);
37003691
expect(getOpacity(tester, find.text('Suffix')), 1.0);
3701-
expect(getStaticOpacity(tester, find.text('Hint')), 0.0);
3692+
expect(getOpacity(tester, find.text('Hint')), 0.0);
37023693

37033694
// Check and make sure that the right styles were applied.
37043695
final Text prefixText = tester.widget(find.text('Prefix'));

0 commit comments

Comments
 (0)