Fix the maths for floating pinned app bars. (#11996)
This commit is contained in:
parent
35c47611b9
commit
da0602fe9b
@ -708,7 +708,6 @@ class SliverAppBar extends StatefulWidget {
|
|||||||
assert(primary != null),
|
assert(primary != null),
|
||||||
assert(floating != null),
|
assert(floating != null),
|
||||||
assert(pinned != null),
|
assert(pinned != null),
|
||||||
assert(!pinned || !floating || bottom != null, 'A pinned and floating app bar must have a bottom widget.'),
|
|
||||||
assert(snap != null),
|
assert(snap != null),
|
||||||
assert(floating || !snap, 'The "snap" argument only makes sense for floating app bars.'),
|
assert(floating || !snap, 'The "snap" argument only makes sense for floating app bars.'),
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
@ -512,7 +512,7 @@ abstract class RenderSliverFloatingPinnedPersistentHeader extends RenderSliverFl
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
double updateGeometry() {
|
double updateGeometry() {
|
||||||
final double minExtent = this.maxExtent;
|
final double minExtent = this.minExtent;
|
||||||
final double maxExtent = this.maxExtent;
|
final double maxExtent = this.maxExtent;
|
||||||
final double paintExtent = (maxExtent - _effectiveScrollOffset);
|
final double paintExtent = (maxExtent - _effectiveScrollOffset);
|
||||||
final double layoutExtent = (maxExtent - constraints.scrollOffset);
|
final double layoutExtent = (maxExtent - constraints.scrollOffset);
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
// Copyright 2016 The Chromium Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
testWidgets('Sliver appbars - floating and pinned - second app bar stacks below', (WidgetTester tester) async {
|
||||||
|
final ScrollController controller = new ScrollController();
|
||||||
|
await tester.pumpWidget(
|
||||||
|
new Directionality(
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
child: new MediaQuery(
|
||||||
|
data: const MediaQueryData(),
|
||||||
|
child: new CustomScrollView(
|
||||||
|
controller: controller,
|
||||||
|
slivers: <Widget>[
|
||||||
|
const SliverAppBar(floating: true, pinned: true, expandedHeight: 200.0, title: const Text('A')),
|
||||||
|
const SliverAppBar(primary: false, pinned: true, title: const Text('B')),
|
||||||
|
new SliverList(
|
||||||
|
delegate: new SliverChildListDelegate(
|
||||||
|
<Widget>[
|
||||||
|
const Text('C'),
|
||||||
|
const Text('D'),
|
||||||
|
const SizedBox(height: 500.0),
|
||||||
|
const Text('E'),
|
||||||
|
const SizedBox(height: 500.0),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
const Offset textPositionInAppBar = const Offset(16.0, 18.0);
|
||||||
|
expect(tester.getTopLeft(find.text('A')), textPositionInAppBar);
|
||||||
|
// top app bar is 200.0 high at this point
|
||||||
|
expect(tester.getTopLeft(find.text('B')), const Offset(0.0, 200.0) + textPositionInAppBar);
|
||||||
|
// second app bar is 56.0 high
|
||||||
|
expect(tester.getTopLeft(find.text('C')), const Offset(0.0, 200.0 + 56.0)); // height of both appbars
|
||||||
|
final Size cSize = tester.getSize(find.text('C'));
|
||||||
|
controller.jumpTo(200.0 - 56.0);
|
||||||
|
await tester.pump();
|
||||||
|
expect(tester.getTopLeft(find.text('A')), textPositionInAppBar);
|
||||||
|
// top app bar is now only 56.0 high, same as second
|
||||||
|
expect(tester.getTopLeft(find.text('B')), const Offset(0.0, 56.0) + textPositionInAppBar);
|
||||||
|
expect(tester.getTopLeft(find.text('C')), const Offset(0.0, 56.0 * 2.0)); // height of both collapsed appbars
|
||||||
|
expect(find.text('E'), findsNothing);
|
||||||
|
controller.jumpTo(600.0);
|
||||||
|
await tester.pump();
|
||||||
|
expect(tester.getTopLeft(find.text('A')), textPositionInAppBar); // app bar is pinned at top
|
||||||
|
expect(tester.getTopLeft(find.text('B')), const Offset(0.0, 56.0) + textPositionInAppBar); // second one too
|
||||||
|
expect(find.text('C'), findsNothing); // contents are scrolled off though
|
||||||
|
expect(find.text('D'), findsNothing);
|
||||||
|
// we have scrolled 600.0 pixels
|
||||||
|
// initial position of E was 200 + 56 + cSize.height + cSize.height + 500
|
||||||
|
// we've scrolled that up by 600.0, meaning it's at that minus 600 now:
|
||||||
|
expect(tester.getTopLeft(find.text('E')), new Offset(0.0, 200.0 + 56.0 + cSize.height * 2.0 + 500.0 - 600.0));
|
||||||
|
});
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user