Stopped all animation controllers after toggleable has been detached. (#57809)
This commit is contained in:
parent
2054f37aaf
commit
7f65c6a8c6
1
AUTHORS
1
AUTHORS
@ -56,4 +56,5 @@ Michael Lee <ckmichael8@gmail.com>
|
||||
Katarina Sheremet <katarina@sheremet.ch>
|
||||
Nicolas Schneider <nioncode+git@gmail.com>
|
||||
Mikhail Zotyev <mbixjkee1392@gmail.com>
|
||||
Maria Melnik <melnikmk@gmail.com>
|
||||
Ayush Bherwani <ayush.bherwani1998@gmail.com>
|
||||
|
@ -391,6 +391,8 @@ abstract class RenderToggleable extends RenderConstrainedBox {
|
||||
void detach() {
|
||||
_positionController.stop();
|
||||
_reactionController.stop();
|
||||
_reactionHoverFadeController.stop();
|
||||
_reactionFocusFadeController.stop();
|
||||
super.detach();
|
||||
}
|
||||
|
||||
|
@ -603,6 +603,60 @@ void main() {
|
||||
expect(box.size, equals(const Size(60, 36)));
|
||||
});
|
||||
|
||||
testWidgets('Checkbox stops hover animation when removed from the tree.', (WidgetTester tester) async {
|
||||
const Key checkboxKey = Key('checkbox');
|
||||
bool checkboxVal = true;
|
||||
|
||||
await tester.pumpWidget(
|
||||
Theme(
|
||||
data: ThemeData(materialTapTargetSize: MaterialTapTargetSize.padded),
|
||||
child: Directionality(
|
||||
textDirection: TextDirection.ltr,
|
||||
child: Material(
|
||||
child: Center(
|
||||
child: StatefulBuilder(
|
||||
builder: (_, StateSetter setState) => Checkbox(
|
||||
key: checkboxKey,
|
||||
value: checkboxVal,
|
||||
onChanged: (bool newValue) => setState(() {checkboxVal = newValue;}),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
expect(find.byKey(checkboxKey), findsOneWidget);
|
||||
final Offset checkboxCenter = tester.getCenter(find.byKey(checkboxKey));
|
||||
final TestGesture testGesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
|
||||
await testGesture.moveTo(checkboxCenter);
|
||||
|
||||
await tester.pump(); // start animation
|
||||
await tester.pump(const Duration(milliseconds: 25)); // hover animation duration is 50 ms. It is half-way.
|
||||
|
||||
await tester.pumpWidget(
|
||||
Theme(
|
||||
data: ThemeData(materialTapTargetSize: MaterialTapTargetSize.padded),
|
||||
child: Directionality(
|
||||
textDirection: TextDirection.ltr,
|
||||
child: Material(
|
||||
child: Center(
|
||||
child: Container(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// Hover animation should not trigger an exception when the checkbox is removed
|
||||
// before the hover animation should complete.
|
||||
expect(tester.takeException(), isNull);
|
||||
|
||||
await testGesture.removePointer();
|
||||
});
|
||||
|
||||
|
||||
testWidgets('Checkbox changes mouse cursor when hovered', (WidgetTester tester) async {
|
||||
// Test Checkbox() constructor
|
||||
await tester.pumpWidget(
|
||||
|
Loading…
x
Reference in New Issue
Block a user