Fix animate to curve argument (#96627)

* copied over changes from

* copied over changes from
This commit is contained in:
Casey Rogers 2022-01-18 16:11:25 -05:00 committed by GitHub
parent b17a531d5e
commit f12c83ea3e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 2 deletions

View file

@ -117,7 +117,7 @@ class DraggableScrollableController extends ChangeNotifier {
animationController.stop();
}
});
CurvedAnimation(parent: animationController, curve: curve).addListener(() {
animationController.addListener(() {
_attachedController!.extent.updateSize(
animationController.value,
_attachedController!.position.context.notificationContext!,
@ -128,7 +128,7 @@ class DraggableScrollableController extends ChangeNotifier {
animationController.stop(canceled: false);
}
});
await animationController.animateTo(size, duration: duration);
await animationController.animateTo(size, duration: duration, curve: curve);
}
/// Jumps the attached sheet from its current size to the given [size], a

View file

@ -785,6 +785,53 @@ void main() {
});
}
testWidgets('Can animateTo with a nonlinear curve', (WidgetTester tester) async {
const Key stackKey = ValueKey<String>('stack');
const Key containerKey = ValueKey<String>('container');
final DraggableScrollableController controller = DraggableScrollableController();
await tester.pumpWidget(_boilerplate(
null,
controller: controller,
stackKey: stackKey,
containerKey: containerKey,
));
await tester.pumpAndSettle();
final double screenHeight = tester.getSize(find.byKey(stackKey)).height;
controller.animateTo(.6, curve: Curves.linear, duration: const Duration(milliseconds: 100));
// We need to call one pump first to get the animation to start.
await tester.pump();
await tester.pump(const Duration(milliseconds: 50));
expect(
tester.getSize(find.byKey(containerKey)).height / screenHeight,
closeTo(.55, precisionErrorTolerance),
);
await tester.pumpAndSettle();
expect(
tester.getSize(find.byKey(containerKey)).height / screenHeight,
closeTo(.6, precisionErrorTolerance),
);
controller.animateTo(.7, curve: const Interval(.5, 1), duration: const Duration(milliseconds: 100));
await tester.pump();
await tester.pump(const Duration(milliseconds: 50));
// The curve should result in the sheet not moving for the first 50 ms.
expect(
tester.getSize(find.byKey(containerKey)).height / screenHeight,
closeTo(.6, precisionErrorTolerance),
);
await tester.pump(const Duration(milliseconds: 25));
expect(
tester.getSize(find.byKey(containerKey)).height / screenHeight,
closeTo(.65, precisionErrorTolerance),
);
await tester.pumpAndSettle();
expect(
tester.getSize(find.byKey(containerKey)).height / screenHeight,
closeTo(.7, precisionErrorTolerance),
);
});
testWidgets('Can reuse a controller after the old controller is disposed', (WidgetTester tester) async {
const Key stackKey = ValueKey<String>('stack');
const Key containerKey = ValueKey<String>('container');