material_list.dart 1.72 KB
Newer Older
Adam Barth's avatar
Adam Barth committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
// 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/widgets.dart';

import 'constants.dart';
import 'scrollbar_painter.dart';

enum MaterialListType {
  oneLine,
  oneLineWithAvatar,
  twoLine,
  threeLine
}

Map<MaterialListType, double> _kItemExtent = const <MaterialListType, double>{
  MaterialListType.oneLine: kOneLineListItemHeight,
  MaterialListType.oneLineWithAvatar: kOneLineListItemWithAvatarHeight,
  MaterialListType.twoLine: kTwoLineListItemHeight,
  MaterialListType.threeLine: kThreeLineListItemHeight,
};

class MaterialList<T> extends StatefulComponent {
  MaterialList({
    Key key,
    this.initialScrollOffset,
    this.onScroll,
    this.items,
    this.itemBuilder,
    this.type: MaterialListType.twoLine
  }) : super(key: key);

  final double initialScrollOffset;
  final ScrollListener onScroll;
  final List<T> items;
  final ItemBuilder<T> itemBuilder;
  final MaterialListType type;

  _MaterialListState<T> createState() => new _MaterialListState<T>();
}

class _MaterialListState<T> extends State<MaterialList<T>> {

  void initState() {
    super.initState();
    _scrollbarPainter = new ScrollbarPainter();
  }

  ScrollbarPainter _scrollbarPainter;

  Widget build(BuildContext context) {
    return new ScrollableList<T>(
      initialScrollOffset: config.initialScrollOffset,
      scrollDirection: ScrollDirection.vertical,
      onScroll: config.onScroll,
      items: config.items,
      itemBuilder: config.itemBuilder,
      itemExtent: _kItemExtent[config.type],
      padding: const EdgeDims.symmetric(vertical: 8.0),
      scrollableListPainter: _scrollbarPainter
    );
  }
}