Unverified Commit 17d31797 authored by Hans Muller's avatar Hans Muller Committed by GitHub

Use OverflowBar instead of ButtonBar in TimePicker (#62601)

parent e3c3d6eb
...@@ -11,8 +11,6 @@ import 'package:flutter/rendering.dart'; ...@@ -11,8 +11,6 @@ import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'button_bar.dart';
import 'button_theme.dart';
import 'color_scheme.dart'; import 'color_scheme.dart';
import 'colors.dart'; import 'colors.dart';
import 'constants.dart'; import 'constants.dart';
...@@ -1827,19 +1825,24 @@ class _TimePickerDialogState extends State<_TimePickerDialog> { ...@@ -1827,19 +1825,24 @@ class _TimePickerDialogState extends State<_TimePickerDialog> {
: MaterialLocalizations.of(context).dialModeButtonLabel, : MaterialLocalizations.of(context).dialModeButtonLabel,
), ),
Expanded( Expanded(
// TODO(rami-a): Move away from ButtonBar to avoid https://github.com/flutter/flutter/issues/53378. child: Container(
child: ButtonBar( alignment: AlignmentDirectional.centerEnd,
layoutBehavior: ButtonBarLayoutBehavior.constrained, constraints: const BoxConstraints(minHeight: 52.0),
children: <Widget>[ padding: const EdgeInsets.symmetric(horizontal: 8),
TextButton( child: OverflowBar(
onPressed: _handleCancel, spacing: 8,
child: Text(widget.cancelText ?? localizations.cancelButtonLabel), overflowAlignment: OverflowBarAlignment.end,
), children: <Widget>[
TextButton( TextButton(
onPressed: _handleOk, onPressed: _handleCancel,
child: Text(widget.confirmText ?? localizations.okButtonLabel), child: Text(widget.cancelText ?? localizations.cancelButtonLabel),
), ),
], TextButton(
onPressed: _handleOk,
child: Text(widget.confirmText ?? localizations.okButtonLabel),
),
],
),
), ),
), ),
], ],
......
...@@ -643,54 +643,100 @@ void _tests() { ...@@ -643,54 +643,100 @@ void _tests() {
expect(find.text(helperText), findsOneWidget); expect(find.text(helperText), findsOneWidget);
}); });
// TODO(rami-a): Re-enable and fix test. testWidgets('OK Cancel button layout', (WidgetTester tester) async {
testWidgets('text scale affects certain elements and not others', Widget buildFrame(TextDirection textDirection) {
(WidgetTester tester) async { return MaterialApp(
await mediaQueryBoilerplate( home: Material(
tester, child: Center(
false, child: Builder(
textScaleFactor: 1.0, builder: (BuildContext context) {
initialTime: const TimeOfDay(hour: 7, minute: 41), return ElevatedButton(
); child: const Text('X'),
await tester.tap(find.text('X')); onPressed: () {
await tester.pumpAndSettle(); showTimePicker(
context: context,
final double minutesDisplayHeight = tester.getSize(find.text('41')).height; initialTime: const TimeOfDay(hour: 7, minute: 0),
final double amHeight = tester.getSize(find.text('AM')).height; builder: (BuildContext context, Widget child) {
return Directionality(
await tester.tap(find.text('OK')); // dismiss the dialog textDirection: textDirection,
await tester.pumpAndSettle(); child: child,
);
// Verify that the time display is not affected by text scale. },
await mediaQueryBoilerplate( );
tester, },
false, );
textScaleFactor: 2.0, },
initialTime: const TimeOfDay(hour: 7, minute: 41), ),
); ),
await tester.tap(find.text('X')); ),
await tester.pumpAndSettle(); );
}
final double amHeight2x = tester.getSize(find.text('AM')).height;
expect(tester.getSize(find.text('41')).height, equals(minutesDisplayHeight)); await tester.pumpWidget(buildFrame(TextDirection.ltr));
expect(amHeight2x, greaterThanOrEqualTo(amHeight * 2)); await tester.tap(find.text('X'));
await tester.pumpAndSettle();
await tester.tap(find.text('OK')); // dismiss the dialog expect(tester.getBottomRight(find.text('OK')).dx, 638);
await tester.pumpAndSettle(); expect(tester.getBottomLeft(find.text('OK')).dx, 610);
expect(tester.getBottomRight(find.text('CANCEL')).dx, 576);
// Verify that text scale for AM/PM is at most 2x. await tester.tap(find.text('OK'));
await mediaQueryBoilerplate( await tester.pumpAndSettle();
tester,
false, await tester.pumpWidget(buildFrame(TextDirection.rtl));
textScaleFactor: 3.0, await tester.tap(find.text('X'));
initialTime: const TimeOfDay(hour: 7, minute: 41), await tester.pumpAndSettle();
); expect(tester.getBottomLeft(find.text('OK')).dx, 162);
await tester.tap(find.text('X')); expect(tester.getBottomRight(find.text('OK')).dx, 190);
await tester.pumpAndSettle(); expect(tester.getBottomLeft(find.text('CANCEL')).dx, 224);
await tester.tap(find.text('OK'));
expect(tester.getSize(find.text('41')).height, equals(minutesDisplayHeight)); await tester.pumpAndSettle();
expect(tester.getSize(find.text('AM')).height, equals(amHeight2x)); });
});
testWidgets('text scale affects certain elements and not others', (WidgetTester tester) async {
await mediaQueryBoilerplate(
tester,
false,
textScaleFactor: 1.0,
initialTime: const TimeOfDay(hour: 7, minute: 41),
);
await tester.tap(find.text('X'));
await tester.pumpAndSettle();
final double minutesDisplayHeight = tester.getSize(find.text('41')).height;
final double amHeight = tester.getSize(find.text('AM')).height;
await tester.tap(find.text('OK')); // dismiss the dialog
await tester.pumpAndSettle();
// Verify that the time display is not affected by text scale.
await mediaQueryBoilerplate(
tester,
false,
textScaleFactor: 2.0,
initialTime: const TimeOfDay(hour: 7, minute: 41),
);
await tester.tap(find.text('X'));
await tester.pumpAndSettle();
final double amHeight2x = tester.getSize(find.text('AM')).height;
expect(tester.getSize(find.text('41')).height, equals(minutesDisplayHeight));
expect(amHeight2x, greaterThanOrEqualTo(amHeight * 2));
await tester.tap(find.text('OK')); // dismiss the dialog
await tester.pumpAndSettle();
// Verify that text scale for AM/PM is at most 2x.
await mediaQueryBoilerplate(
tester,
false,
textScaleFactor: 3.0,
initialTime: const TimeOfDay(hour: 7, minute: 41),
);
await tester.tap(find.text('X'));
await tester.pumpAndSettle();
expect(tester.getSize(find.text('41')).height, equals(minutesDisplayHeight));
expect(tester.getSize(find.text('AM')).height, equals(amHeight2x));
});
} }
void _testsInput() { void _testsInput() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment