blob: c8e8911e9b456bccea7bf68d50bd7479d7e0bc50 [file] [log] [blame]
// Copyright 2016 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';
import 'package:flutter/widgets.dart';
class TravelDestination {
const TravelDestination({ this.assetName, this.title, this.description });
final String assetName;
final String title;
final List<String> description;
bool get isValid => assetName != null && title != null && description?.length == 3;
}
final List<TravelDestination> destinations = <TravelDestination>[
const TravelDestination(
assetName: 'packages/flutter_gallery_assets/top_10_australian_beaches.png',
title: 'Top 10 Australian beaches',
description: const <String>[
'Number 10',
'Whitehaven Beach',
'Whitsunday Island, Whitsunday Islands'
]
),
const TravelDestination(
assetName: 'packages/flutter_gallery_assets/kangaroo_valley_safari.png',
title: 'Kangaroo Valley Safari',
description: const <String>[
'2031 Moss Vale Road',
'Kangaroo Valley 2577',
'New South Wales'
]
)
];
class TravelDestinationItem extends StatelessWidget {
TravelDestinationItem({ Key key, this.destination }) : super(key: key) {
assert(destination != null && destination.isValid);
}
final TravelDestination destination;
Widget build(BuildContext context) {
ThemeData theme = Theme.of(context);
TextStyle titleStyle = theme.textTheme.headline.copyWith(color: Colors.white);
TextStyle descriptionStyle = theme.textTheme.subhead;
TextStyle buttonStyle = theme.textTheme.button.copyWith(color: theme.primaryColor);
return new Card(
child: new SizedBox(
height: 328.0,
child: new Column(
children: <Widget>[
// photo and title
new SizedBox(
height: 184.0,
child: new Stack(
children: <Widget>[
new Positioned(
left: 0.0,
top: 0.0,
bottom: 0.0,
right: 0.0,
child: new AssetImage(
name: destination.assetName,
fit: ImageFit.cover
)
),
new Positioned(
bottom: 16.0,
left: 16.0,
child: new Text(destination.title, style: titleStyle)
)
]
)
),
// description and share/expore buttons
new Flexible(
child: new Padding(
padding: const EdgeInsets.all(16.0),
child: new Column(
justifyContent: FlexJustifyContent.start,
alignItems: FlexAlignItems.start,
children: <Widget>[
// three line description
new Text(destination.description[0], style: descriptionStyle),
new Text(destination.description[1], style: descriptionStyle),
new Text(destination.description[2], style: descriptionStyle),
// share, explore buttons
new Flexible(
child: new Row(
justifyContent: FlexJustifyContent.start,
alignItems: FlexAlignItems.end,
children: <Widget>[
new Padding(
padding: const EdgeInsets.only(right: 16.0),
child: new Text('SHARE', style: buttonStyle)
),
new Text('EXPLORE', style: buttonStyle)
]
)
)
]
)
)
)
]
)
)
);
}
}
class CardsDemo extends StatelessWidget {
Widget build(BuildContext context) {
return new Scaffold(
toolBar: new ToolBar(
center: new Text("Travel Stream")
),
body: new Block(
padding: const EdgeInsets.only(top: 8.0, left: 8.0, right: 8.0),
children: destinations.map((TravelDestination destination) {
return new Container(
margin: const EdgeInsets.only(bottom: 8.0),
child: new TravelDestinationItem(destination: destination)
);
})
.toList()
)
);
}
}