blob: 01ea143ab355462dacbac587442d86fb739dac6a [file] [log] [blame]
// Copyright 2019 The Flutter team. 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_gen/gen_l10n/gallery_localizations.dart';
import 'package:gallery/demos/material/material_demo_types.dart';
// BEGIN gridListsDemo
class GridListDemo extends StatelessWidget {
const GridListDemo({super.key, required this.type});
final GridListDemoType type;
List<_Photo> _photos(BuildContext context) {
final localizations = GalleryLocalizations.of(context)!;
return [
_Photo(
assetName: 'places/india_chennai_flower_market.png',
title: localizations.placeChennai,
subtitle: localizations.placeFlowerMarket,
),
_Photo(
assetName: 'places/india_tanjore_bronze_works.png',
title: localizations.placeTanjore,
subtitle: localizations.placeBronzeWorks,
),
_Photo(
assetName: 'places/india_tanjore_market_merchant.png',
title: localizations.placeTanjore,
subtitle: localizations.placeMarket,
),
_Photo(
assetName: 'places/india_tanjore_thanjavur_temple.png',
title: localizations.placeTanjore,
subtitle: localizations.placeThanjavurTemple,
),
_Photo(
assetName: 'places/india_tanjore_thanjavur_temple_carvings.png',
title: localizations.placeTanjore,
subtitle: localizations.placeThanjavurTemple,
),
_Photo(
assetName: 'places/india_pondicherry_salt_farm.png',
title: localizations.placePondicherry,
subtitle: localizations.placeSaltFarm,
),
_Photo(
assetName: 'places/india_chennai_highway.png',
title: localizations.placeChennai,
subtitle: localizations.placeScooters,
),
_Photo(
assetName: 'places/india_chettinad_silk_maker.png',
title: localizations.placeChettinad,
subtitle: localizations.placeSilkMaker,
),
_Photo(
assetName: 'places/india_chettinad_produce.png',
title: localizations.placeChettinad,
subtitle: localizations.placeLunchPrep,
),
_Photo(
assetName: 'places/india_tanjore_market_technology.png',
title: localizations.placeTanjore,
subtitle: localizations.placeMarket,
),
_Photo(
assetName: 'places/india_pondicherry_beach.png',
title: localizations.placePondicherry,
subtitle: localizations.placeBeach,
),
_Photo(
assetName: 'places/india_pondicherry_fisherman.png',
title: localizations.placePondicherry,
subtitle: localizations.placeFisherman,
),
];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
title: Text(GalleryLocalizations.of(context)!.demoGridListsTitle),
),
body: GridView.count(
restorationId: 'grid_view_demo_grid_offset',
crossAxisCount: 2,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
padding: const EdgeInsets.all(8),
childAspectRatio: 1,
children: _photos(context).map<Widget>((photo) {
return _GridDemoPhotoItem(
photo: photo,
tileStyle: type,
);
}).toList(),
),
);
}
}
class _Photo {
_Photo({
required this.assetName,
required this.title,
required this.subtitle,
});
final String assetName;
final String title;
final String subtitle;
}
/// Allow the text size to shrink to fit in the space
class _GridTitleText extends StatelessWidget {
const _GridTitleText(this.text);
final String text;
@override
Widget build(BuildContext context) {
return FittedBox(
fit: BoxFit.scaleDown,
alignment: AlignmentDirectional.centerStart,
child: Text(text),
);
}
}
class _GridDemoPhotoItem extends StatelessWidget {
const _GridDemoPhotoItem({
required this.photo,
required this.tileStyle,
});
final _Photo photo;
final GridListDemoType tileStyle;
@override
Widget build(BuildContext context) {
final Widget image = Semantics(
label: '${photo.title} ${photo.subtitle}',
child: Material(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)),
clipBehavior: Clip.antiAlias,
child: Image.asset(
photo.assetName,
package: 'flutter_gallery_assets',
fit: BoxFit.cover,
),
),
);
switch (tileStyle) {
case GridListDemoType.imageOnly:
return image;
case GridListDemoType.header:
return GridTile(
header: Material(
color: Colors.transparent,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(top: Radius.circular(4)),
),
clipBehavior: Clip.antiAlias,
child: GridTileBar(
title: _GridTitleText(photo.title),
backgroundColor: Colors.black45,
),
),
child: image,
);
case GridListDemoType.footer:
return GridTile(
footer: Material(
color: Colors.transparent,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(bottom: Radius.circular(4)),
),
clipBehavior: Clip.antiAlias,
child: GridTileBar(
backgroundColor: Colors.black45,
title: _GridTitleText(photo.title),
subtitle: _GridTitleText(photo.subtitle),
),
),
child: image,
);
}
}
}
// END