made a small prototype with a navbar

This commit is contained in:
Odweta
2026-03-22 17:18:36 +01:00
parent ea85589767
commit 0219155f8e
15 changed files with 212 additions and 113 deletions
+2 -2
View File
@@ -6,7 +6,7 @@ plugins {
} }
android { android {
namespace = "com.example.frontend" namespace = "app.odweta.novehlasky"
compileSdk = flutter.compileSdkVersion compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion ndkVersion = flutter.ndkVersion
@@ -21,7 +21,7 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.example.frontend" applicationId = "app.odweta.novehlasky"
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config. // For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion minSdk = flutter.minSdkVersion
+3
View File
@@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:
+33 -110
View File
@@ -1,122 +1,45 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'strings.dart';
import 'main_scaffold.dart';
// pages
import 'pages/list.dart';
import 'pages/add.dart';
import 'pages/flashcards.dart';
import 'pages/leaderboard.dart';
import 'pages/settings.dart';
void main() { void main() {
runApp(const MyApp()); runApp(HlaskovnikFrontendApp());
} }
class MyApp extends StatelessWidget { class HlaskovnikFrontendApp extends StatelessWidget {
const MyApp({super.key}); HlaskovnikFrontendApp({super.key});
// This widget is the root of your application. final _router = GoRouter(
@override routes: [
Widget build(BuildContext context) { ShellRoute(
return MaterialApp( builder: (context, state, child) {
title: 'Flutter Demo', return MainScaffold(child: child);
theme: ThemeData( },
// This is the theme of your application. routes: [
// GoRoute(path: '/', builder: (context, state) => ListPage()),
// TRY THIS: Try running your application with "flutter run". You'll see GoRoute(path: '/add', builder: (context, state) => AddPage()),
// the application has a purple toolbar. Then, without quitting the app, GoRoute(path: '/flashcards', builder: (context, state) => FlashcardsPage()),
// try changing the seedColor in the colorScheme below to Colors.green GoRoute(path: '/leaderboard', builder: (context, state) => LeaderboardPage()),
// and then invoke "hot reload" (save your changes or press the "hot GoRoute(path: '/settings', builder: (context, state) => SettingsPage()),
// reload" button in a Flutter-supported IDE, or press "r" if you used ],
// the command line to start the app).
//
// Notice that the counter didn't reset back to zero; the application
// state is not lost during the reload. To reset the state, use hot
// restart instead.
//
// This works for code too, not just values: Most code changes can be
// tested with just a hot reload.
colorScheme: .fromSeed(seedColor: Colors.deepPurple),
), ),
home: const MyHomePage(title: 'Flutter Demo Home Page'), ],
); );
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
// This call to setState tells the Flutter framework that something has
// changed in this State, which causes it to rerun the build method below
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear to happen.
_counter++;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done return MaterialApp.router(
// by the _incrementCounter method above. title: Strings.appName,
// routerConfig: _router,
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// TRY THIS: Try changing the color here to a specific color (to
// Colors.amber, perhaps?) and trigger a hot reload to see the AppBar
// change color while the other colors stay the same.
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
// Column is also a layout widget. It takes a list of children and
// arranges them vertically. By default, it sizes itself to fit its
// children horizontally, and tries to be as tall as its parent.
//
// Column has various properties to control how it sizes itself and
// how it positions its children. Here we use mainAxisAlignment to
// center the children vertically; the main axis here is the vertical
// axis because Columns are vertical (the cross axis would be
// horizontal).
//
// TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint"
// action in the IDE, or press "p" in the console), to see the
// wireframe for each widget.
mainAxisAlignment: .center,
children: [
const Text('You have pushed the button this many times:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
); );
} }
} }
+53
View File
@@ -0,0 +1,53 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'strings.dart';
class MainScaffold extends StatelessWidget {
final Widget child;
const MainScaffold({super.key, required this.child});
int _locationToIndex(String location) {
switch (location) {
case '/': return 0;
case '/add': return 1;
case '/flashcards': return 2;
case '/leaderboard': return 3;
case '/settings': return 4;
default: return 0;
}
}
@override
Widget build(BuildContext context) {
final location = GoRouterState.of(context).uri.toString();
final currentIndex = _locationToIndex(location);
return Scaffold(
body: child,
bottomNavigationBar: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
currentIndex: currentIndex,
onTap: (index) {
switch (index) {
case 0: context.go('/'); break;
case 1: context.go('/add'); break;
case 2: context.go('/flashcards'); break;
case 3: context.go('/leaderboard'); break;
case 4: context.go('/settings'); break;
}
},
items: [
BottomNavigationBarItem(icon: Icon(Icons.list), label: Strings.list),
BottomNavigationBarItem(icon: Icon(Icons.add), label: Strings.add),
BottomNavigationBarItem(icon: Icon(Icons.repeat), label: Strings.flashcards),
BottomNavigationBarItem(icon: Icon(Icons.leaderboard), label: Strings.leaderboard),
BottomNavigationBarItem(icon: Icon(Icons.settings), label: Strings.settings),
],
),
);
}
}
+13
View File
@@ -0,0 +1,13 @@
// quote model class
class Quote{
final int index;
final String author;
final String body;
const Quote({
required this.index,
required this.author,
required this.body,
});
}
+10
View File
@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class AddPage extends StatelessWidget {
const AddPage({super.key});
@override
Widget build(BuildContext context) {
return const Center(child: Text('add page!'));
}
}
+10
View File
@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class FlashcardsPage extends StatelessWidget {
const FlashcardsPage({super.key});
@override
Widget build(BuildContext context) {
return const Center(child: Text('flashcards! flip flip'));
}
}
+10
View File
@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class LeaderboardPage extends StatelessWidget {
const LeaderboardPage({super.key});
@override
Widget build(BuildContext context) {
return const Center(child: Text('top 3!'));
}
}
+10
View File
@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class ListPage extends StatelessWidget {
const ListPage({super.key});
@override
Widget build(BuildContext context) {
return Center(child: const Text('list page!'));
}
}
+10
View File
@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class SettingsPage extends StatelessWidget {
const SettingsPage({super.key});
@override
Widget build(BuildContext context) {
return const Center(child: Text('let\'s set something up!'));
}
}
@@ -0,0 +1,7 @@
// talks to the DB itself
// TODO: mock for now!
class QuoteRepository {
final String _dbBaseUrl = 'https://hlaskovnik-reimagined-latest.onrender.com';
}
+1
View File
@@ -0,0 +1 @@
// gets all quotes from the database and returns them in a list
+10
View File
@@ -0,0 +1,10 @@
class Strings {
static const String appName = "Nový Hláškovník";
static const String apiKey = "2ogD5kc4sw3JVZoouQSV0w3LGRjSj5IjVFnAnk7IRCIK0ktONCeoOYinbNLSIHuU";
static const String list = "Seznam";
static const String add = "Přidat";
static const String flashcards = "Flashkarty";
static const String leaderboard = "Žebříčky";
static const String settings = "Nastavení";
}
+38 -1
View File
@@ -75,6 +75,19 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
go_router:
dependency: "direct main"
description:
name: go_router
sha256: "7974313e217a7771557add6ff2238acb63f635317c35fa590d348fb238f00896"
url: "https://pub.dev"
source: hosted
version: "17.1.0"
leak_tracker: leak_tracker:
dependency: transitive dependency: transitive
description: description:
@@ -107,6 +120,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.0" version: "6.1.0"
logging:
dependency: transitive
description:
name: logging
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
url: "https://pub.dev"
source: hosted
version: "1.3.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@@ -131,6 +152,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.0" version: "1.17.0"
nested:
dependency: transitive
description:
name: nested
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
path: path:
dependency: transitive dependency: transitive
description: description:
@@ -139,6 +168,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.1" version: "1.9.1"
provider:
dependency: "direct main"
description:
name: provider
sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272"
url: "https://pub.dev"
source: hosted
version: "6.1.5+1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -210,4 +247,4 @@ packages:
version: "15.0.2" version: "15.0.2"
sdks: sdks:
dart: ">=3.11.3 <4.0.0" dart: ">=3.11.3 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54" flutter: ">=3.35.0"
+2
View File
@@ -34,6 +34,8 @@ dependencies:
# The following adds the Cupertino Icons font to your application. # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.8 cupertino_icons: ^1.0.8
provider:
go_router:
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: