Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 0 additions & 69 deletions lib/app.dart

This file was deleted.

24 changes: 0 additions & 24 deletions lib/color_detail_page.dart

This file was deleted.

52 changes: 0 additions & 52 deletions lib/colors_list_page.dart

This file was deleted.

36 changes: 36 additions & 0 deletions lib/features/help/help_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';

class HelpPage extends StatelessWidget {
const HelpPage({Key? key, this.onHome, this.onPayments}) : super(key: key);
final VoidCallback? onHome;
final VoidCallback? onPayments;

@override
Widget build(BuildContext context) {
print('HelpPage rebuild');
return Scaffold(
appBar: AppBar(
title: Text('Get help'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: onHome,
child: Text('Go Home'),
),
ElevatedButton(
onPressed: onPayments,
child: Text('Go to Payments'),
)
],
),
),
),
);
}
}
41 changes: 41 additions & 0 deletions lib/features/home_page/home_navigator.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import 'package:flutter/material.dart';
import 'package:nested_navigation_demo_flutter/features/home_page/home_page.dart';
import 'package:nested_navigation_demo_flutter/features/home_page/models/transaction.dart';
import 'package:nested_navigation_demo_flutter/features/transaction_details/transaction_details.dart';

class HomeNavigatorRoutes {
static const String root = '/';
static const String detail = '/detail';
static const String report = '/report';
}

class HomeNavigatorRouter {
static Route? generateRoute(RouteSettings settings) {
switch (settings.name) {
case HomeNavigatorRoutes.root:
return MaterialPageRoute(builder: (_) => HomePage());
case HomeNavigatorRoutes.detail:
final transaction = settings.arguments as Transaction;
return MaterialPageRoute(
builder: (_) => TransactionDetails(transaction: transaction)
// fullscreenDialog: false,
);
}
return null;
}
}

class HomeNavigator extends StatelessWidget {
HomeNavigator({required this.navigatorKey});
final GlobalKey<NavigatorState>? navigatorKey;

@override
Widget build(BuildContext context) {
return Navigator(
key: navigatorKey,
// TODO: Need to change this and persist it somewhere!!!
initialRoute: HomeNavigatorRoutes.root,
onGenerateRoute: HomeNavigatorRouter.generateRoute,
);
}
}
66 changes: 66 additions & 0 deletions lib/features/home_page/home_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import 'package:flutter/material.dart';
import 'package:nested_navigation_demo_flutter/features/home_page/home_navigator.dart';
import 'package:nested_navigation_demo_flutter/features/home_page/models/transaction.dart';
import 'package:nested_navigation_demo_flutter/features/home_page/transaction_tile.dart';

final transactions = [
Transaction(
data: Icons.add, title: 'Three', subtitle: 'June bill', amount: -10),
Transaction(
data: Icons.add, title: 'Unicef', subtitle: '1293786423', amount: -24),
Transaction(
data: Icons.add,
title: 'National Trust',
subtitle: 'Parking',
amount: -4.5),
Transaction(
data: Icons.add, title: 'Andrea Bizzotto', subtitle: 'Topup', amount: 10),
];

class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
print('HomePage rebuild');
return Scaffold(
appBar: AppBar(
title: Text('Current Account'),
actions: [
IconButton(
icon: Icon(Icons.pie_chart),
onPressed: () => Navigator.of(context, rootNavigator: true)
.pushNamed(HomeNavigatorRoutes.report),
)
],
bottom: PreferredSize(
preferredSize: Size.fromHeight(60),
child: Text('\$1,014.69'),
),
),
body: TransactionsListView(
transactions: transactions,
),
);
}
}

class TransactionsListView extends StatelessWidget {
const TransactionsListView({Key? key, required this.transactions})
: super(key: key);
final List<Transaction> transactions;

@override
Widget build(BuildContext context) {
return ListView.builder(
itemBuilder: (context, index) {
return TransactionTile(
transaction: transactions[index],
onSelected: (transaction) => Navigator.of(context)
.pushNamed(HomeNavigatorRoutes.detail, arguments: transaction),
);
},
itemCount: transactions.length,
);
}
}
74 changes: 74 additions & 0 deletions lib/features/home_page/models/transaction.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import 'dart:convert';

import 'package:flutter/material.dart';

class Transaction {
final String title;
final String subtitle;
final IconData data;
final double amount;
Transaction({
required this.title,
required this.subtitle,
required this.data,
required this.amount,
});

Transaction copyWith({
String? title,
String? subtitle,
IconData? data,
double? amount,
}) {
return Transaction(
title: title ?? this.title,
subtitle: subtitle ?? this.subtitle,
data: data ?? this.data,
amount: amount ?? this.amount,
);
}

Map<String, dynamic> toMap() {
return {
'title': title,
'subtitle': subtitle,
'data': data.codePoint,
'amount': amount,
};
}

factory Transaction.fromMap(Map<String, dynamic> map) {
return Transaction(
title: map['title'],
subtitle: map['subtitle'],
data: IconData(map['data'], fontFamily: 'MaterialIcons'),
amount: map['amount'],
);
}

String toJson() => json.encode(toMap());

factory Transaction.fromJson(String source) =>
Transaction.fromMap(json.decode(source));

@override
String toString() {
return 'Transaction(title: $title, subtitle: $subtitle, data: $data, amount: $amount)';
}

@override
bool operator ==(Object other) {
if (identical(this, other)) return true;

return other is Transaction &&
other.title == title &&
other.subtitle == subtitle &&
other.data == data &&
other.amount == amount;
}

@override
int get hashCode {
return title.hashCode ^ subtitle.hashCode ^ data.hashCode ^ amount.hashCode;
}
}
20 changes: 20 additions & 0 deletions lib/features/home_page/transaction_tile.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:flutter/material.dart';
import 'package:nested_navigation_demo_flutter/features/home_page/models/transaction.dart';

class TransactionTile extends StatelessWidget {
const TransactionTile({Key? key, required this.transaction, this.onSelected})
: super(key: key);
final Transaction transaction;
final ValueChanged<Transaction>? onSelected;
@override
Widget build(BuildContext context) {
return ListTile(
leading: Icon(transaction.data),
title: Text(transaction.title),
subtitle: Text(transaction.subtitle),
// TODO: Currency formatting
trailing: Text('\$${transaction.amount}'),
onTap: () => onSelected?.call(transaction),
);
}
}
Loading