diff --git a/namer_app/lib/main.dart b/namer_app/lib/main.dart index 952214a..34cc0ef 100644 --- a/namer_app/lib/main.dart +++ b/namer_app/lib/main.dart @@ -1,3 +1,4 @@ +// https://github.com/flutter/codelabs/blob/main/namer/step_08/lib/main.dart import 'package:english_words/english_words.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -14,10 +15,10 @@ class MyApp extends StatelessWidget { return ChangeNotifierProvider( create: (context) => MyAppState(), child: MaterialApp( - title: 'Namer App (EXAMPLE PROJECT)', + title: 'Namer App', theme: ThemeData( useMaterial3: true, - colorScheme: ColorScheme.fromSeed(seedColor: Colors.purple), + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange), ), home: MyHomePage(), ), @@ -42,7 +43,6 @@ class MyAppState extends ChangeNotifier { favorites.add(current); } notifyListeners(); - print("Favorites are: ${favorites.toString()}"); } } @@ -52,93 +52,55 @@ class MyHomePage extends StatefulWidget { } class _MyHomePageState extends State { - var selectedIndex = 0; @override Widget build(BuildContext context) { - Widget page; switch (selectedIndex) { case 0: page = GeneratorPage(); - break; case 1: page = FavoritesPage(); - break; default: throw UnimplementedError('no widget for $selectedIndex'); } - return LayoutBuilder( - builder: (context, constraints) { - return Scaffold( - body: Row( - children: [ - SafeArea( - child: NavigationRail( - extended: constraints.maxWidth >= 600, - destinations: [ - NavigationRailDestination( - icon: Icon(Icons.home), - label: Text('Home'), - ), - NavigationRailDestination( - icon: Icon(Icons.favorite), - label: Text('Favorites'), - ), - ], - selectedIndex: selectedIndex, - onDestinationSelected: (value) { - setState(() { - selectedIndex = value; - }); - } - ), + return LayoutBuilder(builder: (context, constraints) { + return Scaffold( + body: Row( + children: [ + SafeArea( + child: NavigationRail( + extended: constraints.maxWidth >= 600, + destinations: [ + NavigationRailDestination( + icon: Icon(Icons.home), + label: Text('Home'), + ), + NavigationRailDestination( + icon: Icon(Icons.favorite), + label: Text('Favorites'), + ), + ], + selectedIndex: selectedIndex, + onDestinationSelected: (value) { + setState(() { + selectedIndex = value; + }); + }, ), - Expanded( - child: Container( - color: Theme.of(context).colorScheme.primaryContainer, - child: page, - ), + ), + Expanded( + child: Container( + color: Theme.of(context).colorScheme.primaryContainer, + child: page, ), - ], - ), - ); - } - ); - } -} - -class FavoritesPage extends StatelessWidget { - const FavoritesPage({ - super.key, - }); - - @override - Widget build(BuildContext context) { - var appState = context.watch(); - - if (appState.favorites.isEmpty) { - return Center( - child: Text('No favorites yet.'), - ); - } - - return ListView( - children: [ - Padding( - padding: const EdgeInsets.all(20), - child: Text('You have ' - '${appState.favorites.length} favorites:'), + ), + ], ), - for (var pair in appState.favorites) - ListTile( - leading: Icon(Icons.favorite), - title: Text(pair.asLowerCase), - ), - ], - ); + ); + }); } } @@ -204,7 +166,7 @@ class BigCard extends StatelessWidget { return Card( color: theme.colorScheme.primary, child: Padding( - padding: const EdgeInsets.all(15.0), + padding: const EdgeInsets.all(20), child: Text( pair.asLowerCase, style: style, @@ -214,3 +176,31 @@ class BigCard extends StatelessWidget { ); } } + +class FavoritesPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + var appState = context.watch(); + + if (appState.favorites.isEmpty) { + return Center( + child: Text('No favorites yet.'), + ); + } + + return ListView( + children: [ + Padding( + padding: const EdgeInsets.all(20), + child: Text('You have ' + '${appState.favorites.length} favorites:'), + ), + for (var pair in appState.favorites) + ListTile( + leading: Icon(Icons.favorite), + title: Text(pair.asLowerCase), + ), + ], + ); + } +} diff --git a/namer_app/lib/main_MyVersion20250130.dart b/namer_app/lib/main_MyVersion20250130.dart new file mode 100644 index 0000000..952214a --- /dev/null +++ b/namer_app/lib/main_MyVersion20250130.dart @@ -0,0 +1,216 @@ +import 'package:english_words/english_words.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (context) => MyAppState(), + child: MaterialApp( + title: 'Namer App (EXAMPLE PROJECT)', + theme: ThemeData( + useMaterial3: true, + colorScheme: ColorScheme.fromSeed(seedColor: Colors.purple), + ), + home: MyHomePage(), + ), + ); + } +} + +class MyAppState extends ChangeNotifier { + var current = WordPair.random(); + + void getNext() { + current = WordPair.random(); + notifyListeners(); + } + + var favorites = []; + + void toggleFavorite() { + if (favorites.contains(current)) { + favorites.remove(current); + } else { + favorites.add(current); + } + notifyListeners(); + print("Favorites are: ${favorites.toString()}"); + } +} + +class MyHomePage extends StatefulWidget { + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + + var selectedIndex = 0; + + @override + Widget build(BuildContext context) { + + Widget page; + switch (selectedIndex) { + case 0: + page = GeneratorPage(); + break; + case 1: + page = FavoritesPage(); + break; + default: + throw UnimplementedError('no widget for $selectedIndex'); + } + + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + body: Row( + children: [ + SafeArea( + child: NavigationRail( + extended: constraints.maxWidth >= 600, + destinations: [ + NavigationRailDestination( + icon: Icon(Icons.home), + label: Text('Home'), + ), + NavigationRailDestination( + icon: Icon(Icons.favorite), + label: Text('Favorites'), + ), + ], + selectedIndex: selectedIndex, + onDestinationSelected: (value) { + setState(() { + selectedIndex = value; + }); + } + ), + ), + Expanded( + child: Container( + color: Theme.of(context).colorScheme.primaryContainer, + child: page, + ), + ), + ], + ), + ); + } + ); + } +} + +class FavoritesPage extends StatelessWidget { + const FavoritesPage({ + super.key, + }); + + @override + Widget build(BuildContext context) { + var appState = context.watch(); + + if (appState.favorites.isEmpty) { + return Center( + child: Text('No favorites yet.'), + ); + } + + return ListView( + children: [ + Padding( + padding: const EdgeInsets.all(20), + child: Text('You have ' + '${appState.favorites.length} favorites:'), + ), + for (var pair in appState.favorites) + ListTile( + leading: Icon(Icons.favorite), + title: Text(pair.asLowerCase), + ), + ], + ); + } +} + +class GeneratorPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + var appState = context.watch(); + var pair = appState.current; + + IconData icon; + if (appState.favorites.contains(pair)) { + icon = Icons.favorite; + } else { + icon = Icons.favorite_border; + } + + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + BigCard(pair: pair), + SizedBox(height: 10), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + ElevatedButton.icon( + onPressed: () { + appState.toggleFavorite(); + }, + icon: Icon(icon), + label: Text('Like'), + ), + SizedBox(width: 10), + ElevatedButton( + onPressed: () { + appState.getNext(); + }, + child: Text('Next'), + ), + ], + ), + ], + ), + ); + } +} + +class BigCard extends StatelessWidget { + const BigCard({ + super.key, + required this.pair, + }); + + final WordPair pair; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final style = theme.textTheme.displayMedium!.copyWith( + color: theme.colorScheme.onPrimary, + ); + + return Card( + color: theme.colorScheme.primary, + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Text( + pair.asLowerCase, + style: style, + semanticsLabel: "${pair.first} ${pair.second}", + ), + ), + ); + } +}