Commit c9cefbf0 authored by Michael Goderbauer's avatar Michael Goderbauer Committed by GitHub

Properly update semantics when Material/Cupertino Sliders are disabled (#11776)

* Properly update semantics when Material/Cupertino Slider are disabled

* whitespace fix

* fix style
parent 0de87bab
......@@ -190,12 +190,13 @@ class _RenderCupertinoSlider extends RenderConstrainedBox implements SemanticsAc
@required double value,
int divisions,
Color activeColor,
this.onChanged,
ValueChanged<double> onChanged,
TickerProvider vsync,
}) : assert(value != null && value >= 0.0 && value <= 1.0),
_value = value,
_divisions = divisions,
_activeColor = activeColor,
_onChanged = onChanged,
super(additionalConstraints: const BoxConstraints.tightFor(width: _kSliderWidth, height: _kSliderHeight)) {
_drag = new HorizontalDragGestureRecognizer()
..onStart = _handleDragStart
......@@ -239,7 +240,16 @@ class _RenderCupertinoSlider extends RenderConstrainedBox implements SemanticsAc
markNeedsPaint();
}
ValueChanged<double> onChanged;
ValueChanged<double> get onChanged => _onChanged;
ValueChanged<double> _onChanged;
set onChanged(ValueChanged<double> value) {
if (value == _onChanged)
return;
final bool wasInteractive = isInteractive;
_onChanged = value;
if (wasInteractive != isInteractive)
markNeedsSemanticsUpdate(noGeometry: true);
}
AnimationController _position;
......
......@@ -288,7 +288,7 @@ class _RenderSlider extends RenderBox implements SemanticsActionHandler {
Color inactiveColor,
bool thumbOpenAtMin,
TextTheme textTheme,
this.onChanged,
ValueChanged<double> onChanged,
TickerProvider vsync,
}) : assert(value != null && value >= 0.0 && value <= 1.0),
_value = value,
......@@ -296,7 +296,8 @@ class _RenderSlider extends RenderBox implements SemanticsActionHandler {
_activeColor = activeColor,
_inactiveColor = inactiveColor,
_thumbOpenAtMin = thumbOpenAtMin,
_textTheme = textTheme {
_textTheme = textTheme,
_onChanged = onChanged {
this.label = label;
final GestureArenaTeam team = new GestureArenaTeam();
_drag = new HorizontalDragGestureRecognizer()
......@@ -401,7 +402,18 @@ class _RenderSlider extends RenderBox implements SemanticsActionHandler {
markNeedsPaint();
}
ValueChanged<double> onChanged;
ValueChanged<double> get onChanged => _onChanged;
ValueChanged<double> _onChanged;
set onChanged(ValueChanged<double> value) {
if (value == _onChanged)
return;
final bool wasInteractive = isInteractive;
_onChanged = value;
if (wasInteractive != isInteractive) {
markNeedsPaint();
markNeedsSemanticsUpdate(noGeometry: true);
}
}
double get _trackLength => size.width - 2.0 * _kReactionRadius;
......
......@@ -4,9 +4,12 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_test/flutter_test.dart';
import '../widgets/semantics_tester.dart';
void main() {
testWidgets('Slider does not move when tapped', (WidgetTester tester) async {
final Key sliderKey = new UniqueKey();
......@@ -77,4 +80,44 @@ void main() {
// that no animation is running.
expect(SchedulerBinding.instance.transientCallbackCount, equals(0));
});
testWidgets('Slider Semantics', (WidgetTester tester) async {
final SemanticsTester semantics = new SemanticsTester(tester);
await tester.pumpWidget(
new CupertinoSlider(
value: 0.5,
onChanged: (double v) {},
),
);
expect(semantics, hasSemantics(
new TestSemantics.root(
children: <TestSemantics>[
new TestSemantics.rootChild(
id: 1,
actions: SemanticsAction.decrease.index | SemanticsAction.increase.index,
),
]
),
ignoreRect: true,
ignoreTransform: true,
));
// Disable slider
await tester.pumpWidget(
new CupertinoSlider(
value: 0.5,
onChanged: null,
),
);
expect(semantics, hasSemantics(
new TestSemantics.root(),
ignoreRect: true,
ignoreTransform: true,
));
semantics.dispose();
});
}
......@@ -2,11 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_test/flutter_test.dart';
import '../rendering/mock_canvas.dart';
import '../widgets/semantics_tester.dart';
void main() {
testWidgets('Slider can move when tapped', (WidgetTester tester) async {
......@@ -295,4 +299,48 @@ void main() {
));
expect(tester.renderObject<RenderBox>(find.byType(Slider)).size, const Size(144.0 + 2.0 * 16.0, 32.0));
});
testWidgets('Slider Semantics', (WidgetTester tester) async {
final SemanticsTester semantics = new SemanticsTester(tester);
await tester.pumpWidget(
new Material(
child: new Slider(
value: 0.5,
onChanged: (double v) {},
),
),
);
expect(semantics, hasSemantics(
new TestSemantics.root(
children: <TestSemantics>[
new TestSemantics.rootChild(
id: 1,
actions: SemanticsAction.decrease.index | SemanticsAction.increase.index,
),
]
),
ignoreRect: true,
ignoreTransform: true,
));
// Disable slider
await tester.pumpWidget(
new Material(
child: new Slider(
value: 0.5,
onChanged: null,
),
),
);
expect(semantics, hasSemantics(
new TestSemantics.root(),
ignoreRect: true,
ignoreTransform: true,
));
semantics.dispose();
});
}
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