| // 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 { |
| OverscrollDemo({ Key key }) : super(key: key); |
| |
| static const String routeName = '/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 GlobalKey<ScrollableState> _scrollableKey = new GlobalKey<ScrollableState>(); |
| static final List<String> _items = <String>[ |
| 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N' |
| ]; |
| |
| IndicatorType _type = IndicatorType.refresh; |
| |
| Future<Null> refresh() { |
| Completer<Null> completer = new Completer<Null>(); |
| new Timer(new Duration(seconds: 3), () { completer.complete(null); }); |
| return completer.future.then((_) { |
| _scaffoldKey.currentState?.showSnackBar(new SnackBar( |
| content: new Text("Refresh complete"), |
| action: new SnackBarAction( |
| label: 'RETRY', |
| onPressed: () { |
| _refreshIndicatorKey.currentState.show(); |
| } |
| ) |
| )); |
| }); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| Widget body = new MaterialList( // ignore: DEPRECATED_MEMBER_USE |
| type: MaterialListType.threeLine, |
| padding: const EdgeInsets.all(8.0), |
| scrollableKey: _scrollableKey, |
| children: _items.map((String item) { |
| return new ListItem( |
| isThreeLine: true, |
| leading: new CircleAvatar(child: new Text(item)), |
| title: new Text('This item represents $item.'), |
| subtitle: new Text('Even more additional list item information appears on line three.') |
| ); |
| }) |
| ); |
| |
| String indicatorTypeText; |
| switch (_type) { |
| case IndicatorType.overscroll: |
| indicatorTypeText = 'Over-scroll indicator'; |
| break; |
| case IndicatorType.refresh: |
| body = new RefreshIndicator( |
| key: _refreshIndicatorKey, |
| refresh: refresh, |
| scrollableKey: _scrollableKey, |
| location: RefreshIndicatorLocation.top, |
| child: body, |
| ); |
| indicatorTypeText = 'Refresh indicator'; |
| break; |
| } |
| |
| return new Scaffold( |
| key: _scaffoldKey, |
| appBar: new AppBar( |
| title: new Text('$indicatorTypeText'), |
| actions: <Widget>[ |
| new IconButton( |
| icon: new Icon(Icons.refresh), |
| tooltip: 'Pull to refresh', |
| onPressed: () { |
| setState(() { |
| _type = IndicatorType.refresh; |
| }); |
| } |
| ), |
| new IconButton( |
| icon: new Icon(Icons.play_for_work), |
| tooltip: 'Over-scroll indicator', |
| onPressed: () { |
| setState(() { |
| _type = IndicatorType.overscroll; |
| }); |
| } |
| ) |
| ] |
| ), |
| body: body |
| ); |
| } |
| } |