| // 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 'dart:async'; |
| |
| import 'package:flutter/material.dart'; |
| |
| enum IndicatorType { overscroll, refresh } |
| |
| class OverscrollDemo extends StatefulWidget { |
| const OverscrollDemo({ Key key }) : super(key: key); |
| |
| static const String routeName = '/material/overscroll'; |
| |
| @override |
| OverscrollDemoState createState() => new OverscrollDemoState(); |
| } |
| |
| class OverscrollDemoState extends State<OverscrollDemo> { |
| final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); |
| final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey = new GlobalKey<RefreshIndicatorState>(); |
| static final List<String> _items = <String>[ |
| 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N' |
| ]; |
| |
| Future<Null> _handleRefresh() { |
| final Completer<Null> completer = new Completer<Null>(); |
| new Timer(const Duration(seconds: 3), () { completer.complete(null); }); |
| return completer.future.then((_) { |
| _scaffoldKey.currentState?.showSnackBar(new SnackBar( |
| content: const Text("Refresh complete"), |
| action: new SnackBarAction( |
| label: 'RETRY', |
| onPressed: () { |
| _refreshIndicatorKey.currentState.show(); |
| } |
| ) |
| )); |
| }); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return new Scaffold( |
| key: _scaffoldKey, |
| appBar: new AppBar( |
| title: const Text('Pull to refresh'), |
| actions: <Widget>[ |
| new IconButton( |
| icon: const Icon(Icons.refresh), |
| tooltip: 'Refresh', |
| onPressed: () { |
| _refreshIndicatorKey.currentState.show(); |
| } |
| ), |
| ] |
| ), |
| body: new RefreshIndicator( |
| key: _refreshIndicatorKey, |
| onRefresh: _handleRefresh, |
| child: new ListView.builder( |
| padding: kMaterialListPadding, |
| itemCount: _items.length, |
| itemBuilder: (BuildContext context, int index) { |
| final String item = _items[index]; |
| return new ListTile( |
| isThreeLine: true, |
| leading: new CircleAvatar(child: new Text(item)), |
| title: new Text('This item represents $item.'), |
| subtitle: const Text('Even more additional list item information appears on line three.'), |
| ); |
| }, |
| ), |
| ), |
| ); |
| } |
| } |