You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
samples/compass_app/app/lib/ui/results/widgets/result_card.dart

77 lines
2.3 KiB

// Copyright 2024 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:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../../domain/models/destination/destination.dart';
import '../../../utils/image_error_listener.dart';
import '../../core/ui/tag_chip.dart';
class ResultCard extends StatelessWidget {
const ResultCard({super.key, required this.destination, required this.onTap});
final Destination destination;
final GestureTapCallback onTap;
@override
Widget build(BuildContext context) {
return ClipRRect(
borderRadius: BorderRadius.circular(10.0),
child: Stack(
fit: StackFit.expand,
children: [
CachedNetworkImage(
imageUrl: destination.imageUrl,
fit: BoxFit.fitHeight,
errorWidget: (context, url, error) => const Icon(Icons.error),
errorListener: imageErrorListener,
),
Positioned(
bottom: 12.0,
left: 12.0,
right: 12.0,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(destination.name.toUpperCase(), style: _cardTitleStyle),
const SizedBox(height: 6),
Wrap(
spacing: 4.0,
runSpacing: 4.0,
direction: Axis.horizontal,
children: destination.tags
.map((e) => TagChip(tag: e))
.toList(),
),
],
),
),
// Handle taps
Positioned.fill(
child: Material(
color: Colors.transparent,
child: InkWell(onTap: onTap),
),
),
],
),
);
}
}
final _cardTitleStyle = GoogleFonts.rubik(
textStyle: const TextStyle(
fontWeight: FontWeight.w800,
fontSize: 15.0,
color: Colors.white,
letterSpacing: 1,
shadows: [
// Helps to read the text a bit better
Shadow(blurRadius: 3.0, color: Colors.black),
],
),
);