Author SHA1 Message Date
Jonas Braus 69b37754d4 Update spaceHome.dart 2024-11-25 16:53:41 +01:00
Jonas Braus cba4a82d67 Fix Language in Title 2024-11-25 16:46:58 +01:00
Jonas Braus 122c9e7ba8 Better Home Icon 2024-11-25 16:43:19 +01:00
Jonas Braus 5b346976f2 Fix Image Scaling Issue
+ on click outside textfield, close keyboard
2024-11-25 16:40:48 +01:00
Jonas Braus 8ab4e4cd5f Fix the home Button 2024-11-25 16:08:10 +01:00
Jonas Braus 5e77e4c1b3 merge fix, aber home-button putt 2024-11-25 14:40:42 +01:00
Jonas Braus b5203caed0 Merge branch 'language_translation' into 'main'
Language Change

See merge request brausjonas/mensaapp!13
2024-11-25 13:24:34 +00:00
Jonas Braus 8a0187a81e Merge branch 'main' into 'language_translation'
# Conflicts:
#   lib/main.dart
2024-11-25 13:23:58 +00:00
Jonas Braus 1b352bed37 Merge branch 'homehomescreen' into 'main'
CreatedHomeHomeScreen

See merge request brausjonas/mensaapp!12
2024-11-25 13:21:12 +00:00
Ali bf5e6a8bf4 Language Change
Dictionary has been modified, all texts are being translated now
2024-11-25 01:41:44 +01:00
Jonas Braus b480768a98 CreatedHomeHomeScreen 2024-11-25 00:58:39 +01:00
Jonas Braus 431efb359c Merge branch 'language_branch' into 'main'
language

See merge request brausjonas/mensaapp!11
2024-11-24 21:14:29 +00:00
Ali ee079e435a Language Pushi Push
This Contains A lot of new Functions. None of them commented.

Selected Language will be highlighted
2024-11-24 22:13:18 +01:00
Jonas Braus b9a9453346 Merge branch 'selectEssenPage' into 'main'
Essen auswählen

See merge request brausjonas/mensaapp!10
2024-11-24 21:09:33 +00:00
Jonas Braus 4b24d16387 Bug Fix for Bug Fix 2024-11-24 22:09:11 +01:00
Jonas Braus b7de4065f8 Cached Http-Request
und gefixxt: tastur überlagert sich mit eingabefeld
2024-11-24 21:59:39 +01:00
Ali a9109ebf71 language
englisch german and ... french.... (we had to) texts written into assets directory

has json format for fast access
2024-11-24 14:37:16 +01:00
Jonas Braus f870be4af7 Essen auswählen
Stand jetzt: essen von der Website gezogen: Schöner: Warten auf API-Key
2024-11-24 14:35:44 +01:00
Jonas Braus d3a211efb9 Merge branch 'delete_ratings' into 'main'
delete all kinda stuff

See merge request brausjonas/mensaapp!9
2024-11-24 12:25:39 +00:00
Jonas Braus 5cf675b36a Merge branch 'BackgroundImages' into 'main'
BackgroundImages (AI) inserted

See merge request brausjonas/mensaapp!8
2024-11-24 12:24:50 +00:00
Ali 9a737c2328 Pages Updated
All Pages updated to the new Design

Ambiente Icon Changes
2024-11-23 19:32:49 +01:00
Ali 3cdc1dc169 delete all kinda stuff
delete function implemented
on pressed -> pop up => are you sure about that?
yes: all rating from all pages will be cleared
no: nothing happens, pop closes
2024-11-23 17:52:12 +01:00
Jonas Braus b0b0a5c36d BackgroundImages (AI) inserted 2024-11-23 12:44:30 +01:00
Jonas Braus 1eea491da0 Restliche Seiten
Für die unterschiedlichen Fragen wurden Place-Holder implementiert --> Muss der Kunde sagen XD
2024-11-23 01:35:33 +01:00
Jonas Braus ffe28fcdbc Merge branch 'SendDeleteButton' into 'main'
Implemented Send and Delete

See merge request brausjonas/mensaapp!7
2024-11-21 15:19:36 +00:00
Jonas Braus a8eea18fad Merge branch 'dev_please_be_alive' into 'main'
Puuush

See merge request brausjonas/mensaapp!6
2024-11-21 15:19:03 +00:00
Ali f4b58dcec2 Puuush
Puuush it! PUUUUUSH IT
2024-11-21 16:17:59 +01:00
Jonas Braus 488abbbb53 Implemented Send and Delete
Floating Action Button + Semi floating action button
2024-11-21 16:07:16 +01:00
Ali 5dd69624b2 Merge branch 'dev_rating_spezielleErnaehrung' 2024-11-21 15:30:47 +01:00
Jonas Braus 833159af21 Merge branch 'PageEssen' into 'main'
Page Essen - Mit Provider

See merge request brausjonas/mensaapp!3
2024-11-21 14:26:43 +00:00
Jonas Braus 4a1fc19349 Page Essen - Mit Provider 2024-11-21 15:26:12 +01:00
32 changed files with 1635 additions and 170 deletions
+3 -3
View File
@@ -11,12 +11,12 @@ android {
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
jvmTarget = 17
}
defaultConfig {
+1 -1
View File
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
+2 -2
View File
@@ -18,8 +18,8 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "8.1.0" apply false
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
id "com.android.application" version "8.3.2" apply false
id "org.jetbrains.kotlin.android" version "2.0.20" apply false
}
include ":app"
Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

+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:
+37 -106
View File
@@ -1,7 +1,18 @@
import 'dart:ffi';
import 'package:flutter/material.dart';
import 'package:google_nav_bar/google_nav_bar.dart';
import 'package:mensaapp/providers/ambienteProvider.dart';
import 'package:mensaapp/providers/anmerkungProvider.dart';
import 'package:mensaapp/providers/essenProvider.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:mensaapp/providers/pageProvider.dart';
import 'package:mensaapp/providers/serviceProvider.dart';
import 'package:mensaapp/providers/spaceProvider.dart';
import 'package:mensaapp/providers/spezielleErnaehrungProvider.dart';
import 'package:provider/provider.dart';
import 'dart:convert';
import 'package:flutter/services.dart' show rootBundle;
void main() {
runApp(const MyApp());
@@ -17,9 +28,31 @@ class MyApp extends StatelessWidget {
providers: [
ChangeNotifierProvider(
create: (context) => PageProvider(),
),
ChangeNotifierProvider(
create: (context) => EssenProvider(),
),
ChangeNotifierProvider(
create: (context) => ServiceProvider(),
),
ChangeNotifierProvider(
create: (context) => AmbienteProvider(),
),
ChangeNotifierProvider(
create: (context) => AnmerkungProvider(),
),
ChangeNotifierProvider(
create: (context) => SpezielleErnaehrungProvider(),
),
ChangeNotifierProvider(
create: (context) => LanguageProvider(),
),
ChangeNotifierProvider(
create: (context) => SpaceProvider(),
)
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: const ColorScheme(
primary: Color.fromRGBO(236, 92, 61, 1),
@@ -45,112 +78,10 @@ class MyHome extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(
Icons.home,
size: 36,
color: Theme.of(context).colorScheme.onPrimary,
),
onPressed: () {
// Aktion für diesen Button
},
),
title: Consumer<PageProvider>( // Consumer verwenden, um den dynamischen Titel anzuzeigen
builder: (context, pageProvider, child) {
return Container(
height: 40,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.primaryContainer,
borderRadius: BorderRadius.circular(15),
),
alignment: Alignment.centerLeft,
child: Text(
pageProvider.titleString[pageProvider.selectedPage], // Hier wird der dynamische Titel angezeigt
style: TextStyle(
color: Theme.of(context).colorScheme.onPrimary,
fontWeight: FontWeight.bold,
),
),
);
},
),
backgroundColor: Theme.of(context).colorScheme.primary,
actions: [
IconButton(
icon: Image.asset(
'assets/flags/de.png',
width: 34,
height: 24,
fit: BoxFit.cover,
), // Erster Button rechts
onPressed: () {
// Aktion für diesen Button
},
),
IconButton(
icon: Image.asset(
'assets/flags/fr.png',
width: 34,
height: 24,
fit: BoxFit.cover,
), // Zweiter Button rechts
onPressed: () {
// Aktion für diesen Button
},
),
IconButton(
icon: Image.asset(
'assets/flags/en.png',
width: 34,
height: 24,
fit: BoxFit.cover,
), // Dritter Button rechts
onPressed: () {
// Aktion für diesen Button
},
),
],
),
body: Consumer<PageProvider>(
builder: (context, pageProvider, child) {
return pageProvider.pages[pageProvider.selectedPage];
},
),
bottomNavigationBar: Padding(
padding: EdgeInsets.all(5),
child: GNav(
onTabChange: (index) {
Provider.of<PageProvider>(context, listen: false).changePage(index);
},
gap: 8,
style: GnavStyle.google,
backgroundColor: Theme.of(context).colorScheme.surface,
color: Theme.of(context).colorScheme.onSurface,
activeColor: Theme.of(context).colorScheme.onPrimary,
tabBackgroundColor: Theme.of(context).colorScheme.primary,
tabs: const [
GButton(
icon: Icons.fastfood_outlined,
text: "Essen",
),GButton(
icon: Icons.landscape,
text: "Ambiente",
),GButton(
icon: Icons.mood,
text: "Service",
),GButton(
icon: Icons.feedback,
text: "Anmerkungen",
), GButton(
icon: Icons.grass,
text: "Spezielle Ernährung",
),
],
),
),
return Consumer<SpaceProvider>(
builder: (context, spaceProvider, child) {
return spaceProvider.spaces[spaceProvider.selectedSpace];
}
);
}
}
View File
+75
View File
@@ -0,0 +1,75 @@
import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
class FetchMenu {
static var lastFetch = DateTime.now();
static var fetched = false;
static Future<List<String>> get() async {
List<String> menus = [];
if (!fetched || DateTime.now().difference(lastFetch).inHours >= 2) {
menus = await fromRequest();
fetched = true;
} else {
menus = await fromCache();
}
return menus;
}
static Future<List<String>> fromCache() async {
return await loadCache();
}
static Future<List<String>> fromRequest() async {
List<String> menus = [];
http.Response resp = await http.get(Uri.parse(
"https://www.swfr.de/essen/mensen-cafes-speiseplaene/mensa-loerrach"));
var content = resp.body.split("<h3>");
var innerContent = content[1].split("\n");
for (var s in innerContent) {
if (s.contains("extra-text mb-15px")) {
var name = (s.split("\">")[1].split("</")[0]).replaceAll("<br>", " ");
menus.add(name);
}
}
await storeCache(menus);
lastFetch = DateTime.now();
return menus;
}
static Future<void> storeCache(List<String> menus) async {
var prefs = await SharedPreferences.getInstance();
for (var i = 0; i < 4; i++) {
prefs.setString("menuCache$i", "");
if (i < menus.length) {
prefs.setString("menuCache$i", menus[i]);
}
}
}
static Future<List<String>> loadCache() async {
var prefs = await SharedPreferences.getInstance();
List<String> menus = [];
for (var i = 0; i < 4; i++) {
var curr = prefs.getString("menuCache$i");
if (curr != "") {
menus.add(curr!);
}
}
return menus;
}
}
+5 -4
View File
@@ -2,16 +2,17 @@ import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
class RatingStars extends StatelessWidget {
const RatingStars({super.key, required this.onRate});
const RatingStars({super.key, required this.onRate, required this.initRating});
final Function onRate;
final double initRating;
@override
Widget build(BuildContext context) {
return RatingBar.builder(
initialRating: 0,
initialRating: initRating,
minRating: 1,
itemSize: 80,
itemSize: 60,
direction: Axis.horizontal,
allowHalfRating: false,
itemCount: 5,
@@ -23,7 +24,7 @@ class RatingStars extends StatelessWidget {
);
},
onRatingUpdate: (rating) {
onRate();
onRate(rating);
},
);
}
+104 -1
View File
@@ -1,10 +1,113 @@
import 'package:flutter/material.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:provider/provider.dart';
import '../modules/ratingStars.dart';
import '../providers/ambienteProvider.dart';
class PageAmbiente extends StatelessWidget {
const PageAmbiente({super.key});
@override
Widget build(BuildContext context) {
return const Placeholder();
return Consumer<LanguageProvider>(builder: (context, languageProvider, child){
return Scaffold(
body: Stack(
children: [
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/backgrounds/Ambiente.jpg"),
fit: BoxFit.cover,
colorFilter: ColorFilter.mode(
Colors.white.withOpacity(0.2),
BlendMode.dstATop
),
)
),
),
Center(
child: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.8),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(80),
bottomRight: Radius.circular(80)
)
),
width: 600,
height: 400,
padding: EdgeInsets.symmetric(horizontal: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageAmbiente"]["question1"],
style: TextStyle(fontSize: 35),
),
Consumer<AmbienteProvider>(
builder: (context, essenProvider, child) {
return RatingStars(onRate: (value) {
essenProvider.setRatingFrage1(value);
}, initRating: essenProvider.ratingFrage1,);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageAmbiente"]["question2"],
style: TextStyle(fontSize: 35),
),
Consumer<AmbienteProvider>(
builder: (context, essenProvider, child) {
return RatingStars(onRate: (value) {
essenProvider.setRatingFrage2(value);
}, initRating: essenProvider.ratingFrage2,);
},
)
],
),
const SizedBox(
height: 50,
),
Consumer<AmbienteProvider>(
builder: (context, essenProvider, child) {
return TextFormField(
initialValue: essenProvider.freiText,
onChanged: (value) {
essenProvider.setFreiText(value);
},
autofocus: false,
maxLength: 500,
maxLines: 4,
decoration: InputDecoration(
labelText: Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["textfield"],
labelStyle: const TextStyle(fontSize: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15)
),
),
style: TextStyle(fontSize: 20),
);
},
)
],
),
),
),
)
],
),
);
}
);
}
}
+106 -1
View File
@@ -1,10 +1,115 @@
import 'package:flutter/material.dart';
import 'package:mensaapp/providers/anmerkungProvider.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:provider/provider.dart';
import '../modules/ratingStars.dart';
class PageAnmerkungen extends StatelessWidget {
const PageAnmerkungen({super.key});
@override
Widget build(BuildContext context) {
return const Placeholder();
return Consumer<LanguageProvider>(builder: (context, languageProvider, child)
{
return Scaffold(
body: Stack(
children: [
Container(
width: 1600,
height: 800,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/backgrounds/Anmerkungen.jpg"),
fit: BoxFit.cover,
colorFilter: ColorFilter.mode(
Colors.white.withOpacity(0.2), BlendMode.dstATop),
)),
),
Center(
child: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.8),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(80),
bottomRight: Radius.circular(80))),
padding: EdgeInsets.symmetric(horizontal: 20),
height: 400,
width: 600,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageAnmerkungen"]["question1"],
style: TextStyle(fontSize: 35),
),
Consumer<AnmerkungProvider>(
builder: (context, essenProvider, child) {
return RatingStars(
onRate: (value) {
essenProvider.setRatingFrage1(value);
},
initRating: essenProvider.ratingFrage1,
);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageAnmerkungen"]["question2"],
style: TextStyle(fontSize: 35),
),
Consumer<AnmerkungProvider>(
builder: (context, essenProvider, child) {
return RatingStars(
onRate: (value) {
essenProvider.setRatingFrage2(value);
},
initRating: essenProvider.ratingFrage2,
);
},
)
],
),
const SizedBox(
height: 50,
),
Consumer<AnmerkungProvider>(
builder: (context, essenProvider, child) {
return TextFormField(
initialValue: essenProvider.freiText,
onChanged: (value) {
essenProvider.setFreiText(value);
},
autofocus: false,
maxLength: 500,
maxLines: 4,
decoration: InputDecoration(
labelText: Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["textfield"],
labelStyle: const TextStyle(fontSize: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15)),
),
style: TextStyle(fontSize: 20),
);
},
)
],
),
),
),
)
],
),
);
});
}
}
+141 -7
View File
@@ -1,19 +1,153 @@
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:mensaapp/modules/fetchMenu.dart';
import 'package:mensaapp/modules/ratingEmote.dart';
import 'package:mensaapp/modules/ratingStars.dart';
import 'package:mensaapp/providers/essenProvider.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:mensaapp/providers/pageProvider.dart';
import 'package:provider/provider.dart';
class PageEssen extends StatelessWidget {
const PageEssen({super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: [
RatingStars(onRate: () {})
],
),
);
final FocusNode _focus = FocusNode();
return Consumer<LanguageProvider>(builder: (context, languageProvider, child){
return GestureDetector(
onTap: () {
_focus.unfocus();
},
child: Scaffold(
body: Stack(
children: [
// Hintergrundbild
Center(
child: Container(
width: MediaQuery.of(context).size.width * 0.8,
height: MediaQuery.of(context).size.height,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/backgrounds/Essen.jpg"),
fit: BoxFit.cover, // Deckt den gesamten Bildschirm ab
colorFilter: ColorFilter.mode(
Colors.white.withOpacity(0.6),
BlendMode.dstATop,
),
),
),
),
),
// Vordergrundinhalte
Center(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Consumer<PageProvider>(
builder: (context, pageProvider, child) {
return Text(
pageProvider.selectedEssenName,
style: TextStyle(fontSize: 40, fontWeight: FontWeight.bold),
);
},
),
const SizedBox(
height: 30,
),
Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.9),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(80),
bottomRight: Radius.circular(80))),
height: 400,
width: 600,
padding: EdgeInsets.symmetric(horizontal: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageEssen"]["question1"],
style: TextStyle(fontSize: 35),
),
Consumer<EssenProvider>(
builder: (context, essenProvider, child) {
return RatingStars(
onRate: (value) {
essenProvider.setRatingGeschmack(value);
},
initRating: essenProvider.ratingGeschmack,
);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageEssen"]["question2"],
style: TextStyle(fontSize: 35),
),
Consumer<EssenProvider>(
builder: (context, essenProvider, child) {
return RatingStars(
onRate: (value) {
essenProvider.setRatingQuali(value);
},
initRating: essenProvider.ratingQuali,
);
},
)
],
),
const SizedBox(
height: 50,
),
Consumer<EssenProvider>(
builder: (context, essenProvider, child) {
return TextFormField(
initialValue: essenProvider.freiText,
onChanged: (value) {
essenProvider.setFreiText(value);
},
autofocus: false,
maxLength: 500,
maxLines: 4,
focusNode: _focus,
decoration: InputDecoration(
labelText: Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["textfield"],
labelStyle: const TextStyle(fontSize: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15),
),
),
onFieldSubmitted: (value) {
Navigator.pop(context);
},
style: TextStyle(fontSize: 20),
);
},
),
],
),
),
],
),
),
),
],
),
),
);
});
}
}
+67
View File
@@ -0,0 +1,67 @@
import 'package:flutter/material.dart';
import 'package:mensaapp/modules/fetchMenu.dart';
import 'package:mensaapp/providers/pageProvider.dart';
import 'package:provider/provider.dart';
class PageEssenSelect extends StatelessWidget {
const PageEssenSelect({super.key});
@override
Widget build(BuildContext context) {
List<String> menus = [];
Future<void> fetchMenu() async {
menus = await FetchMenu.get();
}
return FutureBuilder(
future: fetchMenu(),
builder: (context, snapshot) {
return Scaffold(
body: Stack(
children: [
Center(
child: Container(
width: MediaQuery.of(context).size.width * 0.8,
height: MediaQuery.of(context).size.height,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/backgrounds/Essen.jpg"),
fit: BoxFit.cover, // Deckt den gesamten Bildschirm ab
colorFilter: ColorFilter.mode(
Colors.white.withOpacity(0.6),
BlendMode.dstATop,
),
),
),
),
),
Center(
child: Container(
child: Wrap(
direction: Axis.horizontal,
alignment: WrapAlignment.center,
runSpacing: 50,
spacing: 50,
children: [
for (int i = 0; i < menus.length; i++)
FilledButton.icon(
style: ButtonStyle(padding: WidgetStatePropertyAll(EdgeInsets.all(40))),
icon: const Icon(Icons.fastfood_outlined),
label: Text("Essen ${i + 1}: ${menus[i]}", style: TextStyle(fontSize: 24),),
onPressed: () {
Provider.of<PageProvider>(context, listen: false).setSelectedEssen(i + 1, "Essen ${i + 1}: ${menus[i]}");
},
)
],
),
),
)
],
),
);
},
);
}
}
+115 -1
View File
@@ -1,10 +1,124 @@
import 'package:flutter/material.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:mensaapp/providers/serviceProvider.dart';
import 'package:provider/provider.dart';
import '../modules/ratingStars.dart';
class PageService extends StatelessWidget {
const PageService({super.key});
@override
Widget build(BuildContext context) {
return const Placeholder();
final FocusNode _focus = FocusNode();
return Consumer<LanguageProvider>(builder: (context, languageProvider, child){
return GestureDetector(
onTap: () {
_focus.unfocus();
},
child: Scaffold(
body: Stack(
children: [
Center(
child: Container(
width: MediaQuery.of(context).size.width * 0.8,
height: MediaQuery.of(context).size.height,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/backgrounds/Service.jpg"),
fit: BoxFit.cover,
colorFilter: ColorFilter.mode(
Colors.white.withOpacity(0.6),
BlendMode.dstATop
),
)
),
),
),
Center(
child: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.9),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(80),
bottomRight: Radius.circular(80)
)
),
width: 600,
height: 400,
padding: EdgeInsets.symmetric(horizontal: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageService"]["question1"],
style: TextStyle(fontSize: 35),
),
Consumer<ServiceProvider>(
builder: (context, essenProvider, child) {
return RatingStars(onRate: (value) {
essenProvider.setRatingFrage1(value);
}, initRating: essenProvider.ratingFrage1,);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageService"]["question2"],
style: TextStyle(fontSize: 35),
),
Consumer<ServiceProvider>(
builder: (context, essenProvider, child) {
return RatingStars(onRate: (value) {
essenProvider.setRatingFrage2(value);
}, initRating: essenProvider.ratingFrage2,);
},
)
],
),
const SizedBox(
height: 50,
),
Consumer<ServiceProvider>(
builder: (context, essenProvider, child) {
return TextFormField(
initialValue: essenProvider.freiText,
onChanged: (value) {
essenProvider.setFreiText(value);
},
autofocus: false,
maxLength: 500,
maxLines: 4,
focusNode: _focus,
decoration: InputDecoration(
labelText: Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["textfield"],
labelStyle: const TextStyle(fontSize: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15)
),
),
style: TextStyle(fontSize: 20),
);
},
)
],
),
),
),
)
],
),
),
);
});
}
}
+117 -30
View File
@@ -2,44 +2,131 @@ import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:mensaapp/modules/ratingEmote.dart';
import 'package:mensaapp/modules/ratingStars.dart';
import 'package:mensaapp/providers/languageProvider.dart';
import 'package:mensaapp/providers/spezielleErnaehrungProvider.dart';
import 'package:provider/provider.dart';
class PageSpezielleErnaehrung extends StatelessWidget {
const PageSpezielleErnaehrung({super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Container(
width: 800,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(
height: 50,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
"Sitzmöglichkeit*",
style: TextStyle(fontSize: 35),
final FocusNode _focus = FocusNode();
return Consumer<LanguageProvider>(builder: (context, languageProvider, child) {
return GestureDetector(
onTap: () {
_focus.unfocus();
},
child: Scaffold(
body: Stack(
children: [
Center(
child: Container(
width: MediaQuery.of(context).size.width * 0.8,
height: MediaQuery.of(context).size.height,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/backgrounds/Anmerkungen.jpg"),
fit: BoxFit.cover,
colorFilter: ColorFilter.mode(
Colors.white.withOpacity(0.6), BlendMode.dstATop),
)),
),
RatingStars(onRate: () {})
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
"Keine Ahnung*",
style: TextStyle(fontSize: 35),
),
Center(
child: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.9),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(80),
bottomRight: Radius.circular(80))),
width: 650,
height: 450,
padding: EdgeInsets.symmetric(horizontal: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageSpecial"]["question1"],
style: TextStyle(fontSize: 35),
),
Consumer<SpezielleErnaehrungProvider>(
builder:
(context, spezielleErnaehrungProvider, child) {
return RatingStars(
onRate: (value) {
spezielleErnaehrungProvider
.setRatingSitzmoeglichkeit(value);
},
initRating: spezielleErnaehrungProvider
.ratingSitzmoeglichkeit,
);
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["pageSpecial"]["question2"],
style: TextStyle(fontSize: 35),
),
Consumer<SpezielleErnaehrungProvider>(
builder:
(context, spezielleErnaehrungProvider, child) {
return RatingStars(
onRate: (value) {
spezielleErnaehrungProvider
.setRatingKeineAhnung(value);
},
initRating:
spezielleErnaehrungProvider.ratingKeineAhnung,
);
},
),
],
),
const SizedBox(
height: 50,
),
Consumer<SpezielleErnaehrungProvider>(
builder: (context, spezielleErnaehrungProvider, child) {
return TextFormField(
initialValue: spezielleErnaehrungProvider.freiText,
onChanged: (value) {
spezielleErnaehrungProvider.setFreiText(value);
},
autofocus: false,
maxLength: 500,
maxLines: 5,
focusNode: _focus,
decoration: InputDecoration(
labelText: Provider.of<LanguageProvider>(context).languageData[Provider.of<LanguageProvider>(context).language]["textfield"],
labelStyle: const TextStyle(fontSize: 20),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15)),
),
style: TextStyle(fontSize: 20),
);
},
)
],
),
),
),
RatingStars(onRate: () {})
],
)
],
)
],
),
),
),
);
);
});
}
}
+29
View File
@@ -0,0 +1,29 @@
import 'package:flutter/cupertino.dart';
class AmbienteProvider extends ChangeNotifier {
double ratingFrage1 = 0;
double ratingFrage2 = 0;
String freiText = "";
void setRatingFrage1(double rating) {
ratingFrage1 = rating;
notifyListeners();
}
void setRatingFrage2(double rating) {
ratingFrage2 = rating;
notifyListeners();
}
void setFreiText(String text) {
freiText = text;
notifyListeners();
}
void resetAllFields(){
freiText = "";
ratingFrage1 = 0;
ratingFrage2 = 0;
notifyListeners();
}
}
+29
View File
@@ -0,0 +1,29 @@
import 'package:flutter/cupertino.dart';
class AnmerkungProvider extends ChangeNotifier {
double ratingFrage1 = 0;
double ratingFrage2 = 0;
String freiText = "";
void setRatingFrage1(double rating) {
ratingFrage1 = rating;
notifyListeners();
}
void setRatingFrage2(double rating) {
ratingFrage2 = rating;
notifyListeners();
}
void setFreiText(String text) {
freiText = text;
notifyListeners();
}
void resetAllFields(){
freiText = "";
ratingFrage1 = 0;
ratingFrage2 = 0;
notifyListeners();
}
}
+29
View File
@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
class EssenProvider extends ChangeNotifier {
double ratingGeschmack = 0;
double ratingQuali = 0;
String freiText = "";
void setRatingGeschmack(double rating) {
ratingGeschmack = rating;
notifyListeners();
}
void setRatingQuali(double rating) {
ratingQuali = rating;
notifyListeners();
}
void setFreiText(String text) {
freiText = text;
notifyListeners();
}
void resetAllFields(){
freiText = "";
ratingGeschmack = 0;
ratingQuali = 0;
notifyListeners();
}
}
+151
View File
@@ -0,0 +1,151 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class LanguageProvider extends ChangeNotifier {
Map<String, dynamic> languageData = {
"de":
{
"textfield": "Dein Feedback",
"pageAmbiente":
{
"question1": "Frage1",
"question2": "Frage2",
},
"pageAnmerkungen":
{
"question1": "Frage1",
"question2": "Frage2",
},
"pageEssen":
{
"question1": "Geschmack",
"question2": "Qualität",
},
"pageHome":
{
},
"pageService":
{
"question1": "Frage1",
"question2": "Frage2",
},
"pageSpecial":
{
"question1": "Frage1",
"question2": "Frage2",
},
"navBar":
{
"0": "Essen",
"1": "Service",
"2": "Spezielle Ernährung"
},
"floating":
{
"info": "* Pflichtfeld",
"return": "Absenden",
"delete":
{
"title": "Bewertungen löschen",
"info": "Möchtest du alle Eingaben entfernen?",
"keep": "Behalten",
"del": "Löschen"
}
}
},
"en":
{
"textfield": "Your Feedback",
"pageAmbiente": {
"question1": "Question1",
"question2": "Question2",
},
"pageAnmerkungen": {
"question1": "Question1",
"question2": "Question2",
},
"pageEssen": {
"question1": "Taste",
"question2": "Quality",
},
"pageHome": {
},
"pageService": {
"question1": "Question1",
"question2": "Question2",
},
"pageSpecial": {
"question1": "Question1",
"question2": "Question2",
},
"navBar": {
"0": "Food",
"1": "Service",
"2": "Special Diet"
},
"floating": {
"info": "* Required field",
"return": "Submit",
"delete":
{
"title": "Delete Reviews",
"info": "Do you want to remove all entries?",
"keep": "Keep",
"del": "Delete"
}
}
},
"fr":
{
"textfield": "Votre avis",
"pageAmbiente": {
"question1": "Question1",
"question2": "Question2",
},
"pageAnmerkungen": {
"question1": "Question1",
"question2": "Question2",
},
"pageEssen": {
"question1": "Goût",
"question2": "Qualité",
},
"pageHome": {
},
"pageService": {
"question1": "Question1",
"question2": "Question2",
},
"pageSpecial": {
"question1": "Question1",
"question2": "Question2",
},
"navBar": {
"0": "Nourriture",
"1": "Service",
"2": "Régime spécial"
},
"floating": {
"info": "* Champ obligatoire",
"return": "Envoyer",
"delete": {
"title": "Supprimer les avis",
"info": "Voulez-vous supprimer toutes les entrées ?",
"keep": "Garder",
"del": "Supprimer"
}
}
}
};
String language = "de";
void setLanguage(String newLanguage) {
language = newLanguage;
notifyListeners();
}
}
+18 -11
View File
@@ -1,30 +1,37 @@
import 'package:flutter/material.dart';
import 'package:mensaapp/pages/pageAmbiente.dart';
import 'package:mensaapp/pages/pageEssen.dart';
import 'package:mensaapp/pages/pageEssenSelect.dart';
import 'package:mensaapp/pages/pageService.dart';
import 'package:mensaapp/pages/pageAnmerkungen.dart';
import 'package:mensaapp/pages/pageSpezielleErnaehrung.dart';
class PageProvider extends ChangeNotifier {
int selectedPage = 0;
int selectedEssenID = 0;
String selectedEssenName = "";
List<Widget> pages = [
const PageEssen(),
const PageAmbiente(),
const PageEssenSelect(),
const PageService(),
const PageAnmerkungen(),
const PageSpezielleErnaehrung()
];
List<String> titleString = [
"Essen",
"Ambiente",
"Service",
"Anmerkungen",
"Spezielle Ernährung"
];
void changePage(int index) {
selectedPage = index;
notifyListeners();
}
void setSelectedEssen(int id, String name) {
selectedEssenName = name;
selectedEssenID = id;
pages[0] = const PageEssen();
notifyListeners();
}
void resetSelectedEssen() {
selectedEssenName = "";
selectedEssenID = 0;
pages[0] = const PageEssenSelect();
notifyListeners();
}
}
+29
View File
@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
class ServiceProvider extends ChangeNotifier {
double ratingFrage1 = 0;
double ratingFrage2 = 0;
String freiText = "";
void setRatingFrage1(double rating) {
ratingFrage1 = rating;
notifyListeners();
}
void setRatingFrage2(double rating) {
ratingFrage2 = rating;
notifyListeners();
}
void setFreiText(String text) {
freiText = text;
notifyListeners();
}
void resetAllFields(){
freiText = "";
ratingFrage1 = 0;
ratingFrage2 = 0;
notifyListeners();
}
}
+17
View File
@@ -0,0 +1,17 @@
import 'package:flutter/cupertino.dart';
import 'package:mensaapp/spaces/spaceHome.dart';
import 'package:mensaapp/spaces/spaceRate.dart';
class SpaceProvider extends ChangeNotifier {
var selectedSpace = 0;
var spaces = [
const SpaceHome(),
const SpaceRate()
];
void setSelectedSpace(int index) {
selectedSpace = index;
notifyListeners();
}
}
@@ -0,0 +1,30 @@
import 'package:flutter/material.dart';
class SpezielleErnaehrungProvider extends ChangeNotifier {
double ratingSitzmoeglichkeit = 0;
double ratingKeineAhnung = 0;
String freiText = "";
void setRatingSitzmoeglichkeit(double rating) {
ratingSitzmoeglichkeit = rating;
notifyListeners();
}
void setRatingKeineAhnung(double rating) {
ratingKeineAhnung = rating;
notifyListeners();
}
void setFreiText(String text) {
freiText = text;
notifyListeners();
}
void resetAllFields(){
freiText = "";
ratingSitzmoeglichkeit = 0;
ratingKeineAhnung = 0;
notifyListeners();
}
}
+96
View File
@@ -0,0 +1,96 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:mensaapp/providers/spaceProvider.dart';
import 'package:provider/provider.dart';
class SpaceHome extends StatefulWidget {
const SpaceHome({super.key});
@override
State<SpaceHome> createState() => _SpaceHomeState();
}
class _SpaceHomeState extends State<SpaceHome> {
//TODO: in languageProvider
var tempTexts = [
"Bewerte jetzt deine DHBW-Kantine...",
"Rate your DHBW canteen now...",
"Évaluez votre cantine DHBW maintenant..."
];
//TODO: END-TODO
late Timer _timer;
late String text = "";
var index = 1;
@override
void initState() {
text = tempTexts[0];
super.initState();
_timer = Timer.periodic(
const Duration(seconds: 5),
(timer) {
setState(() {
text = tempTexts[index];
index = (index + 1 >= tempTexts.length ? 0 : index + 1);
});
},
);
}
@override
void dispose() {
_timer.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
onTap: () {
Provider.of<SpaceProvider>(context, listen: false).setSelectedSpace(1);
},
child: Stack(
children: [
Center(
child: Container(
width: 1600,
height: 750,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/backgrounds/Essen.jpg"),
fit: BoxFit.cover, // Deckt den gesamten Bildschirm ab
colorFilter: ColorFilter.mode(
Colors.white.withOpacity(0.2),
BlendMode.dstATop,
),
),
),
),
),
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
text,
style: TextStyle(
fontSize: 70,
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.primary),
),
const SizedBox(height: 40,),
Icon(Icons.touch_app, size: 150, color: Colors.black.withOpacity(0.5),)
],
),
)
],
),
),
);
}
}
+268
View File
@@ -0,0 +1,268 @@
import 'package:flutter/material.dart';
import 'package:google_nav_bar/google_nav_bar.dart';
import 'package:mensaapp/providers/spaceProvider.dart';
import 'package:provider/provider.dart';
import '../providers/ambienteProvider.dart';
import '../providers/anmerkungProvider.dart';
import '../providers/essenProvider.dart';
import '../providers/languageProvider.dart';
import '../providers/pageProvider.dart';
import '../providers/serviceProvider.dart';
import '../providers/spezielleErnaehrungProvider.dart';
class SpaceRate extends StatelessWidget {
const SpaceRate({super.key});
void _showDeleteDialog(BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
title: Text(Provider.of<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(context, listen: false)
.language]["floating"]["delete"]["title"]),
content: Text(
Provider.of<LanguageProvider>(context, listen: false).languageData[
Provider.of<LanguageProvider>(context, listen: false)
.language]["floating"]["delete"]["info"],
style: const TextStyle(fontSize: 18),
),
actions: [
ElevatedButton(
onPressed: () {
Navigator.of(context).pop();
},
style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(context).colorScheme.secondary),
child: Text(Provider.of<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(context, listen: false)
.language]["floating"]["delete"]["keep"]),
),
ElevatedButton(
onPressed: () {
Provider.of<AnmerkungProvider>(context, listen: false)
.resetAllFields();
Provider.of<EssenProvider>(context, listen: false)
.resetAllFields();
Provider.of<AmbienteProvider>(context, listen: false)
.resetAllFields();
Provider.of<ServiceProvider>(context, listen: false)
.resetAllFields();
Provider.of<SpezielleErnaehrungProvider>(context, listen: false)
.resetAllFields();
Provider.of<PageProvider>(context, listen: false)
.resetSelectedEssen();
Provider.of<SpaceProvider>(context, listen: false)
.setSelectedSpace(0);
Provider.of<LanguageProvider>(context, listen: false)
.setLanguage("de");
// Hier Aktion für Löschen ausführen
Navigator.of(context).pop(); // Dialog schließen
},
child: Text(Provider.of<LanguageProvider>(context, listen: false)
.languageData[
Provider.of<LanguageProvider>(context, listen: false)
.language]["floating"]["delete"]["del"]),
)
],
);
},
);
}
@override
Widget build(BuildContext context) {
return Consumer<LanguageProvider>(builder: (context, languageProvider, x) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(
Icons.home_rounded,
size: 36,
color: Theme.of(context).colorScheme.onPrimary,
),
onPressed: () {
_showDeleteDialog(context);
},
),
title: Consumer<PageProvider>(
// Consumer verwenden, um den dynamischen Titel anzuzeigen
builder: (context, pageProvider, child) {
return Container(
height: 40,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.primaryContainer,
borderRadius: BorderRadius.circular(15),
),
alignment: Alignment.centerLeft,
child: Text(
languageProvider.languageData[
Provider.of<LanguageProvider>(context).language]
["navBar"][pageProvider.selectedPage.toString()],
// Hier wird der dynamische Titel angezeigt
style: TextStyle(
color: Theme.of(context).colorScheme.onPrimary,
fontWeight: FontWeight.bold,
),
),
);
},
),
backgroundColor: Theme.of(context).colorScheme.primary,
actions: [
IconButton(
icon: Opacity(
opacity: Provider.of<LanguageProvider>(context).language == "de"
? 1.0 // Voll sichtbar
: 0.4, // Halb durchsichtig
child: Image.asset(
'assets/flags/de.png',
width: 34,
height: 24,
fit: BoxFit.cover,
),
),
onPressed: () {
Provider.of<LanguageProvider>(context, listen: false)
.setLanguage("de");
},
),
IconButton(
icon: Opacity(
opacity: Provider.of<LanguageProvider>(context).language == "en"
? 1.0 // Voll sichtbar
: 0.4, // Halb durchsichtig
child: Image.asset(
'assets/flags/en.png',
width: 34,
height: 24,
fit: BoxFit.cover,
),
),
onPressed: () {
Provider.of<LanguageProvider>(context, listen: false)
.setLanguage("en");
},
),
IconButton(
icon: Opacity(
opacity: Provider.of<LanguageProvider>(context).language == "fr"
? 1.0 // Voll sichtbar
: 0.4, // Halb durchsichtig
child: Image.asset(
'assets/flags/fr.png',
width: 34,
height: 24,
fit: BoxFit.cover,
),
),
onPressed: () {
Provider.of<LanguageProvider>(context, listen: false)
.setLanguage("fr");
},
),
],
),
body: Consumer<PageProvider>(
builder: (context, pageProvider, child) {
return Stack(
children: [
pageProvider.pages[pageProvider.selectedPage],
Positioned(
left: 10,
bottom: 10,
child: IconButton.filled(
padding: const EdgeInsets.all(15),
onPressed: () {
_showDeleteDialog(context); // Dialog anzeigen
},
icon: const Icon(
Icons.delete,
size: 30,
),
style: ButtonStyle(
shape: WidgetStateProperty.all(RoundedRectangleBorder(
borderRadius: BorderRadius.circular(17))),
backgroundColor: WidgetStateProperty.all(
Theme.of(context).colorScheme.primary,
),
),
),
)
],
);
},
),
floatingActionButton: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
Provider.of<LanguageProvider>(context).languageData[
Provider.of<LanguageProvider>(context).language]
["floating"]["info"],
style: TextStyle(fontSize: 15),
),
const SizedBox(
height: 10,
),
FloatingActionButton.extended(
onPressed: () {},
label: Text(
Provider.of<LanguageProvider>(context).languageData[
Provider.of<LanguageProvider>(context).language]
["floating"]["return"],
style: TextStyle(fontSize: 20),
),
icon: const Icon(Icons.send),
)
],
),
bottomNavigationBar: Container(
color: Theme.of(context).colorScheme.secondary,
child: Padding(
padding: const EdgeInsets.all(5),
child: GNav(
onTabChange: (index) {
Provider.of<PageProvider>(context, listen: false)
.changePage(index);
},
gap: 8,
style: GnavStyle.google,
backgroundColor: Colors.transparent,
color: Theme.of(context).colorScheme.onSurface,
activeColor: Theme.of(context).colorScheme.onPrimary,
tabBackgroundColor: Theme.of(context).colorScheme.primary,
tabs: [
GButton(
icon: Icons.fastfood_outlined,
text: Provider.of<LanguageProvider>(context).languageData[
Provider.of<LanguageProvider>(context).language]
["navBar"]["0"],
),
GButton(
icon: Icons.mood,
text: Provider.of<LanguageProvider>(context).languageData[
Provider.of<LanguageProvider>(context).language]
["navBar"]["1"],
),
GButton(
icon: Icons.grass,
text: Provider.of<LanguageProvider>(context).languageData[
Provider.of<LanguageProvider>(context).language]
["navBar"]["2"],
),
],
),
),
),
);
});
}
}
View File
+159 -2
View File
@@ -57,6 +57,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
file:
dependency: transitive
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.1"
flutter:
dependency: "direct main"
description: flutter
@@ -83,6 +99,11 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
google_nav_bar:
dependency: "direct main"
description:
@@ -91,6 +112,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "5.0.7"
http:
dependency: "direct main"
description:
name: http
sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
url: "https://pub.dev"
source: hosted
version: "1.2.2"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
leak_tracker:
dependency: transitive
description:
@@ -163,6 +200,46 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.0"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.3.0"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
provider:
dependency: "direct main"
description:
@@ -171,6 +248,62 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.1.2"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
url: "https://pub.dev"
source: hosted
version: "2.3.3"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab"
url: "https://pub.dev"
source: hosted
version: "2.3.3"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
url: "https://pub.dev"
source: hosted
version: "2.5.3"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
url: "https://pub.dev"
source: hosted
version: "2.4.2"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
sky_engine:
dependency: transitive
description: flutter
@@ -224,6 +357,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.7.2"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.4.0"
vector_math:
dependency: transitive
description:
@@ -240,6 +381,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "14.2.5"
web:
dependency: transitive
description:
name: web
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
url: "https://pub.dev"
source: hosted
version: "1.1.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
sdks:
dart: ">=3.5.3 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"
dart: ">=3.5.2 <4.0.0"
flutter: ">=3.24.0"
+4 -1
View File
@@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: ^3.5.3
sdk: ^3.5.2
# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
@@ -33,6 +33,8 @@ dependencies:
provider: ^6.1.2
google_nav_bar: ^5.0.7
flutter_rating_bar: ^4.0.1
http: ^1.2.2
shared_preferences: ^2.3.3
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
@@ -56,6 +58,7 @@ dev_dependencies:
flutter:
assets:
- assets/flags/
- assets/backgrounds/
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.