tabs_demo.dart 4.81 KB
Newer Older
1 2 3 4 5 6
// 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';

7 8 9
// Each TabBarView contains a _Page and for each _Page there is a list
// of _CardData objects. Each _CardData object is displayed by a _CardItem.

10 11 12
class _Page {
  _Page({ this.label });
  final String label;
13 14 15 16 17 18 19
  String get id => label[0];
}

class _CardData {
  const _CardData({ this.title, this.imageAsset });
  final String title;
  final String imageAsset;
20 21
}

22 23 24 25
final Map<_Page, List<_CardData>> _allPages = <_Page, List<_CardData>>{
  new _Page(label: 'LEFT'): <_CardData>[
    const _CardData(
      title: 'Vintage Bluetooth Radio',
26
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/radio.png',
27 28 29
    ),
    const _CardData(
      title: 'Sunglasses',
30
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/sunnies.png',
31 32 33
    ),
    const _CardData(
      title: 'Clock',
34
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/clock.png',
35 36 37
    ),
    const _CardData(
      title: 'Red popsicle',
38
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/popsicle.png',
39 40 41
    ),
    const _CardData(
      title: 'Folding Chair',
42
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/lawn_chair.png',
43 44 45
    ),
    const _CardData(
      title: 'Green comfort chair',
46
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/chair.png',
47 48 49
    ),
    const _CardData(
      title: 'Old Binoculars',
50
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/binoculars.png',
51 52 53
    ),
    const _CardData(
      title: 'Teapot',
54
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/teapot.png',
55 56 57
    ),
    const _CardData(
      title: 'Blue suede shoes',
58
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/chucks.png',
59 60 61
    ),
    const _CardData(
      title: 'Dipped Brush',
62
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/brush.png',
63 64 65
    ),
    const _CardData(
      title: 'Perfect Goldfish Bowl',
66
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/fish_bowl.png',
67
    ),
68
  ],
69 70 71 72 73 74
  new _Page(label: 'RIGHT'): <_CardData>[
    const _CardData(
      title: 'Beachball',
      imageAsset: 'packages/flutter_gallery_assets/shrine/products/beachball.png',
    ),
  ],
75 76 77
};

class _CardDataItem extends StatelessWidget {
78
  const _CardDataItem({ this.page, this.data });
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

  static final double height = 272.0;
  final _Page page;
  final _CardData data;

  @override
  Widget build(BuildContext context) {
    return new Card(
      child: new Padding(
        padding: const EdgeInsets.all(16.0),
        child: new Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[
            new Align(
              alignment: page.id == 'L'
                ? FractionalOffset.centerLeft
                : FractionalOffset.centerRight,
97
              child: new CircleAvatar(child: new Text('${page.id}')),
98 99 100 101
            ),
            new SizedBox(
              width: 144.0,
              height: 144.0,
102
              child: new Image.asset(data.imageAsset, fit: BoxFit.contain),
103 104
            ),
            new Center(
105 106 107 108 109
              child: new Text(data.title, style: Theme.of(context).textTheme.title),
            ),
          ],
        ),
      ),
110 111 112
    );
  }
}
113

Hans Muller's avatar
Hans Muller committed
114
class TabsDemo extends StatelessWidget {
115
  static const String routeName = '/material/tabs';
116

117
  @override
118
  Widget build(BuildContext context) {
Hans Muller's avatar
Hans Muller committed
119 120
    return new DefaultTabController(
      length: _allPages.length,
121
      child: new Scaffold(
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
        body: new NestedScrollView(
          headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
            return <Widget>[
              new SliverAppBar(
                title: const Text('Tabs and scrolling'),
                pinned: true,
                expandedHeight: 150.0,
                forceElevated: innerBoxIsScrolled,
                bottom: new TabBar(
                  tabs: _allPages.keys.map((_Page page) => new Tab(text: page.label)).toList(),
                ),
              ),
            ];
          },
          body: new TabBarView(
            children: _allPages.keys.map((_Page page) {
              return new ListView(
                padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0),
                itemExtent: _CardDataItem.height,
                children: _allPages[page].map((_CardData data) {
                  return new Padding(
                    padding: const EdgeInsets.symmetric(vertical: 8.0),
                    child: new _CardDataItem(page: page, data: data),
                  );
                }).toList(),
              );
            }).toList(),
Hans Muller's avatar
Hans Muller committed
149
          ),
150
        ),
Hans Muller's avatar
Hans Muller committed
151
      ),
152 153 154
    );
  }
}