mirror of
https://github.com/flutter/flutter
synced 2024-10-13 11:42:54 +00:00
TextField constrained layout bug (#65966)
Fix a bug in the layout of some textfields with constrained height and visual density.
This commit is contained in:
parent
7f3c9b6bda
commit
10a66b19d5
|
@ -1032,11 +1032,12 @@ class _RenderDecoration extends RenderBox {
|
||||||
counterHeight,
|
counterHeight,
|
||||||
helperErrorHeight,
|
helperErrorHeight,
|
||||||
);
|
);
|
||||||
|
final Offset densityOffset = decoration.visualDensity.baseSizeAdjustment;
|
||||||
boxToBaseline[input] = _layoutLineBox(
|
boxToBaseline[input] = _layoutLineBox(
|
||||||
input,
|
input,
|
||||||
boxConstraints.deflate(EdgeInsets.only(
|
boxConstraints.deflate(EdgeInsets.only(
|
||||||
top: contentPadding.top + topHeight,
|
top: contentPadding.top + topHeight + densityOffset.dy / 2,
|
||||||
bottom: contentPadding.bottom + bottomHeight,
|
bottom: contentPadding.bottom + bottomHeight + densityOffset.dy / 2,
|
||||||
)).copyWith(
|
)).copyWith(
|
||||||
minWidth: inputWidth,
|
minWidth: inputWidth,
|
||||||
maxWidth: inputWidth,
|
maxWidth: inputWidth,
|
||||||
|
@ -1065,13 +1066,12 @@ class _RenderDecoration extends RenderBox {
|
||||||
prefixHeight - boxToBaseline[prefix],
|
prefixHeight - boxToBaseline[prefix],
|
||||||
suffixHeight - boxToBaseline[suffix],
|
suffixHeight - boxToBaseline[suffix],
|
||||||
);
|
);
|
||||||
final double fixBelowInput = math.max(
|
final double fixBelowInput = fixBelowBaseline <= 0.0 ? 0.0 : math.max(
|
||||||
0,
|
0,
|
||||||
fixBelowBaseline - (inputHeight - inputInternalBaseline),
|
fixBelowBaseline - (inputHeight - inputInternalBaseline),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Calculate the height of the input text container.
|
// Calculate the height of the input text container.
|
||||||
final Offset densityOffset = decoration.visualDensity.baseSizeAdjustment;
|
|
||||||
final double prefixIconHeight = prefixIcon == null ? 0 : prefixIcon.size.height;
|
final double prefixIconHeight = prefixIcon == null ? 0 : prefixIcon.size.height;
|
||||||
final double suffixIconHeight = suffixIcon == null ? 0 : suffixIcon.size.height;
|
final double suffixIconHeight = suffixIcon == null ? 0 : suffixIcon.size.height;
|
||||||
final double fixIconHeight = math.max(prefixIconHeight, suffixIconHeight);
|
final double fixIconHeight = math.max(prefixIconHeight, suffixIconHeight);
|
||||||
|
@ -1087,8 +1087,8 @@ class _RenderDecoration extends RenderBox {
|
||||||
);
|
);
|
||||||
final double minContainerHeight = decoration.isDense || decoration.isCollapsed || expands
|
final double minContainerHeight = decoration.isDense || decoration.isCollapsed || expands
|
||||||
? 0.0
|
? 0.0
|
||||||
: kMinInteractiveDimension + densityOffset.dy;
|
: kMinInteractiveDimension;
|
||||||
final double maxContainerHeight = boxConstraints.maxHeight - bottomHeight + densityOffset.dy;
|
final double maxContainerHeight = boxConstraints.maxHeight - bottomHeight;
|
||||||
final double containerHeight = expands
|
final double containerHeight = expands
|
||||||
? maxContainerHeight
|
? maxContainerHeight
|
||||||
: math.min(math.max(contentHeight, minContainerHeight), maxContainerHeight);
|
: math.min(math.max(contentHeight, minContainerHeight), maxContainerHeight);
|
||||||
|
|
|
@ -4235,4 +4235,55 @@ void main() {
|
||||||
expect(tester.getSize(find.text(labelText)).width, labelWidth);
|
expect(tester.getSize(find.text(labelText)).width, labelWidth);
|
||||||
expect(getOpacity(tester, prefixText), 1.0);
|
expect(getOpacity(tester, prefixText), 1.0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('given enough space, constrained and unconstrained heights result in the same size widget', (WidgetTester tester) async {
|
||||||
|
// Regression test for https://github.com/flutter/flutter/issues/65572
|
||||||
|
final UniqueKey keyUnconstrained = UniqueKey();
|
||||||
|
final UniqueKey keyConstrained = UniqueKey();
|
||||||
|
|
||||||
|
Widget getInputDecorator(VisualDensity visualDensity) {
|
||||||
|
return MaterialApp(
|
||||||
|
home: Material(
|
||||||
|
child: Builder(
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return Theme(
|
||||||
|
data: Theme.of(context).copyWith(visualDensity: visualDensity),
|
||||||
|
child: Center(
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
SizedBox(
|
||||||
|
width: 35.0,
|
||||||
|
child: TextField(
|
||||||
|
key: keyUnconstrained,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 35.0,
|
||||||
|
// 48 is the height that this TextField would take when
|
||||||
|
// laid out with no constraints.
|
||||||
|
height: 48.0,
|
||||||
|
child: TextField(
|
||||||
|
key: keyConstrained,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
await tester.pumpWidget(getInputDecorator(VisualDensity.standard));
|
||||||
|
final double constrainedHeight = tester.getSize(find.byKey(keyConstrained)).height;
|
||||||
|
final double unConstrainedHeight = tester.getSize(find.byKey(keyUnconstrained)).height;
|
||||||
|
expect(constrainedHeight, equals(unConstrainedHeight));
|
||||||
|
|
||||||
|
await tester.pumpWidget(getInputDecorator(VisualDensity.compact));
|
||||||
|
final double constrainedHeightCompact = tester.getSize(find.byKey(keyConstrained)).height;
|
||||||
|
final double unConstrainedHeightCompact = tester.getSize(find.byKey(keyUnconstrained)).height;
|
||||||
|
expect(constrainedHeightCompact, equals(unConstrainedHeightCompact));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue