Created
July 30, 2023 04:19
-
-
Save Capital-EX/56e90a36cd77b1e3082de0c85b1a4bfe to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:english_words/english_words.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:provider/provider.dart'; | |
void main() { | |
runApp(const MyApp()); | |
} | |
class MyApp extends StatelessWidget { | |
const MyApp({super.key}); | |
@override | |
Widget build(BuildContext context) { | |
return ChangeNotifierProvider( | |
create: (context) => MyAppState(), | |
child: MaterialApp( | |
title: 'Namer App', | |
theme: ThemeData( | |
useMaterial3: true, | |
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue), | |
), | |
home: const MyHomePage(), | |
)); | |
} | |
} | |
class MyAppState extends ChangeNotifier { | |
var current = WordPair.random(); | |
void getNext() { | |
current = WordPair.random(); | |
notifyListeners(); | |
} | |
var favorites = <WordPair>[]; | |
void toggleFavorite() { | |
if (favorites.contains(current)) { | |
favorites.remove(current); | |
} else { | |
favorites.add(current); | |
} | |
notifyListeners(); | |
} | |
} | |
class MyHomePage extends StatefulWidget { | |
const MyHomePage({super.key}); | |
@override | |
State<MyHomePage> createState() => _MyHomePageState(); | |
} | |
class _MyHomePageState extends State<MyHomePage> { | |
var selectedIndex = 0; | |
@override | |
Widget build(BuildContext context) { | |
Widget page; | |
switch (selectedIndex) { | |
case 0: | |
page = GeneratorPage(); | |
break; | |
case 1: | |
page = Favorites(); | |
break; | |
default: | |
throw UnimplementedError("No widge for $selectedIndex"); | |
} | |
return LayoutBuilder( | |
builder: (context, constraints) { | |
return Scaffold( | |
body: Row( | |
children: [ | |
SafeArea( | |
child: NavigationRail( | |
extended: constraints.maxWidth >= 600, | |
destinations: const [ | |
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 Favorites extends StatelessWidget { | |
const Favorites({ | |
super.key, | |
}); | |
@override | |
Widget build(BuildContext context) { | |
var appState = context.watch<MyAppState>(); | |
var favorites = appState.favorites; | |
return ListView( | |
children: [ | |
Padding( | |
padding: const EdgeInsets.all(20), | |
child: Text('You have ' | |
'${favorites.length} favorits:') | |
) | |
for (var favorite in favorites) | |
ListTile( | |
title: Text(favorite.asLowerCase), | |
leading: const Icon(Icons.favorite), | |
) | |
] | |
); | |
} | |
} | |
class GeneratorPage extends StatelessWidget { | |
const GeneratorPage({super.key}); | |
@override | |
Widget build(BuildContext context) { | |
var appState = context.watch<MyAppState>(); | |
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), | |
const SizedBox(height: 10), | |
Row( | |
mainAxisSize: MainAxisSize.min, | |
children: [ | |
ElevatedButton.icon( | |
onPressed: () { | |
appState.toggleFavorite(); | |
}, | |
icon: Icon(icon), | |
label: const Text('Like'), | |
), | |
const SizedBox(width: 10), | |
ElevatedButton( | |
onPressed: () { | |
appState.getNext(); | |
}, | |
child: const 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.displayLarge! | |
.copyWith(color: theme.colorScheme.onPrimary); | |
return Card( | |
color: theme.colorScheme.primary, | |
child: Padding( | |
padding: const EdgeInsets.all(20), | |
child: Text( | |
pair.asLowerCase, | |
style: style, | |
semanticsLabel: "${pair.first} ${pair.second}", | |
), | |
), | |
); | |
} | |
} | |
class SmallCard extends StatelessWidget { | |
const SmallCard({ | |
super.key, | |
required this.pair, | |
}); | |
final WordPair pair; | |
@override | |
Widget build(BuildContext context) { | |
final theme = Theme.of(context); | |
final style = theme.textTheme.displaySmall! | |
.copyWith(color: theme.colorScheme.onPrimary); | |
return Card( | |
color: theme.colorScheme.primary, | |
child: Padding( | |
padding: const EdgeInsets.all(10), | |
child: Text( | |
pair.asLowerCase, | |
style: style, | |
semanticsLabel: "${pair.first} ${pair.second}", | |
), | |
), | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment