import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; import 'package:intl/intl.dart'; import 'home_viewmodel.dart'; class HomeView extends StackedView { const HomeView({Key? key}) : super(key: key); @override Widget builder( BuildContext context, HomeViewModel viewModel, Widget? child, ) { return Scaffold( backgroundColor: Theme.of(context).colorScheme.background, body: ListView.builder( itemCount: viewModel.events.length, itemBuilder: (context, index) { return InkWell( onTap: () => viewModel.onEventTap(index), borderRadius: BorderRadius.circular(8), child: Container( margin: const EdgeInsets.all(8), decoration: BoxDecoration( color: Theme.of(context).colorScheme.primary, borderRadius: BorderRadius.circular(8), ), child: IntrinsicHeight( child: Row( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Flexible( flex: 1, child: AspectRatio( aspectRatio: 1, child: Container( margin: const EdgeInsets.only(right: 16), decoration: BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular(8), bottomLeft: Radius.circular(8), ), image: DecorationImage( image: AssetImage(viewModel.events[index].picture), fit: BoxFit.cover, ), ), ), ), ), Expanded( flex: 2, child: Container( margin: const EdgeInsets.all(8), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( viewModel.events[index].date != null ? DateFormat.yMMMMd( Localizations.localeOf( context) .toString()) .format( viewModel.events[index].date!) : 'No date', style: Theme.of(context) .textTheme .titleMedium, ), Text( viewModel.events[index].name, style: Theme.of(context) .textTheme .headlineMedium, ), ], ), IconButton( icon: Icon( viewModel.events[index].isFavorite ? Icons.favorite : Icons.favorite_border, color: viewModel.events[index].isFavorite ? Colors.red : null, ), iconSize: 35, onPressed: () { viewModel.toggleFavorite(index); }, ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.end, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( viewModel.events[index].organizer, style: Theme.of(context).textTheme.bodyLarge, ), Text( viewModel.events[index].place ?? 'No place', style: Theme.of(context) .textTheme .bodyMedium, ), ], ), IconButton( icon: const Icon(Icons.place), iconSize: 35, onPressed: () { // Handle favorite action }, ), ], ), ], ), ), ), ], ), ), ), ); }, ), ); } @override HomeViewModel viewModelBuilder( BuildContext context, ) => HomeViewModel(); }