mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
This reverts commit 8473da22cd
.
This commit is contained in:
parent
29422d25fe
commit
d2af134578
@ -821,11 +821,22 @@ class _SliderState extends State<Slider> with TickerProviderStateMixin {
|
|||||||
// in range_slider.dart.
|
// in range_slider.dart.
|
||||||
Size screenSize() => MediaQuery.of(context).size;
|
Size screenSize() => MediaQuery.of(context).size;
|
||||||
|
|
||||||
void handleDidGainAccessibilityFocus() {
|
VoidCallback? handleDidGainAccessibilityFocus;
|
||||||
|
switch (theme.platform) {
|
||||||
|
case TargetPlatform.android:
|
||||||
|
case TargetPlatform.fuchsia:
|
||||||
|
case TargetPlatform.iOS:
|
||||||
|
case TargetPlatform.linux:
|
||||||
|
case TargetPlatform.macOS:
|
||||||
|
break;
|
||||||
|
case TargetPlatform.windows:
|
||||||
|
handleDidGainAccessibilityFocus = () {
|
||||||
// Automatically activate the slider when it receives a11y focus.
|
// Automatically activate the slider when it receives a11y focus.
|
||||||
if (!focusNode.hasFocus && focusNode.canRequestFocus) {
|
if (!focusNode.hasFocus && focusNode.canRequestFocus) {
|
||||||
focusNode.requestFocus();
|
focusNode.requestFocus();
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Map<ShortcutActivator, Intent> shortcutMap;
|
final Map<ShortcutActivator, Intent> shortcutMap;
|
||||||
@ -846,7 +857,11 @@ class _SliderState extends State<Slider> with TickerProviderStateMixin {
|
|||||||
? math.min(MediaQuery.of(context).textScaleFactor, 1.3)
|
? math.min(MediaQuery.of(context).textScaleFactor, 1.3)
|
||||||
: MediaQuery.of(context).textScaleFactor;
|
: MediaQuery.of(context).textScaleFactor;
|
||||||
|
|
||||||
return FocusableActionDetector(
|
return Semantics(
|
||||||
|
container: true,
|
||||||
|
slider: true,
|
||||||
|
onDidGainAccessibilityFocus: handleDidGainAccessibilityFocus,
|
||||||
|
child: FocusableActionDetector(
|
||||||
actions: _actionMap,
|
actions: _actionMap,
|
||||||
shortcuts: shortcutMap,
|
shortcuts: shortcutMap,
|
||||||
focusNode: focusNode,
|
focusNode: focusNode,
|
||||||
@ -855,7 +870,6 @@ class _SliderState extends State<Slider> with TickerProviderStateMixin {
|
|||||||
onShowFocusHighlight: _handleFocusHighlightChanged,
|
onShowFocusHighlight: _handleFocusHighlightChanged,
|
||||||
onShowHoverHighlight: _handleHoverChanged,
|
onShowHoverHighlight: _handleHoverChanged,
|
||||||
mouseCursor: effectiveMouseCursor,
|
mouseCursor: effectiveMouseCursor,
|
||||||
includeFocusSemantics: false,
|
|
||||||
child: CompositedTransformTarget(
|
child: CompositedTransformTarget(
|
||||||
link: _layerLink,
|
link: _layerLink,
|
||||||
child: _SliderRenderObjectWidget(
|
child: _SliderRenderObjectWidget(
|
||||||
@ -872,11 +886,11 @@ class _SliderState extends State<Slider> with TickerProviderStateMixin {
|
|||||||
onChangeEnd: _handleDragEnd,
|
onChangeEnd: _handleDragEnd,
|
||||||
state: this,
|
state: this,
|
||||||
semanticFormatterCallback: widget.semanticFormatterCallback,
|
semanticFormatterCallback: widget.semanticFormatterCallback,
|
||||||
onDidGainAccessibilityFocus: handleDidGainAccessibilityFocus,
|
|
||||||
hasFocus: _focused,
|
hasFocus: _focused,
|
||||||
hovering: _hovering,
|
hovering: _hovering,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -935,7 +949,6 @@ class _SliderRenderObjectWidget extends LeafRenderObjectWidget {
|
|||||||
required this.onChangeEnd,
|
required this.onChangeEnd,
|
||||||
required this.state,
|
required this.state,
|
||||||
required this.semanticFormatterCallback,
|
required this.semanticFormatterCallback,
|
||||||
required this.onDidGainAccessibilityFocus,
|
|
||||||
required this.hasFocus,
|
required this.hasFocus,
|
||||||
required this.hovering,
|
required this.hovering,
|
||||||
});
|
});
|
||||||
@ -951,7 +964,6 @@ class _SliderRenderObjectWidget extends LeafRenderObjectWidget {
|
|||||||
final ValueChanged<double>? onChangeStart;
|
final ValueChanged<double>? onChangeStart;
|
||||||
final ValueChanged<double>? onChangeEnd;
|
final ValueChanged<double>? onChangeEnd;
|
||||||
final SemanticFormatterCallback? semanticFormatterCallback;
|
final SemanticFormatterCallback? semanticFormatterCallback;
|
||||||
final VoidCallback? onDidGainAccessibilityFocus;
|
|
||||||
final _SliderState state;
|
final _SliderState state;
|
||||||
final bool hasFocus;
|
final bool hasFocus;
|
||||||
final bool hovering;
|
final bool hovering;
|
||||||
@ -972,7 +984,6 @@ class _SliderRenderObjectWidget extends LeafRenderObjectWidget {
|
|||||||
state: state,
|
state: state,
|
||||||
textDirection: Directionality.of(context),
|
textDirection: Directionality.of(context),
|
||||||
semanticFormatterCallback: semanticFormatterCallback,
|
semanticFormatterCallback: semanticFormatterCallback,
|
||||||
onDidGainAccessibilityFocus: onDidGainAccessibilityFocus,
|
|
||||||
platform: Theme.of(context).platform,
|
platform: Theme.of(context).platform,
|
||||||
hasFocus: hasFocus,
|
hasFocus: hasFocus,
|
||||||
hovering: hovering,
|
hovering: hovering,
|
||||||
@ -997,7 +1008,6 @@ class _SliderRenderObjectWidget extends LeafRenderObjectWidget {
|
|||||||
..onChangeEnd = onChangeEnd
|
..onChangeEnd = onChangeEnd
|
||||||
..textDirection = Directionality.of(context)
|
..textDirection = Directionality.of(context)
|
||||||
..semanticFormatterCallback = semanticFormatterCallback
|
..semanticFormatterCallback = semanticFormatterCallback
|
||||||
..onDidGainAccessibilityFocus = onDidGainAccessibilityFocus
|
|
||||||
..platform = Theme.of(context).platform
|
..platform = Theme.of(context).platform
|
||||||
..hasFocus = hasFocus
|
..hasFocus = hasFocus
|
||||||
..hovering = hovering
|
..hovering = hovering
|
||||||
@ -1019,7 +1029,6 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
required TargetPlatform platform,
|
required TargetPlatform platform,
|
||||||
required ValueChanged<double>? onChanged,
|
required ValueChanged<double>? onChanged,
|
||||||
required SemanticFormatterCallback? semanticFormatterCallback,
|
required SemanticFormatterCallback? semanticFormatterCallback,
|
||||||
required this.onDidGainAccessibilityFocus,
|
|
||||||
required this.onChangeStart,
|
required this.onChangeStart,
|
||||||
required this.onChangeEnd,
|
required this.onChangeEnd,
|
||||||
required _SliderState state,
|
required _SliderState state,
|
||||||
@ -1105,7 +1114,6 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
bool _active = false;
|
bool _active = false;
|
||||||
double _currentDragValue = 0.0;
|
double _currentDragValue = 0.0;
|
||||||
Rect? overlayRect;
|
Rect? overlayRect;
|
||||||
late Offset _thumbCenter;
|
|
||||||
|
|
||||||
// This rect is used in gesture calculations, where the gesture coordinates
|
// This rect is used in gesture calculations, where the gesture coordinates
|
||||||
// are relative to the sliders origin. Therefore, the offset is passed as
|
// are relative to the sliders origin. Therefore, the offset is passed as
|
||||||
@ -1251,7 +1259,6 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VoidCallback? onDidGainAccessibilityFocus;
|
|
||||||
ValueChanged<double>? onChangeStart;
|
ValueChanged<double>? onChangeStart;
|
||||||
ValueChanged<double>? onChangeEnd;
|
ValueChanged<double>? onChangeEnd;
|
||||||
|
|
||||||
@ -1575,10 +1582,10 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
sliderTheme: _sliderTheme,
|
sliderTheme: _sliderTheme,
|
||||||
isDiscrete: isDiscrete,
|
isDiscrete: isDiscrete,
|
||||||
);
|
);
|
||||||
_thumbCenter = Offset(trackRect.left + visualPosition * trackRect.width, trackRect.center.dy);
|
final Offset thumbCenter = Offset(trackRect.left + visualPosition * trackRect.width, trackRect.center.dy);
|
||||||
if (isInteractive) {
|
if (isInteractive) {
|
||||||
final Size overlaySize = sliderTheme.overlayShape!.getPreferredSize(isInteractive, false);
|
final Size overlaySize = sliderTheme.overlayShape!.getPreferredSize(isInteractive, false);
|
||||||
overlayRect = Rect.fromCircle(center: _thumbCenter, radius: overlaySize.width / 2.0);
|
overlayRect = Rect.fromCircle(center: thumbCenter, radius: overlaySize.width / 2.0);
|
||||||
}
|
}
|
||||||
final Offset? secondaryOffset = (secondaryVisualPosition != null) ? Offset(trackRect.left + secondaryVisualPosition * trackRect.width, trackRect.center.dy) : null;
|
final Offset? secondaryOffset = (secondaryVisualPosition != null) ? Offset(trackRect.left + secondaryVisualPosition * trackRect.width, trackRect.center.dy) : null;
|
||||||
|
|
||||||
@ -1589,7 +1596,7 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
sliderTheme: _sliderTheme,
|
sliderTheme: _sliderTheme,
|
||||||
enableAnimation: _enableAnimation,
|
enableAnimation: _enableAnimation,
|
||||||
textDirection: _textDirection,
|
textDirection: _textDirection,
|
||||||
thumbCenter: _thumbCenter,
|
thumbCenter: thumbCenter,
|
||||||
secondaryOffset: secondaryOffset,
|
secondaryOffset: secondaryOffset,
|
||||||
isDiscrete: isDiscrete,
|
isDiscrete: isDiscrete,
|
||||||
isEnabled: isInteractive,
|
isEnabled: isInteractive,
|
||||||
@ -1598,7 +1605,7 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
if (!_overlayAnimation.isDismissed) {
|
if (!_overlayAnimation.isDismissed) {
|
||||||
_sliderTheme.overlayShape!.paint(
|
_sliderTheme.overlayShape!.paint(
|
||||||
context,
|
context,
|
||||||
_thumbCenter,
|
thumbCenter,
|
||||||
activationAnimation: _overlayAnimation,
|
activationAnimation: _overlayAnimation,
|
||||||
enableAnimation: _enableAnimation,
|
enableAnimation: _enableAnimation,
|
||||||
isDiscrete: isDiscrete,
|
isDiscrete: isDiscrete,
|
||||||
@ -1635,7 +1642,7 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
sliderTheme: _sliderTheme,
|
sliderTheme: _sliderTheme,
|
||||||
enableAnimation: _enableAnimation,
|
enableAnimation: _enableAnimation,
|
||||||
textDirection: _textDirection,
|
textDirection: _textDirection,
|
||||||
thumbCenter: _thumbCenter,
|
thumbCenter: thumbCenter,
|
||||||
isEnabled: isInteractive,
|
isEnabled: isInteractive,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1648,7 +1655,7 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
if (attached) {
|
if (attached) {
|
||||||
_sliderTheme.valueIndicatorShape!.paint(
|
_sliderTheme.valueIndicatorShape!.paint(
|
||||||
context,
|
context,
|
||||||
offset + _thumbCenter,
|
offset + thumbCenter,
|
||||||
activationAnimation: _valueIndicatorAnimation,
|
activationAnimation: _valueIndicatorAnimation,
|
||||||
enableAnimation: _enableAnimation,
|
enableAnimation: _enableAnimation,
|
||||||
isDiscrete: isDiscrete,
|
isDiscrete: isDiscrete,
|
||||||
@ -1667,7 +1674,7 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
|
|
||||||
_sliderTheme.thumbShape!.paint(
|
_sliderTheme.thumbShape!.paint(
|
||||||
context,
|
context,
|
||||||
_thumbCenter,
|
thumbCenter,
|
||||||
activationAnimation: _overlayAnimation,
|
activationAnimation: _overlayAnimation,
|
||||||
enableAnimation: _enableAnimation,
|
enableAnimation: _enableAnimation,
|
||||||
isDiscrete: isDiscrete,
|
isDiscrete: isDiscrete,
|
||||||
@ -1681,23 +1688,12 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
void assembleSemanticsNode(SemanticsNode node, SemanticsConfiguration config, Iterable<SemanticsNode> children) {
|
|
||||||
node.rect = Rect.fromCenter(
|
|
||||||
center: _thumbCenter,
|
|
||||||
width: kMinInteractiveDimension,
|
|
||||||
height: kMinInteractiveDimension,
|
|
||||||
);
|
|
||||||
|
|
||||||
node.updateWith(config: config);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void describeSemanticsConfiguration(SemanticsConfiguration config) {
|
void describeSemanticsConfiguration(SemanticsConfiguration config) {
|
||||||
super.describeSemanticsConfiguration(config);
|
super.describeSemanticsConfiguration(config);
|
||||||
|
|
||||||
// The Slider widget has its own Focus widget with semantics information,
|
// The Slider widget has its own Focus widget with semantics information,
|
||||||
// and want that semantics node to collect the semantics information here
|
// and we want that semantics node to collect the semantics information here
|
||||||
// so that it's all in the same node: otherwise Talkback sees that the node
|
// so that it's all in the same node: otherwise Talkback sees that the node
|
||||||
// has focusable children, and it won't focus the Slider's Focus widget
|
// has focusable children, and it won't focus the Slider's Focus widget
|
||||||
// because it thinks the Focus widget's node doesn't have anything to say
|
// because it thinks the Focus widget's node doesn't have anything to say
|
||||||
@ -1705,23 +1701,9 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
|
|||||||
// information into one node means that Talkback will recognize that it has
|
// information into one node means that Talkback will recognize that it has
|
||||||
// something to say and focus it when it receives keyboard focus.
|
// something to say and focus it when it receives keyboard focus.
|
||||||
// (See https://github.com/flutter/flutter/issues/57038 for context).
|
// (See https://github.com/flutter/flutter/issues/57038 for context).
|
||||||
config.isSemanticBoundary = true;
|
config.isSemanticBoundary = false;
|
||||||
|
|
||||||
config.isEnabled = isInteractive;
|
config.isEnabled = isInteractive;
|
||||||
config.isSlider = true;
|
|
||||||
config.isFocusable = isInteractive;
|
|
||||||
config.isFocused = hasFocus;
|
|
||||||
switch (_platform) {
|
|
||||||
case TargetPlatform.android:
|
|
||||||
case TargetPlatform.fuchsia:
|
|
||||||
case TargetPlatform.iOS:
|
|
||||||
case TargetPlatform.linux:
|
|
||||||
case TargetPlatform.macOS:
|
|
||||||
break;
|
|
||||||
case TargetPlatform.windows:
|
|
||||||
config.onDidGainAccessibilityFocus = onDidGainAccessibilityFocus;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
config.textDirection = textDirection;
|
config.textDirection = textDirection;
|
||||||
if (isInteractive) {
|
if (isInteractive) {
|
||||||
config.onIncrease = increaseAction;
|
config.onIncrease = increaseAction;
|
||||||
|
@ -15,6 +15,7 @@ import 'package:flutter/src/physics/utils.dart' show nearEqual;
|
|||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
||||||
import '../rendering/mock_canvas.dart';
|
import '../rendering/mock_canvas.dart';
|
||||||
|
import '../widgets/semantics_tester.dart';
|
||||||
|
|
||||||
// A thumb shape that also logs its repaint center.
|
// A thumb shape that also logs its repaint center.
|
||||||
class LoggingThumbShape extends SliderComponentShape {
|
class LoggingThumbShape extends SliderComponentShape {
|
||||||
@ -1147,6 +1148,8 @@ void main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('Slider Semantics', (WidgetTester tester) async {
|
testWidgets('Slider Semantics', (WidgetTester tester) async {
|
||||||
|
final SemanticsTester semantics = SemanticsTester(tester);
|
||||||
|
|
||||||
await tester.pumpWidget(MaterialApp(
|
await tester.pumpWidget(MaterialApp(
|
||||||
home: Directionality(
|
home: Directionality(
|
||||||
textDirection: TextDirection.ltr,
|
textDirection: TextDirection.ltr,
|
||||||
@ -1161,18 +1164,34 @@ void main() {
|
|||||||
|
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
SemanticsNode semanticsNode = tester.getSemantics(find.byType(Slider));
|
|
||||||
expect(
|
expect(
|
||||||
semanticsNode,
|
semantics,
|
||||||
matchesSemantics(
|
hasSemantics(
|
||||||
children: <Matcher>[
|
TestSemantics.root(
|
||||||
matchesSemantics(
|
children: <TestSemantics>[
|
||||||
isEnabled: true,
|
TestSemantics(
|
||||||
isSlider: true,
|
id: 1,
|
||||||
isFocusable: true,
|
textDirection: TextDirection.ltr,
|
||||||
hasEnabledState: true,
|
children: <TestSemantics>[
|
||||||
hasIncreaseAction: true,
|
TestSemantics(
|
||||||
hasDecreaseAction: true,
|
id: 2,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 3,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 4,
|
||||||
|
flags: <SemanticsFlag>[
|
||||||
|
SemanticsFlag.hasEnabledState,
|
||||||
|
SemanticsFlag.isEnabled,
|
||||||
|
SemanticsFlag.isFocusable,
|
||||||
|
SemanticsFlag.isSlider,
|
||||||
|
],
|
||||||
|
actions: <SemanticsAction>[
|
||||||
|
SemanticsAction.increase,
|
||||||
|
SemanticsAction.decrease,
|
||||||
|
],
|
||||||
value: '50%',
|
value: '50%',
|
||||||
increasedValue: '55%',
|
increasedValue: '55%',
|
||||||
decreasedValue: '45%',
|
decreasedValue: '45%',
|
||||||
@ -1180,6 +1199,15 @@ void main() {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Disable slider
|
// Disable slider
|
||||||
@ -1195,16 +1223,30 @@ void main() {
|
|||||||
),
|
),
|
||||||
));
|
));
|
||||||
|
|
||||||
await tester.pump();
|
|
||||||
semanticsNode = tester.getSemantics(find.byType(Slider));
|
|
||||||
expect(
|
expect(
|
||||||
semanticsNode,
|
semantics,
|
||||||
matchesSemantics(
|
hasSemantics(
|
||||||
scopesRoute: true,
|
TestSemantics.root(
|
||||||
children: <Matcher>[
|
children: <TestSemantics>[
|
||||||
matchesSemantics(
|
TestSemantics(
|
||||||
isSlider: true,
|
id: 1,
|
||||||
hasEnabledState: true,
|
textDirection: TextDirection.ltr,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 2,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 3,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 4,
|
||||||
|
flags: <SemanticsFlag>[
|
||||||
|
SemanticsFlag.hasEnabledState,
|
||||||
|
// isFocusable is delayed by 1 frame.
|
||||||
|
SemanticsFlag.isFocusable,
|
||||||
|
SemanticsFlag.isSlider,
|
||||||
|
],
|
||||||
value: '50%',
|
value: '50%',
|
||||||
increasedValue: '55%',
|
increasedValue: '55%',
|
||||||
decreasedValue: '45%',
|
decreasedValue: '45%',
|
||||||
@ -1212,10 +1254,64 @@ void main() {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
await tester.pump();
|
||||||
|
expect(
|
||||||
|
semantics,
|
||||||
|
hasSemantics(
|
||||||
|
TestSemantics.root(
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 1,
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 2,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 3,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 4,
|
||||||
|
flags: <SemanticsFlag>[
|
||||||
|
SemanticsFlag.hasEnabledState,
|
||||||
|
SemanticsFlag.isSlider,
|
||||||
|
],
|
||||||
|
value: '50%',
|
||||||
|
increasedValue: '55%',
|
||||||
|
decreasedValue: '45%',
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
semantics.dispose();
|
||||||
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android, TargetPlatform.fuchsia, TargetPlatform.linux }));
|
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android, TargetPlatform.fuchsia, TargetPlatform.linux }));
|
||||||
|
|
||||||
testWidgets('Slider Semantics', (WidgetTester tester) async {
|
testWidgets('Slider Semantics', (WidgetTester tester) async {
|
||||||
|
final SemanticsTester semantics = SemanticsTester(tester);
|
||||||
|
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
MaterialApp(
|
MaterialApp(
|
||||||
home: Theme(
|
home: Theme(
|
||||||
@ -1234,20 +1330,26 @@ void main() {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
SemanticsNode semanticsNode = tester.getSemantics(find.byType(Slider));
|
|
||||||
expect(
|
expect(
|
||||||
semanticsNode,
|
semantics,
|
||||||
matchesSemantics(
|
hasSemantics(
|
||||||
children: <Matcher>[
|
TestSemantics.root(
|
||||||
matchesSemantics(
|
children: <TestSemantics>[
|
||||||
isEnabled: true,
|
TestSemantics(
|
||||||
isSlider: true,
|
id: 1,
|
||||||
isFocusable: true,
|
textDirection: TextDirection.ltr,
|
||||||
hasEnabledState: true,
|
children: <TestSemantics>[
|
||||||
hasIncreaseAction: true,
|
TestSemantics(
|
||||||
hasDecreaseAction: true,
|
id: 2,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 3,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 4,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocusable, SemanticsFlag.isSlider],
|
||||||
|
actions: <SemanticsAction>[SemanticsAction.increase, SemanticsAction.decrease],
|
||||||
value: '50%',
|
value: '50%',
|
||||||
increasedValue: '60%',
|
increasedValue: '60%',
|
||||||
decreasedValue: '40%',
|
decreasedValue: '40%',
|
||||||
@ -1255,6 +1357,15 @@ void main() {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Disable slider
|
// Disable slider
|
||||||
@ -1270,15 +1381,25 @@ void main() {
|
|||||||
),
|
),
|
||||||
));
|
));
|
||||||
|
|
||||||
semanticsNode = tester.getSemantics(find.byType(Slider));
|
|
||||||
expect(
|
expect(
|
||||||
semanticsNode,
|
semantics,
|
||||||
matchesSemantics(
|
hasSemantics(
|
||||||
scopesRoute: true,
|
TestSemantics.root(
|
||||||
children: <Matcher>[
|
children: <TestSemantics>[
|
||||||
matchesSemantics(
|
TestSemantics(
|
||||||
isSlider: true,
|
id: 1,
|
||||||
hasEnabledState: true,
|
textDirection: TextDirection.ltr,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 2,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 3,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 5,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.hasEnabledState, SemanticsFlag.isSlider],
|
||||||
value: '50%',
|
value: '50%',
|
||||||
increasedValue: '60%',
|
increasedValue: '60%',
|
||||||
decreasedValue: '40%',
|
decreasedValue: '40%',
|
||||||
@ -1286,10 +1407,22 @@ void main() {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
semantics.dispose();
|
||||||
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }));
|
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }));
|
||||||
|
|
||||||
testWidgets('Slider Semantics', (WidgetTester tester) async {
|
testWidgets('Slider Semantics', (WidgetTester tester) async {
|
||||||
|
final SemanticsTester semantics = SemanticsTester(tester);
|
||||||
|
|
||||||
await tester.pumpWidget(MaterialApp(
|
await tester.pumpWidget(MaterialApp(
|
||||||
home: Directionality(
|
home: Directionality(
|
||||||
textDirection: TextDirection.ltr,
|
textDirection: TextDirection.ltr,
|
||||||
@ -1304,19 +1437,35 @@ void main() {
|
|||||||
|
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
SemanticsNode semanticsNode = tester.getSemantics(find.byType(Slider));
|
|
||||||
expect(
|
expect(
|
||||||
semanticsNode,
|
semantics,
|
||||||
matchesSemantics(
|
hasSemantics(
|
||||||
children: <Matcher>[
|
TestSemantics.root(
|
||||||
matchesSemantics(
|
children: <TestSemantics>[
|
||||||
isEnabled: true,
|
TestSemantics(
|
||||||
isSlider: true,
|
id: 1,
|
||||||
isFocusable: true,
|
textDirection: TextDirection.ltr,
|
||||||
hasEnabledState: true,
|
children: <TestSemantics>[
|
||||||
hasIncreaseAction: true,
|
TestSemantics(
|
||||||
hasDecreaseAction: true,
|
id: 2,
|
||||||
hasDidGainAccessibilityFocusAction: true,
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 3,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 4,
|
||||||
|
flags: <SemanticsFlag>[
|
||||||
|
SemanticsFlag.hasEnabledState,
|
||||||
|
SemanticsFlag.isEnabled,
|
||||||
|
SemanticsFlag.isFocusable,
|
||||||
|
SemanticsFlag.isSlider,
|
||||||
|
],
|
||||||
|
actions: <SemanticsAction>[
|
||||||
|
SemanticsAction.increase,
|
||||||
|
SemanticsAction.decrease,
|
||||||
|
SemanticsAction.didGainAccessibilityFocus,
|
||||||
|
],
|
||||||
value: '50%',
|
value: '50%',
|
||||||
increasedValue: '55%',
|
increasedValue: '55%',
|
||||||
decreasedValue: '45%',
|
decreasedValue: '45%',
|
||||||
@ -1324,6 +1473,15 @@ void main() {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Disable slider
|
// Disable slider
|
||||||
@ -1339,17 +1497,33 @@ void main() {
|
|||||||
),
|
),
|
||||||
));
|
));
|
||||||
|
|
||||||
await tester.pump();
|
|
||||||
semanticsNode = tester.getSemantics(find.byType(Slider));
|
|
||||||
expect(
|
expect(
|
||||||
semanticsNode,
|
semantics,
|
||||||
matchesSemantics(
|
hasSemantics(
|
||||||
scopesRoute: true,
|
TestSemantics.root(
|
||||||
children: <Matcher>[
|
children: <TestSemantics>[
|
||||||
matchesSemantics(
|
TestSemantics(
|
||||||
isSlider: true,
|
id: 1,
|
||||||
hasEnabledState: true,
|
textDirection: TextDirection.ltr,
|
||||||
hasDidGainAccessibilityFocusAction: true,
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 2,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 3,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 4,
|
||||||
|
flags: <SemanticsFlag>[
|
||||||
|
SemanticsFlag.hasEnabledState,
|
||||||
|
// isFocusable is delayed by 1 frame.
|
||||||
|
SemanticsFlag.isFocusable,
|
||||||
|
SemanticsFlag.isSlider,
|
||||||
|
],
|
||||||
|
actions: <SemanticsAction>[
|
||||||
|
SemanticsAction.didGainAccessibilityFocus,
|
||||||
|
],
|
||||||
value: '50%',
|
value: '50%',
|
||||||
increasedValue: '55%',
|
increasedValue: '55%',
|
||||||
decreasedValue: '45%',
|
decreasedValue: '45%',
|
||||||
@ -1357,10 +1531,67 @@ void main() {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
await tester.pump();
|
||||||
|
expect(
|
||||||
|
semantics,
|
||||||
|
hasSemantics(
|
||||||
|
TestSemantics.root(
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 1,
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 2,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 3,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 4,
|
||||||
|
flags: <SemanticsFlag>[
|
||||||
|
SemanticsFlag.hasEnabledState,
|
||||||
|
SemanticsFlag.isSlider,
|
||||||
|
],
|
||||||
|
actions: <SemanticsAction>[
|
||||||
|
SemanticsAction.didGainAccessibilityFocus,
|
||||||
|
],
|
||||||
|
value: '50%',
|
||||||
|
increasedValue: '55%',
|
||||||
|
decreasedValue: '45%',
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
semantics.dispose();
|
||||||
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.windows }));
|
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.windows }));
|
||||||
|
|
||||||
testWidgets('Slider semantics with custom formatter', (WidgetTester tester) async {
|
testWidgets('Slider semantics with custom formatter', (WidgetTester tester) async {
|
||||||
|
final SemanticsTester semantics = SemanticsTester(tester);
|
||||||
|
|
||||||
await tester.pumpWidget(MaterialApp(
|
await tester.pumpWidget(MaterialApp(
|
||||||
home: Directionality(
|
home: Directionality(
|
||||||
textDirection: TextDirection.ltr,
|
textDirection: TextDirection.ltr,
|
||||||
@ -1376,20 +1607,26 @@ void main() {
|
|||||||
),
|
),
|
||||||
));
|
));
|
||||||
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
final SemanticsNode semanticsNode = tester.getSemantics(find.byType(Slider));
|
|
||||||
expect(
|
expect(
|
||||||
semanticsNode,
|
semantics,
|
||||||
matchesSemantics(
|
hasSemantics(
|
||||||
children: <Matcher>[
|
TestSemantics.root(
|
||||||
matchesSemantics(
|
children: <TestSemantics>[
|
||||||
isEnabled: true,
|
TestSemantics(
|
||||||
isSlider: true,
|
id: 1,
|
||||||
isFocusable: true,
|
textDirection: TextDirection.ltr,
|
||||||
hasEnabledState: true,
|
children: <TestSemantics>[
|
||||||
hasIncreaseAction: true,
|
TestSemantics(
|
||||||
hasDecreaseAction: true,
|
id: 2,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 3,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 4,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocusable, SemanticsFlag.isSlider],
|
||||||
|
actions: <SemanticsAction>[SemanticsAction.increase, SemanticsAction.decrease],
|
||||||
value: '40',
|
value: '40',
|
||||||
increasedValue: '60',
|
increasedValue: '60',
|
||||||
decreasedValue: '20',
|
decreasedValue: '20',
|
||||||
@ -1397,11 +1634,23 @@ void main() {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
semantics.dispose();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Regression test for https://github.com/flutter/flutter/issues/101868
|
// Regression test for https://github.com/flutter/flutter/issues/101868
|
||||||
testWidgets('Slider.label info should not write to semantic node', (WidgetTester tester) async {
|
testWidgets('Slider.label info should not write to semantic node', (WidgetTester tester) async {
|
||||||
|
final SemanticsTester semantics = SemanticsTester(tester);
|
||||||
|
|
||||||
await tester.pumpWidget(MaterialApp(
|
await tester.pumpWidget(MaterialApp(
|
||||||
home: Directionality(
|
home: Directionality(
|
||||||
textDirection: TextDirection.ltr,
|
textDirection: TextDirection.ltr,
|
||||||
@ -1418,20 +1667,26 @@ void main() {
|
|||||||
),
|
),
|
||||||
));
|
));
|
||||||
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
final SemanticsNode semanticsNode = tester.getSemantics(find.byType(Slider));
|
|
||||||
expect(
|
expect(
|
||||||
semanticsNode,
|
semantics,
|
||||||
matchesSemantics(
|
hasSemantics(
|
||||||
children: <Matcher>[
|
TestSemantics.root(
|
||||||
matchesSemantics(
|
children: <TestSemantics>[
|
||||||
isEnabled: true,
|
TestSemantics(
|
||||||
isSlider: true,
|
id: 1,
|
||||||
isFocusable: true,
|
textDirection: TextDirection.ltr,
|
||||||
hasEnabledState: true,
|
children: <TestSemantics>[
|
||||||
hasIncreaseAction: true,
|
TestSemantics(
|
||||||
hasDecreaseAction: true,
|
id: 2,
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 3,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 4,
|
||||||
|
flags: <SemanticsFlag>[SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocusable, SemanticsFlag.isSlider],
|
||||||
|
actions: <SemanticsAction>[SemanticsAction.increase, SemanticsAction.decrease],
|
||||||
value: '40',
|
value: '40',
|
||||||
increasedValue: '60',
|
increasedValue: '60',
|
||||||
decreasedValue: '20',
|
decreasedValue: '20',
|
||||||
@ -1439,7 +1694,17 @@ void main() {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
semantics.dispose();
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('Slider is focusable and has correct focus color', (WidgetTester tester) async {
|
testWidgets('Slider is focusable and has correct focus color', (WidgetTester tester) async {
|
||||||
@ -2111,6 +2376,7 @@ void main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('Slider gains keyboard focus when it gains semantics focus on Windows', (WidgetTester tester) async {
|
testWidgets('Slider gains keyboard focus when it gains semantics focus on Windows', (WidgetTester tester) async {
|
||||||
|
final SemanticsTester semantics = SemanticsTester(tester);
|
||||||
final SemanticsOwner semanticsOwner = tester.binding.pipelineOwner.semanticsOwner!;
|
final SemanticsOwner semanticsOwner = tester.binding.pipelineOwner.semanticsOwner!;
|
||||||
final FocusNode focusNode = FocusNode();
|
final FocusNode focusNode = FocusNode();
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
@ -2125,19 +2391,33 @@ void main() {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final SemanticsNode semanticsNode = tester.getSemantics(find.byType(Slider));
|
expect(semantics, hasSemantics(
|
||||||
expect(
|
TestSemantics.root(
|
||||||
semanticsNode,
|
children: <TestSemantics>[
|
||||||
matchesSemantics(
|
TestSemantics(
|
||||||
children: <Matcher>[
|
id: 1,
|
||||||
matchesSemantics(
|
textDirection: TextDirection.ltr,
|
||||||
isEnabled: true,
|
children: <TestSemantics>[
|
||||||
isSlider: true,
|
TestSemantics(
|
||||||
isFocusable: true,
|
id: 2,
|
||||||
hasEnabledState: true,
|
children: <TestSemantics>[
|
||||||
hasIncreaseAction: true,
|
TestSemantics(
|
||||||
hasDecreaseAction: true,
|
id: 3,
|
||||||
hasDidGainAccessibilityFocusAction: true,
|
flags: <SemanticsFlag>[SemanticsFlag.scopesRoute],
|
||||||
|
children: <TestSemantics>[
|
||||||
|
TestSemantics(
|
||||||
|
id: 4,
|
||||||
|
flags: <SemanticsFlag>[
|
||||||
|
SemanticsFlag.hasEnabledState,
|
||||||
|
SemanticsFlag.isEnabled,
|
||||||
|
SemanticsFlag.isFocusable,
|
||||||
|
SemanticsFlag.isSlider,
|
||||||
|
],
|
||||||
|
actions: <SemanticsAction>[
|
||||||
|
SemanticsAction.increase,
|
||||||
|
SemanticsAction.decrease,
|
||||||
|
SemanticsAction.didGainAccessibilityFocus,
|
||||||
|
],
|
||||||
value: '50%',
|
value: '50%',
|
||||||
increasedValue: '55%',
|
increasedValue: '55%',
|
||||||
decreasedValue: '45%',
|
decreasedValue: '45%',
|
||||||
@ -2145,12 +2425,21 @@ void main() {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
ignoreRect: true,
|
||||||
|
ignoreTransform: true,
|
||||||
|
));
|
||||||
|
|
||||||
expect(focusNode.hasFocus, isFalse);
|
expect(focusNode.hasFocus, isFalse);
|
||||||
semanticsOwner.performAction(5, SemanticsAction.didGainAccessibilityFocus);
|
semanticsOwner.performAction(4, SemanticsAction.didGainAccessibilityFocus);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
expect(focusNode.hasFocus, isTrue);
|
expect(focusNode.hasFocus, isTrue);
|
||||||
|
semantics.dispose();
|
||||||
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.windows }));
|
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.windows }));
|
||||||
|
|
||||||
testWidgets('Value indicator appears when it should', (WidgetTester tester) async {
|
testWidgets('Value indicator appears when it should', (WidgetTester tester) async {
|
||||||
|
@ -290,7 +290,7 @@ void main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('SemanticsDebugger slider', (WidgetTester tester) async {
|
testWidgets('SemanticsDebugger slider', (WidgetTester tester) async {
|
||||||
double value = 0.50;
|
double value = 0.75;
|
||||||
|
|
||||||
await tester.pumpWidget(
|
await tester.pumpWidget(
|
||||||
Directionality(
|
Directionality(
|
||||||
@ -322,7 +322,7 @@ void main() {
|
|||||||
// interpreted as a gesture by the semantics debugger and sent to the widget
|
// interpreted as a gesture by the semantics debugger and sent to the widget
|
||||||
// as a semantic action that always moves by 10% of the complete track.
|
// as a semantic action that always moves by 10% of the complete track.
|
||||||
await tester.fling(find.byType(Slider), const Offset(-100.0, 0.0), 2000.0, warnIfMissed: false); // hitting the debugger
|
await tester.fling(find.byType(Slider), const Offset(-100.0, 0.0), 2000.0, warnIfMissed: false); // hitting the debugger
|
||||||
expect(value, equals(0.45));
|
expect(value, equals(0.70));
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('SemanticsDebugger checkbox', (WidgetTester tester) async {
|
testWidgets('SemanticsDebugger checkbox', (WidgetTester tester) async {
|
||||||
|
@ -865,7 +865,7 @@ void main() {
|
|||||||
await tester.pumpWidget(const MaterialApp(home: _SemanticsTestWidget()));
|
await tester.pumpWidget(const MaterialApp(home: _SemanticsTestWidget()));
|
||||||
|
|
||||||
// We're expecting the traversal to start where the slider is.
|
// We're expecting the traversal to start where the slider is.
|
||||||
final List<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers]..removeRange(0, 7);
|
final List<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers]..removeRange(0, 8);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
tester.semantics.simulatedAccessibilityTraversal(start: find.byType(Slider)),
|
tester.semantics.simulatedAccessibilityTraversal(start: find.byType(Slider)),
|
||||||
@ -887,7 +887,7 @@ void main() {
|
|||||||
await tester.pumpWidget(const MaterialApp(home: _SemanticsTestWidget()));
|
await tester.pumpWidget(const MaterialApp(home: _SemanticsTestWidget()));
|
||||||
|
|
||||||
// We're expecting the traversal to end where the slider is, inclusive.
|
// We're expecting the traversal to end where the slider is, inclusive.
|
||||||
final Iterable<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers].getRange(0, 8);
|
final Iterable<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers].getRange(0, 9);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
tester.semantics.simulatedAccessibilityTraversal(end: find.byType(Slider)),
|
tester.semantics.simulatedAccessibilityTraversal(end: find.byType(Slider)),
|
||||||
@ -909,7 +909,7 @@ void main() {
|
|||||||
await tester.pumpWidget(const MaterialApp(home: _SemanticsTestWidget()));
|
await tester.pumpWidget(const MaterialApp(home: _SemanticsTestWidget()));
|
||||||
|
|
||||||
// We're expecting the traversal to start at the text field and end at the slider.
|
// We're expecting the traversal to start at the text field and end at the slider.
|
||||||
final Iterable<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers].getRange(1, 8);
|
final Iterable<Matcher> expectedMatchers = <Matcher>[...fullTraversalMatchers].getRange(1, 9);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
tester.semantics.simulatedAccessibilityTraversal(
|
tester.semantics.simulatedAccessibilityTraversal(
|
||||||
|
Loading…
Reference in New Issue
Block a user