- Install
- Set up an editor
- Test drive
- Write your first Flutter app, part 1
- Learn more
- Flutter for Android developers
- Flutter for iOS developers
- Flutter for React Native developers
- Flutter for web developers
- Flutter for Xamarin.Forms developers
- Introduction to declarative UI
- Cookbook
- Codelabs
- Tutorials
- User interface
- Introduction to widgets
- Layouts in Flutter
- Layout tutorial
- Dealing with box constraints
- Adding interactivity to your Flutter app
- Adding assets and images
- Navigation & routing
- Introduction to animations
- Animations overview
- Animations tutorial
- Hero Animations
- Staggered Animations
- Advanced UI
- Slivers
- Taps, drags, and other gestures
- Widget catalog
- Data & backend
- State management
- State management
- Start thinking declaratively
- Differentiate between ephemeral state and app state
- Simple app state management
- List of state management approaches
- JSON and serialization
- Firebase
- Accessibility & internationalization
- Accessibility
- Internationalizing Flutter apps
- Platform integration
- Writing custom platform-specific code
- Packages & plugins
- Using packages
- Developing packages & plugins
- Background processes
- Tools & techniques
- Android Studio / IntelliJ
- Visual Studio Code
- Upgrading Flutter
- Hot reload
- Code formatting
- Debugging Flutter apps
- Using OEM debuggers
- Flutter's build modes
- Testing Flutter apps
- Performance best practices
- Flutter performance profiling
- Creating flavors for Flutter
- Preparing an Android App for Release
- Preparing an iOS App for Release
- Continuous Delivery using fastlane with Flutter
- Bootstrap into Dart
- Inside Flutter
- Platform specific behaviors and adaptations
- Technical Overview
- Technical videos
- FAQ
- Flutter widget index
- Install
- Windows install
- MacOS install
- Linux install
- Set up an editor
- Write your first Flutter app, part 1
- Learn more
- Cupertino (iOS-style) widgets
- Layout widgets
- Animation and motion widgets
- Retrieve the value of a text field
- Basic widgets
- Material Components widgets
- Animate the properties of a Container
- Fade a Widget in and out
- Add a Drawer to a screen
- Displaying SnackBars
- Exporting fonts from a package
- Updating the UI based on orientation
- Using Themes to share colors and font styles
- Using custom fonts
- Working with Tabs
- Building a form with validation
- Create and style a text field
- Focus on a Text Field
- Handling changes to a text field
- Retrieve the value of a text field
- Adding Material Touch Ripples
- Handling Taps
- Implement Swipe to Dismiss
- Display images from the internet
- Fade in images with a placeholder
- Working with cached images
- Basic List
- Create a horizontal list
- Creating a Grid List
- Creating lists with different types of items
- Place a floating app bar above a list
- Working with long lists
- Report errors to a service
- Animating a Widget across screens
- Navigate to a new screen and back
- Navigate with named routes
- Pass arguments to a named route
- Return data from a screen
- Send data to a new screen
- Fetch data from the internet
- Making authenticated requests
- Parsing JSON in the background
- Working with WebSockets
- Persist data with SQLite
- Reading and Writing Files
- Storing key-value data on disk
- Play and pause a video
- Take a picture using the Camera
- An introduction to integration testing
- Performance profiling
- Scrolling
- An introduction to unit testing
- Mock dependencies using Mockito
- An introduction to widget testing
- Finding widgets
- Tapping, dragging and entering text
- Development
- Introduction to widgets
- Layout tutorial
- Dealing with box constraints
- Adding interactivity to your Flutter app
- Adding assets and images
- Navigation & routing
- Navigate to a new screen and back
- Send data to a new screen
- Return data from a screen
- Navigate with named routes
- Animating a Widget across screens
- AnimatedList
- Sample App Catalog
- Animations overview
- Animations tutorial
- Staggered Animations
- Slivers
- Taps, drags, and other gestures
- Accessibility widgets
- Assets, images, and icon widgets
- Async widgets
- Input widgets
- Interaction model widgets
- Painting and effect widgets
- Scrolling widgets
- Styling widgets
- Text widgets
- State management
- Start thinking declaratively
- Differentiate between ephemeral state and app state
- Simple app state management
- List of state management approaches
- JSON and serialization
- Accessibility
- Internationalizing Flutter apps
- Writing custom platform-specific code
- Using packages
- Fetch data from the internet
- Developing packages & plugins
- Background processes
- Android Studio / IntelliJ
- Set up an editor
- Flutter inspector
- Creating Useful Bug Reports
- Visual Studio Code
- Set up an editor
- Upgrading Flutter
- Hot reload
- Code formatting
Place a floating app bar above a list
To make it easier for users to view a list of items, you may want to hide the app bar as the user scrolls down the list. This is especially true if your app displays a “tall” app bar that occupies a lot of vertical space.
Traditionally, you create an app bar by providing an appBar
property to the Scaffold
Widget. This creates a fixed app bar that always remains above the body
of the Scaffold
.
Moving the app bar from a Scaffold
Widget into a CustomScrollView
allows you to create an app bar that scrolls offscreen as you scroll through a list of items contained inside the CustomScrollView
.
This recipe demonstrates how to use a CustomScrollView
to display a list of items with an app bar on top that scrolls offscreen as the user scrolls down the list.
Directions
- Create a
CustomScrollView
- Use
SliverAppBar
to add a floating app bar - Add a list of items using a
SliverList
1. Create a CustomScrollView
In order to create a floating app bar, you need to place the app bar inside a CustomScrollView
that also contains the list of items. This synchronizes the scroll position of the app bar and the list of items. You may think of the CustomScrollView
Widget as a ListView
that allows you to mix and match different types of scrollable lists and widgets together!
The scrollable lists and widgets that can be provided to the the CustomScrollView
are known as slivers. There are several types of Slivers, such as a SliverList
, SliverGridList
, and SliverAppBar
! In fact, the ListView
and GridView
Widgets use the SliverList
and SliverGrid
widgets under the hood!
For this example, create a CustomScrollView
that contains a SliverAppBar
and a SliverList
. In addition, you need to remove any app bars you may be providing to the Scaffold
Widget!
Scaffold(
// No appBar property provided, only the body!
body: CustomScrollView(
// Add the app bar and list of items as slivers in the next steps
slivers: <Widget>[]
),
);
2. Use SliverAppBar
to add a floating app bar
Next, add an app bar to the CustomScrollView
. Flutter provides the SliverAppBar
Widget out of the box. Much like the normal AppBar
widget, you can use the SliverAppBar
to display a title, tabs, images and more.
However, the SliverAppBar
also gives you the ability to create a “floating” app bar that scrolls offscreen as the user scrolls down the list. Furthermore, you can configure the SliverAppBar
to shrink and expand as the user scrolls.
To achieve this effect:
- Start with an app bar that displays only a title
- Set the
floating
property totrue
. This allows users to quickly reveal the app bar when they being scrolling up the list. - Add a
flexibleSpace
widget that will fill the availableexpandedHeight
.
CustomScrollView(
slivers: <Widget>[
SliverAppBar(
title: Text('Floating app bar'),
// Allows the user to reveal the app bar if they begin scrolling back
// up the list of items
floating: true,
// Display a placeholder Widget to visualize the shrinking size
flexibleSpace: Placeholder(),
// Make the initial height of the SliverAppBar larger than normal
expandedHeight: 200,
),
],
);
3. Add a list of items using a SliverList
Now that you have the app bar in place, add a list of items to the CustomScrollView
. You have two options: a SliverList
or a SliverGrid
. If you need to display a list of items one after the other, use the SliverList
Widget. If you need to display a grid list, use the SliverGrid
Widget.
The SliverList
and SliverGrid
Widgets take one required parameter: a SliverChildDelegate
. While this sounds fancy, the delegate is simply used to provide a list Widgets to SliverList
or SliverGrid
. For example, the SliverChildBuilderDelegate
allows you to create a list of items that are built lazily as you scroll, just like the the ListView.builder
Widget.
// Create a SliverList
SliverList(
// That uses a delegate to build items as they're scrolled on screen.
delegate: SliverChildBuilderDelegate(
// The builder function returns a ListTile with a title that
// displays the index of the current item
(context, index) => ListTile(title: Text('Item #$index')),
// Builds 1000 ListTiles
childCount: 1000,
),
)
Complete example
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
final title = 'Floating App Bar';
return MaterialApp(
title: title,
home: Scaffold(
// No appbar provided to the Scaffold, only a body with a
// CustomScrollView
body: CustomScrollView(
slivers: <Widget>[
// Add the app bar to the CustomScrollView
SliverAppBar(
// Provide a standard title
title: Text(title),
// Allows the user to reveal the app bar if they begin scrolling
// back up the list of items
floating: true,
// Display a placeholder Widget to visualize the shrinking size
flexibleSpace: Placeholder(),
// Make the initial height of the SliverAppBar larger than normal
expandedHeight: 200,
),
// Next, create a SliverList
SliverList(
// Use a delegate to build items as they're scrolled on screen.
delegate: SliverChildBuilderDelegate(
// The builder function returns a ListTile with a title that
// displays the index of the current item
(context, index) => ListTile(title: Text('Item #$index')),
// Builds 1000 ListTiles
childCount: 1000,
),
),
],
),
),
);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论