// 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/gestures.dart'; import 'package:flutter/material.dart'; /// Flutter code sample for [RefreshIndicator]. void main() => runApp(const RefreshIndicatorExampleApp()); class RefreshIndicatorExampleApp extends StatelessWidget { const RefreshIndicatorExampleApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( scrollBehavior: const MaterialScrollBehavior().copyWith(dragDevices: PointerDeviceKind.values.toSet()), home: const RefreshIndicatorExample(), ); } } class RefreshIndicatorExample extends StatelessWidget { const RefreshIndicatorExample({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('RefreshIndicator Sample'), ), body: RefreshIndicator( color: Colors.white, backgroundColor: Colors.blue, onRefresh: () async { // Replace this delay with the code to be executed during refresh // and return asynchronous code return Future<void>.delayed(const Duration(seconds: 3)); }, // This check is used to customize listening to scroll notifications // from the widget's children. // // By default this is set to `notification.depth == 0`, which ensures // the only the scroll notifications from the first scroll view are listened to. // // Here setting `notification.depth == 1` triggers the refresh indicator // when overscrolling the nested scroll view. notificationPredicate: (ScrollNotification notification) { return notification.depth == 1; }, child: CustomScrollView( slivers: <Widget>[ SliverToBoxAdapter( child: Container( height: 100, alignment: Alignment.center, color: Colors.pink[100], child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'Pull down here', style: Theme.of(context).textTheme.headlineMedium, ), const Text("RefreshIndicator won't trigger"), ], ), ), ), SliverToBoxAdapter( child: Container( color: Colors.green[100], height: 300, child: ListView.builder( itemCount: 25, itemBuilder: (BuildContext context, int index) { return const ListTile( title: Text('Pull down here'), subtitle: Text('RefreshIndicator will trigger'), ); }, ), ), ), SliverList.builder( itemCount: 20, itemBuilder: (BuildContext context, int index) { return const ListTile( title: Text('Pull down here'), subtitle: Text("Refresh indicator won't trigger"), ); } ) ], ), ), ); } }