anchor.diff:  
   import 'package:flutter/material.dart';
   
  +// Each TabBarView contains a _Page and for each _Page there is a list
  +// of _CardData objects. Each _CardData object is displayed by a _CardItem.
  +
   class _Page {
     _Page({ this.label });
  -
     final GlobalKey<ScrollableState<Scrollable>> key = new GlobalKey<ScrollableState<Scrollable>>();
     final String label;
  +  String get id => label[0];
   }
   
  -final List<_Page> _pages = <_Page>[
  -  new _Page(label: 'ONE'),
  -  new _Page(label: 'TWO'),
  -  new _Page(label: 'FREE'),
  -  new _Page(label: 'FOUR')
  -];
  +class _CardData {
  +  const _CardData({ this.title, this.imageAsset });
  +  final String title;
  +  final String imageAsset;
  +}
  +
  +final Map<_Page, List<_CardData>> _allPages = <_Page, List<_CardData>>{
  +  new _Page(label: 'LEFT'): <_CardData>[
  +    const _CardData(
  +      title: 'Vintage Bluetooth Radio',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/radio.png'
  +    ),
  +    const _CardData(
  +      title: 'Sunglasses',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/sunnies.png'
  +    ),
  +    const _CardData(
  +      title: 'Clock',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/clock.png'
  +    ),
  +    const _CardData(
  +      title: 'Red popsicle',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/popsicle.png'
  +    ),
  +    const _CardData(
  +      title: 'Folding Chair',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/lawn_chair.png'
  +    ),
  +    const _CardData(
  +      title: 'Green comfort chair',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/chair.png'
  +    ),
  +  ],
  +  new _Page(label: 'RIGHT'): <_CardData>[
  +    const _CardData(
  +      title: 'Beachball',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/beachball.png'
  +    ),
  +    const _CardData(
  +      title: 'Old Binoculars',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/binoculars.png'
  +    ),
  +    const _CardData(
  +      title: 'Teapot',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/teapot.png'
  +    ),
  +    const _CardData(
  +      title: 'Blue suede shoes',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/chucks.png'
  +    ),
  +    const _CardData(
  +      title: 'Dipped Brush',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/brush.png'
  +    ),
  +    const _CardData(
  +      title: 'Perfect Goldfish Bowl',
  +      imageAsset: 'packages/flutter_gallery_assets/shrine/products/fish_bowl.png'
  +    ),
  +  ]
  +};
  +
  +class _CardDataItem extends StatelessWidget {
  +  _CardDataItem({ this.page, this.data });
  +
  +  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,
  +              child: new CircleAvatar(child: new Text('${page.id}'))
  +            ),
  +            new SizedBox(
  +              width: 144.0,
  +              height: 144.0,
  +              child: new Image(
  +                image: new AssetImage(data.imageAsset),
  +                fit: ImageFit.contain
  +              )
  +            ),
  +            new Center(
  +              child: new Text(data.title, style: Theme.of(context).textTheme.title)
  +            )
  +          ]
  +        )
  +      )
  +    );
  +  }
  +}
   
   class TabsDemo extends StatefulWidget {
     static const String routeName = '/tabs';
  
positive.code:         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()
          )
  
negative.code:   @override
    void initState() {
      super.initState();
      _selectedPage = _allPages.keys.first;
    }
  
    @override
    Widget build(BuildContext context) {
      final double statusBarHeight = MediaQuery.of(context).padding.top;
      return new TabBarSelection<_Page>(
        values: _allPages.keys.toList(),
        onChanged: (_Page value) {
          setState(() {
            _selectedPage = value;
  