import 'dart:io'; import 'package:expense_planner/widgets/chart.dart'; import 'package:expense_planner/widgets/new_transaction.dart'; import 'package:expense_planner/widgets/transaction_list.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart'; import 'models/transaction.dart'; void main() { Intl.defaultLocale = 'fr'; runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.purple, scaffoldBackgroundColor: Colors.grey[200], fontFamily: 'Quicksand', textTheme: const TextTheme( titleMedium: TextStyle( fontFamily: 'OpenSans', fontWeight: FontWeight.bold, fontSize: 17, ), ), appBarTheme: const AppBarTheme( centerTitle: true, titleTextStyle: TextStyle( fontFamily: 'OpenSans', fontWeight: FontWeight.bold, fontSize: 16, )), ), home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { MyHomePage({super.key}); @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { final List _userTransactions = [ Transaction( id: '1', title: 'Foo', amount: 10, date: DateTime.now().subtract(Duration(days: 2))), Transaction( id: '2', title: 'Bar', amount: 10, date: DateTime.now().subtract(Duration(days: 1))), Transaction( id: '3', title: 'Baz', amount: 10, date: DateTime.now().subtract(Duration(days: 0))), ]; bool _showChart = false; List get _recentTransactions { return _userTransactions .where((transaction) => transaction.date .isAfter(DateTime.now().subtract(Duration(days: 7)))) .toList(); } void _addNewTransaction(String title, double amount, DateTime date) { final newTransaction = Transaction( id: DateTime.now().toString(), title: title, amount: amount, date: date); setState(() { _userTransactions.add(newTransaction); }); } void _deleteTransaction(String id) { setState(() { _userTransactions .removeWhere((Transaction transaction) => transaction.id == id); }); } void _startAddNewTransaction(BuildContext ctx) { showModalBottomSheet( context: ctx, builder: (_) { return GestureDetector( onTap: () {}, behavior: HitTestBehavior.opaque, child: NewTransaction(_addNewTransaction), ); }, ); } @override Widget build(BuildContext context) { final mediaQuery = MediaQuery.of(context); final isLandscape = mediaQuery.orientation == Orientation.landscape; final appBar = AppBar( title: const Text( 'Expense Planner', ), actions: [ IconButton( onPressed: () => _startAddNewTransaction(context), icon: const Icon(Icons.add)), ], ); final transactionsListWidget = SizedBox( height: (mediaQuery.size.height - appBar.preferredSize.height - mediaQuery.padding.top) * 0.6, child: TransactionList(_userTransactions, _deleteTransaction), ); final chartWidget = SizedBox( height: (mediaQuery.size.height - appBar.preferredSize.height - mediaQuery.padding.top) * (mediaQuery.orientation == Orientation.portrait ? 0.3 : 0.7), child: Chart( transactions: _recentTransactions, ), ); return Scaffold( appBar: appBar, floatingActionButton: Platform.isIOS ? Container() : FloatingActionButton( onPressed: () => _startAddNewTransaction(context), child: const Icon(Icons.add), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, body: SafeArea( child: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ if (isLandscape) Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ const Text('Show chart'), Switch.adaptive( value: _showChart, onChanged: (bool newValue) { setState(() { _showChart = newValue; }); }), ], ), if (!isLandscape) ...[chartWidget, transactionsListWidget], if (isLandscape) _showChart ? chartWidget : transactionsListWidget ], ), ), ), ); } }