mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

A relatively elaborate PinnedSliverHeader example which creates an app bar that's similar to the one that appears in the iOS Settings app. In this example the pinned header starts out transparent and the first item in the list serves as the app's "Settings" title. When the title item has been scrolled completely behind the pinned header, the header animates its opacity from 0 to 1 and its (centered) "Settings" title appears. The fact that the header's opacity depends on the height of the title item - which is unknown until the list has been laid out - necessitates monitoring its SliverConstraints.scrollExtent from a scroll NotificationListener. https://github.com/flutter/flutter/assets/1377460/539e2591-d0d7-4508-8ce8-4b8f587d7648
42 lines
2.0 KiB
Dart
42 lines
2.0 KiB
Dart
// Copyright 2014 The Flutter 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/material.dart';
|
|
import 'package:flutter_api_samples/widgets/sliver/pinned_header_sliver.1.dart' as example;
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
testWidgets('PinnedHeaderSliver iOS Settings example', (WidgetTester tester) async {
|
|
await tester.pumpWidget(
|
|
const example.SettingsAppBarApp(),
|
|
);
|
|
|
|
// Verify that the app contains a header: a SliverPersistentHeader
|
|
// with an AnimatedOpacity widget below it, and a Text('Settings') below that.
|
|
expect(find.byType(PinnedHeaderSliver), findsOneWidget);
|
|
expect(find.descendant(of: find.byType(PinnedHeaderSliver), matching: find.byType(AnimatedOpacity)), findsOneWidget);
|
|
expect(find.widgetWithText(AnimatedOpacity, 'Settings'), findsOneWidget);
|
|
|
|
// Verify that the app contains a "Settings" title: a SliverToBoxAdapter
|
|
// with a Text('Settings') widget below it.
|
|
expect(find.widgetWithText(SliverToBoxAdapter, 'Settings'), findsOneWidget);
|
|
|
|
final Finder headerOpacity = find.widgetWithText(AnimatedOpacity, 'Settings');
|
|
expect(tester.widget<AnimatedOpacity>(headerOpacity).opacity, 0);
|
|
|
|
// Scroll up: the header's opacity goes to 1 and the title disappears.
|
|
await tester.timedDrag(find.byType(CustomScrollView), const Offset(0, -500), const Duration(milliseconds: 500));
|
|
await tester.pumpAndSettle();
|
|
expect(tester.widget<AnimatedOpacity>(headerOpacity).opacity, 1);
|
|
expect(find.widgetWithText(SliverToBoxAdapter, 'Settings'), findsNothing);
|
|
|
|
// Scroll back down and we're back to where we started.
|
|
await tester.timedDrag(find.byType(CustomScrollView), const Offset(0, 500), const Duration(milliseconds: 500));
|
|
await tester.pumpAndSettle();
|
|
expect(tester.widget<AnimatedOpacity>(headerOpacity).opacity, 0);
|
|
expect(find.widgetWithText(SliverToBoxAdapter, 'Settings'), findsOneWidget);
|
|
|
|
});
|
|
}
|