SearchBar
should not be impacted by overall InputDecorationTheme
(#127465)
This commit is contained in:
parent
f71075db2e
commit
9fa351807f
@ -1239,10 +1239,17 @@ class _SearchBarState extends State<SearchBar> {
|
|||||||
controller: widget.controller,
|
controller: widget.controller,
|
||||||
style: effectiveTextStyle,
|
style: effectiveTextStyle,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
border: InputBorder.none,
|
|
||||||
hintText: widget.hintText,
|
hintText: widget.hintText,
|
||||||
|
).applyDefaults(InputDecorationTheme(
|
||||||
hintStyle: effectiveHintStyle,
|
hintStyle: effectiveHintStyle,
|
||||||
),
|
|
||||||
|
// The configuration below is to make sure that the text field
|
||||||
|
// in `SearchBar` will not be overridden by the overall `InputDecorationTheme`
|
||||||
|
enabledBorder: InputBorder.none,
|
||||||
|
border: InputBorder.none,
|
||||||
|
focusedBorder: InputBorder.none,
|
||||||
|
contentPadding: const EdgeInsets.symmetric(vertical: 12.0),
|
||||||
|
)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -31,29 +31,7 @@ void main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
final Material material = tester.widget<Material>(searchBarMaterial);
|
final Material material = tester.widget<Material>(searchBarMaterial);
|
||||||
expect(material.animationDuration, const Duration(milliseconds: 200));
|
checkSearchBarDefaults(tester, colorScheme, material);
|
||||||
expect(material.borderOnForeground, true);
|
|
||||||
expect(material.borderRadius, null);
|
|
||||||
expect(material.clipBehavior, Clip.none);
|
|
||||||
expect(material.color, colorScheme.surface);
|
|
||||||
expect(material.elevation, 6.0);
|
|
||||||
expect(material.shadowColor, colorScheme.shadow);
|
|
||||||
expect(material.surfaceTintColor, colorScheme.surfaceTint);
|
|
||||||
expect(material.shape, const StadiumBorder());
|
|
||||||
|
|
||||||
final Text helperText = tester.widget(find.text('hint text'));
|
|
||||||
expect(helperText.style?.color, colorScheme.onSurfaceVariant);
|
|
||||||
expect(helperText.style?.fontSize, 16.0);
|
|
||||||
expect(helperText.style?.fontFamily, 'Roboto');
|
|
||||||
expect(helperText.style?.fontWeight, FontWeight.w400);
|
|
||||||
|
|
||||||
const String input = 'entered text';
|
|
||||||
await tester.enterText(find.byType(SearchBar), input);
|
|
||||||
final EditableText inputText = tester.widget(find.text(input));
|
|
||||||
expect(inputText.style.color, colorScheme.onSurface);
|
|
||||||
expect(inputText.style.fontSize, 16.0);
|
|
||||||
expect(helperText.style?.fontFamily, 'Roboto');
|
|
||||||
expect(inputText.style.fontWeight, FontWeight.w400);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('SearchBar respects controller property', (WidgetTester tester) async {
|
testWidgets('SearchBar respects controller property', (WidgetTester tester) async {
|
||||||
@ -643,19 +621,21 @@ void main() {
|
|||||||
// On hovered.
|
// On hovered.
|
||||||
final TestGesture gesture = await _pointGestureToSearchBar(tester);
|
final TestGesture gesture = await _pointGestureToSearchBar(tester);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
final Text helperText = tester.widget(find.text('hint text'));
|
Text helperText = tester.widget(find.text('hint text'));
|
||||||
expect(helperText.style?.color, hoveredColor);
|
expect(helperText.style?.color, hoveredColor);
|
||||||
|
|
||||||
// On pressed.
|
// On pressed.
|
||||||
await gesture.down(tester.getCenter(find.byType(SearchBar)));
|
await gesture.down(tester.getCenter(find.byType(SearchBar)));
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
|
helperText = tester.widget(find.text('hint text'));
|
||||||
|
expect(helperText.style?.color, pressedColor);
|
||||||
await gesture.removePointer();
|
await gesture.removePointer();
|
||||||
expect(helperText.style?.color, hoveredColor);
|
|
||||||
|
|
||||||
// On focused.
|
// On focused.
|
||||||
await tester.tap(find.byType(SearchBar));
|
await tester.tap(find.byType(SearchBar));
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
expect(helperText.style?.color, hoveredColor);
|
helperText = tester.widget(find.text('hint text'));
|
||||||
|
expect(helperText.style?.color, focusedColor);
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('SearchBar respects textStyle property', (WidgetTester tester) async {
|
testWidgets('SearchBar respects textStyle property', (WidgetTester tester) async {
|
||||||
@ -676,19 +656,21 @@ void main() {
|
|||||||
// On hovered.
|
// On hovered.
|
||||||
final TestGesture gesture = await _pointGestureToSearchBar(tester);
|
final TestGesture gesture = await _pointGestureToSearchBar(tester);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
final EditableText inputText = tester.widget(find.text('input text'));
|
EditableText inputText = tester.widget(find.text('input text'));
|
||||||
expect(inputText.style.color, hoveredColor);
|
expect(inputText.style.color, hoveredColor);
|
||||||
|
|
||||||
// On pressed.
|
// On pressed.
|
||||||
await gesture.down(tester.getCenter(find.byType(SearchBar)));
|
await gesture.down(tester.getCenter(find.byType(SearchBar)));
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
await gesture.removePointer();
|
await gesture.removePointer();
|
||||||
expect(inputText.style.color, hoveredColor);
|
inputText = tester.widget(find.text('input text'));
|
||||||
|
expect(inputText.style.color, pressedColor);
|
||||||
|
|
||||||
// On focused.
|
// On focused.
|
||||||
await tester.tap(find.byType(SearchBar));
|
await tester.tap(find.byType(SearchBar));
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
expect(inputText.style.color, hoveredColor);
|
inputText = tester.widget(find.text('input text'));
|
||||||
|
expect(inputText.style.color, focusedColor);
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('hintStyle can override textStyle for hintText', (WidgetTester tester) async {
|
testWidgets('hintStyle can override textStyle for hintText', (WidgetTester tester) async {
|
||||||
@ -709,19 +691,21 @@ void main() {
|
|||||||
// On hovered.
|
// On hovered.
|
||||||
final TestGesture gesture = await _pointGestureToSearchBar(tester);
|
final TestGesture gesture = await _pointGestureToSearchBar(tester);
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
final Text helperText = tester.widget(find.text('hint text'));
|
Text helperText = tester.widget(find.text('hint text'));
|
||||||
expect(helperText.style?.color, hoveredColor);
|
expect(helperText.style?.color, hoveredColor);
|
||||||
|
|
||||||
// On pressed.
|
// On pressed.
|
||||||
await gesture.down(tester.getCenter(find.byType(SearchBar)));
|
await gesture.down(tester.getCenter(find.byType(SearchBar)));
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
await gesture.removePointer();
|
await gesture.removePointer();
|
||||||
expect(helperText.style?.color, hoveredColor);
|
helperText = tester.widget(find.text('hint text'));
|
||||||
|
expect(helperText.style?.color, pressedColor);
|
||||||
|
|
||||||
// On focused.
|
// On focused.
|
||||||
await tester.tap(find.byType(SearchBar));
|
await tester.tap(find.byType(SearchBar));
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
expect(helperText.style?.color, hoveredColor);
|
helperText = tester.widget(find.text('hint text'));
|
||||||
|
expect(helperText.style?.color, focusedColor);
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('The search view defaults', (WidgetTester tester) async {
|
testWidgets('The search view defaults', (WidgetTester tester) async {
|
||||||
@ -1761,6 +1745,161 @@ void main() {
|
|||||||
final Rect searchViewRect = tester.getRect(find.descendant(of: findViewContent(), matching: find.byType(SizedBox)).first);
|
final Rect searchViewRect = tester.getRect(find.descendant(of: findViewContent(), matching: find.byType(SizedBox)).first);
|
||||||
expect(searchViewRect.topLeft, equals(const Offset(rootSpacing, rootSpacing)));
|
expect(searchViewRect.topLeft, equals(const Offset(rootSpacing, rootSpacing)));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// regression tests for https://github.com/flutter/flutter/issues/126623
|
||||||
|
group('Overall InputDecorationTheme does not impact SearchBar and SearchView', () {
|
||||||
|
|
||||||
|
const InputDecorationTheme inputDecorationTheme = InputDecorationTheme(
|
||||||
|
focusColor: Colors.green,
|
||||||
|
hoverColor: Colors.blue,
|
||||||
|
outlineBorder: BorderSide(color: Colors.pink, width: 10),
|
||||||
|
isDense: true,
|
||||||
|
contentPadding: EdgeInsets.symmetric(horizontal: 20),
|
||||||
|
hintStyle: TextStyle(color: Colors.purpleAccent),
|
||||||
|
fillColor: Colors.tealAccent,
|
||||||
|
filled: true,
|
||||||
|
isCollapsed: true,
|
||||||
|
border: OutlineInputBorder(),
|
||||||
|
focusedBorder: UnderlineInputBorder(),
|
||||||
|
enabledBorder: UnderlineInputBorder(),
|
||||||
|
errorBorder: UnderlineInputBorder(),
|
||||||
|
focusedErrorBorder: UnderlineInputBorder(),
|
||||||
|
disabledBorder: UnderlineInputBorder(),
|
||||||
|
constraints: BoxConstraints(maxWidth: 300),
|
||||||
|
);
|
||||||
|
final ThemeData theme = ThemeData(
|
||||||
|
useMaterial3: true,
|
||||||
|
inputDecorationTheme: inputDecorationTheme
|
||||||
|
);
|
||||||
|
|
||||||
|
void checkDecorationInSearchBar(WidgetTester tester) {
|
||||||
|
final Finder textField = findTextField();
|
||||||
|
final InputDecoration? decoration = tester.widget<TextField>(textField).decoration;
|
||||||
|
|
||||||
|
expect(decoration?.border, InputBorder.none);
|
||||||
|
expect(decoration?.focusedBorder, InputBorder.none);
|
||||||
|
expect(decoration?.enabledBorder, InputBorder.none);
|
||||||
|
expect(decoration?.errorBorder, null);
|
||||||
|
expect(decoration?.focusedErrorBorder, null);
|
||||||
|
expect(decoration?.disabledBorder, null);
|
||||||
|
expect(decoration?.constraints, null);
|
||||||
|
expect(decoration?.isCollapsed, false);
|
||||||
|
expect(decoration?.filled, false);
|
||||||
|
expect(decoration?.fillColor, null);
|
||||||
|
expect(decoration?.focusColor, null);
|
||||||
|
expect(decoration?.hoverColor, null);
|
||||||
|
expect(decoration?.contentPadding, const EdgeInsets.fromLTRB(0.0, 12.0, 0.0, 12.0));
|
||||||
|
expect(decoration?.hintStyle?.color, theme.colorScheme.onSurfaceVariant);
|
||||||
|
}
|
||||||
|
|
||||||
|
testWidgets('Overall InputDecorationTheme does not override text field style'
|
||||||
|
' in SearchBar', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
theme: theme,
|
||||||
|
home: const Center(
|
||||||
|
child: Material(
|
||||||
|
child: SearchBar(hintText: 'hint text'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Check input decoration in `SearchBar`
|
||||||
|
checkDecorationInSearchBar(tester);
|
||||||
|
|
||||||
|
// Check search bar defaults.
|
||||||
|
final Finder searchBarMaterial = find.descendant(
|
||||||
|
of: find.byType(SearchBar),
|
||||||
|
matching: find.byType(Material),
|
||||||
|
);
|
||||||
|
|
||||||
|
final Material material = tester.widget<Material>(searchBarMaterial);
|
||||||
|
checkSearchBarDefaults(tester, theme.colorScheme, material);
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('Overall InputDecorationTheme does not override text field style'
|
||||||
|
' in the search view route', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
theme: theme,
|
||||||
|
home: Scaffold(
|
||||||
|
body: Material(
|
||||||
|
child: Align(
|
||||||
|
alignment: Alignment.topLeft,
|
||||||
|
child: SearchAnchor(
|
||||||
|
viewHintText: 'hint text',
|
||||||
|
builder: (BuildContext context, SearchController controller) {
|
||||||
|
return const Icon(Icons.search);
|
||||||
|
},
|
||||||
|
suggestionsBuilder: (BuildContext context, SearchController controller) {
|
||||||
|
return <Widget>[];
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
await tester.tap(find.byIcon(Icons.search));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
// Check input decoration in `SearchBar`
|
||||||
|
checkDecorationInSearchBar(tester);
|
||||||
|
|
||||||
|
// Check search bar defaults in search view route.
|
||||||
|
final Finder searchBarMaterial = find.descendant(
|
||||||
|
of: find.descendant(of: findViewContent(), matching: find.byType(SearchBar)),
|
||||||
|
matching: find.byType(Material),
|
||||||
|
).first;
|
||||||
|
|
||||||
|
final Material material = tester.widget<Material>(searchBarMaterial);
|
||||||
|
expect(material.color, Colors.transparent);
|
||||||
|
expect(material.elevation, 0.0);
|
||||||
|
final Text hintText = tester.widget(find.text('hint text'));
|
||||||
|
expect(hintText.style?.color, theme.colorScheme.onSurfaceVariant);
|
||||||
|
|
||||||
|
const String input = 'entered text';
|
||||||
|
await tester.enterText(find.byType(SearchBar), input);
|
||||||
|
final EditableText inputText = tester.widget(find.text(input));
|
||||||
|
expect(inputText.style.color, theme.colorScheme.onSurface);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> checkSearchBarDefaults(WidgetTester tester, ColorScheme colorScheme, Material material) async {
|
||||||
|
expect(material.animationDuration, const Duration(milliseconds: 200));
|
||||||
|
expect(material.borderOnForeground, true);
|
||||||
|
expect(material.borderRadius, null);
|
||||||
|
expect(material.clipBehavior, Clip.none);
|
||||||
|
expect(material.color, colorScheme.surface);
|
||||||
|
expect(material.elevation, 6.0);
|
||||||
|
expect(material.shadowColor, colorScheme.shadow);
|
||||||
|
expect(material.surfaceTintColor, colorScheme.surfaceTint);
|
||||||
|
expect(material.shape, const StadiumBorder());
|
||||||
|
|
||||||
|
final Text helperText = tester.widget(find.text('hint text'));
|
||||||
|
expect(helperText.style?.color, colorScheme.onSurfaceVariant);
|
||||||
|
expect(helperText.style?.fontSize, 16.0);
|
||||||
|
expect(helperText.style?.fontFamily, 'Roboto');
|
||||||
|
expect(helperText.style?.fontWeight, FontWeight.w400);
|
||||||
|
|
||||||
|
const String input = 'entered text';
|
||||||
|
await tester.enterText(find.byType(SearchBar), input);
|
||||||
|
final EditableText inputText = tester.widget(find.text(input));
|
||||||
|
expect(inputText.style.color, colorScheme.onSurface);
|
||||||
|
expect(inputText.style.fontSize, 16.0);
|
||||||
|
expect(helperText.style?.fontFamily, 'Roboto');
|
||||||
|
expect(inputText.style.fontWeight, FontWeight.w400);
|
||||||
|
}
|
||||||
|
|
||||||
|
Finder findTextField() {
|
||||||
|
return find.descendant(
|
||||||
|
of: find.byType(SearchBar),
|
||||||
|
matching: find.byType(TextField)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TextStyle? _iconStyle(WidgetTester tester, IconData icon) {
|
TextStyle? _iconStyle(WidgetTester tester, IconData icon) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user