flutter/examples/widgets/block_viewport.dart
Adam Barth dea3a0922c Add package:sky/rendering.dart
Similar to widgets.dart, rendering.dart exports the entire rendering layer.
Also, update the examples to use rendering.dart and widgets.dart. Also clean up
some exports so that the examples have more sensible imports.
2015-08-18 21:39:51 -07:00

132 lines
3.6 KiB
Dart

// 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 'dart:math' as math;
import 'package:sky/widgets.dart';
class BlockViewportApp extends App {
BlockViewportLayoutState layoutState = new BlockViewportLayoutState();
List<double> lengths = <double>[];
double offset = 0.0;
static const double kMaxLength = 100.0;
static math.Random rand = new math.Random();
void addBox() {
lengths.add(rand.nextDouble() * kMaxLength);
updateEnabledState();
}
void removeBox(int index) {
lengths.removeAt(index);
updateEnabledState();
}
void goUp() {
offset -= 9.9;
updateEnabledState();
}
void goDown() {
offset += 20.45;
updateEnabledState();
}
bool enabledDown = true;
bool enabledUp = true;
bool enabledAdd = true;
bool enabledRemove = false;
void updateEnabledState() {
setState(() {
enabledUp = offset > -100.0;
enabledDown = offset < lengths.fold(0.0, (double result, double len) => result + len) + 100.0;
enabledAdd = true;
enabledRemove = lengths.length > 0;
});
}
Widget build() {
return new Theme(
data: new ThemeData.light(),
child: new Scaffold(
toolbar: new ToolBar(
center: new Text('Block Viewport Demo')),
body: new Material(
type: MaterialType.canvas,
child: new Flex([
new Container(
padding: new EdgeDims.symmetric(horizontal: 8.0, vertical: 25.0),
child: new Flex([
new RaisedButton(
enabled: enabledAdd,
child: new Text('ADD'),
onPressed: addBox
),
new RaisedButton(
enabled: enabledUp,
child: new Text('UP'),
onPressed: goUp
),
new RaisedButton(
enabled: enabledDown,
child: new Text('DOWN'),
onPressed: goDown
)
],
justifyContent: FlexJustifyContent.spaceAround
)
),
new Flexible(
child: new Container(
margin: new EdgeDims.all(8.0),
decoration: new BoxDecoration(
border: new Border.all(color: new Color(0xFF000000))
),
padding: new EdgeDims.all(16.0),
child: new BlockViewport(
builder: builder,
startOffset: offset,
token: lengths.length,
layoutState: layoutState
)
)
),
],
direction: FlexDirection.vertical,
justifyContent: FlexJustifyContent.spaceBetween
)
)
)
);
}
Widget builder(int index) {
if (index >= lengths.length)
return null;
return new Listener(
key: new Key.stringify(lengths[index]),
child: new Container(
decoration: new BoxDecoration(
backgroundColor: new Color((0xFF000000 + 0xFFFFFF * lengths[index] / kMaxLength).round())
),
height: lengths[index] + 12.0
),
onGestureTap: (_) {
removeBox(index);
}
);
}
}
void main() {
runApp(new BlockViewportApp());
// scheduler.addPersistentFrameCallback((_) {
// SkyBinding.instance.debugDumpRenderTree();
// });
}