| // Copyright 2015 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 'package:flutter/material.dart'; |
| |
| class _Page { |
| _Page({ this.label }); |
| |
| final GlobalKey<ScrollableState<Scrollable>> key = new GlobalKey<ScrollableState<Scrollable>>(); |
| final String label; |
| } |
| |
| final List<_Page> _pages = <_Page>[ |
| new _Page(label: 'ONE'), |
| new _Page(label: 'TWO'), |
| new _Page(label: 'FREE'), |
| new _Page(label: 'FOUR') |
| ]; |
| |
| class TabsDemo extends StatefulWidget { |
| static const String routeName = '/tabs'; |
| |
| @override |
| TabsDemoState createState() => new TabsDemoState(); |
| } |
| |
| class TabsDemoState extends State<TabsDemo> { |
| _Page _selectedPage; |
| double _scrollOffset = 0.0; |
| |
| @override |
| void initState() { |
| super.initState(); |
| _selectedPage = _pages[0]; |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| final double statusBarHeight = MediaQuery.of(context).padding.top; |
| return new TabBarSelection<_Page>( |
| values: _pages, |
| onChanged: (_Page value) { |
| setState(() { |
| _selectedPage = value; |
| _selectedPage.key.currentState.scrollTo(_scrollOffset); |
| }); |
| }, |
| child: new Scaffold( |
| appBarBehavior: AppBarBehavior.under, |
| appBar: new AppBar( |
| title: new Text('Tabs and scrolling'), |
| bottom: new TabBar<_Page>( |
| labels: new Map<_Page, TabLabel>.fromIterable(_pages, value: (_Page page) { |
| return new TabLabel(text: page.label); |
| }) |
| ) |
| ), |
| body: new TabBarView<_Page>( |
| children: _pages.map((_Page page) { |
| return new Block( |
| padding: new EdgeInsets.only(top: kTextTabBarHeight + kToolBarHeight + statusBarHeight), |
| scrollableKey: page.key, |
| onScroll: (double value) { _scrollOffset = value; }, |
| children: new List<Widget>.generate(6, (int i) { |
| return new Container( |
| padding: const EdgeInsets.all(8.0), |
| height: 192.0, |
| child: new Card( |
| child: new Center( |
| child: new Text('Tab ${page.label}, item $i') |
| ) |
| ) |
| ); |
| }) |
| ); |
| }).toList() |
| ) |
| ) |
| ); |
| } |
| } |