Transaction History
Loading preview
Starting the Flutter app
A showcase of Flutter's transaction history functionality
import 'package:flutter/material.dart';
const _transactions = [
{
'merchant': 'Amazon',
'amount': '-\$45.99',
'date': 'Today',
'icon': Icons.shopping_bag,
},
{
'merchant': 'Starbucks',
'amount': '-\$6.50',
'date': 'Today',
'icon': Icons.coffee,
},
{
'merchant': 'Salary',
'amount': '+\$3,500',
'date': 'Yesterday',
'icon': Icons.account_balance,
},
{
'merchant': 'Uber',
'amount': '-\$24.30',
'date': 'Mar 1',
'icon': Icons.directions_car,
},
{
'merchant': 'Netflix',
'amount': '-\$15.99',
'date': 'Mar 1',
'icon': Icons.movie,
},
{
'merchant': 'Transfer',
'amount': '+\$200',
'date': 'Feb 28',
'icon': Icons.swap_horiz,
},
];
class TransactionHistory extends StatelessWidget {
const TransactionHistory({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Transaction History')),
body: ListView.separated(
padding: const EdgeInsets.all(16),
itemCount: _transactions.length,
separatorBuilder: (_, _) => const Divider(),
itemBuilder: (context, i) {
final t = _transactions[i];
final isCredit = (t['amount'] as String).startsWith('+');
return ListTile(
leading: CircleAvatar(
backgroundColor: Theme.of(context).colorScheme.primaryContainer,
child: Icon(
t['icon'] as IconData,
color: Theme.of(context).colorScheme.onPrimaryContainer,
),
),
title: Text(t['merchant'] as String),
subtitle: Text(t['date'] as String),
trailing: Text(
t['amount'] as String,
style: TextStyle(
fontWeight: FontWeight.w600,
color: isCredit
? Colors.green
: Theme.of(context).colorScheme.onSurface,
),
),
);
},
),
);
}
}
Add it to your project
Copies the Dart source into your app, so you own it. Flutter SDK only, no extra packages.
First time? Run dart pub global activate fluttertemplates_dev, or read the CLI guide.
How it works
ListView.separated puts a Divider between six _transactions. Each row works out isCredit by checking whether the amount string begins with +, coloring credits green and leaving debits on onSurface. Dates like Today and Mar 1 are display strings, so there is no grouping or paging.
Adapting it
- Model
amountas a signed number and derive both the sign andisCreditfrom the value. - Use
DateTimefordateand insert day headers, whichseparatorBuildercan do by comparing neighboring rows. - Attach a
ScrollControllerto load older pages from your API instead of the const_transactions.