Not perfect but not to bad

This commit is contained in:
Niklas 2024-10-01 19:50:38 +02:00
parent 1b44798ef0
commit 18257ff1d2
10 changed files with 1072 additions and 853 deletions

View File

@ -1,7 +1,7 @@
import UIKit
import Flutter
@UIApplicationMain
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,

View File

@ -1,32 +1,35 @@
import 'package:flutter/material.dart';
import 'package:learn_project/screens/home.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:learn_project/screens/account_page.dart';
import 'package:learn_project/screens/login_page.dart';
import 'package:learn_project/screens/splash_page.dart';
//import 'package:learn_project/screens/account_page.dart';
//import 'package:learn_project/screens/login_page.dart';
//import 'package:learn_project/screens/splash_page.dart';
import 'utils/constants.dart';
//import 'utils/constants.dart';
Future<void> main() async {
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Supabase.initialize(
url: 'https://vvtefqdqahcpzgolvupv.supabase.co',
anonKey: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InZ2dGVmcWRxYWhjcHpnb2x2dXB2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTYwMjE3ODksImV4cCI6MjAzMTU5Nzc4OX0.6g5EtS9HrgxC6cpCYgOT0HLpA4lEnASQbKs9mfnUM7k',
//Locale
//url:'http://192.168.179.86:8000/',//
// annonKey: //Constants.supabaseAnnonKey,//'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InZ2dGVmcWRxYWhjcHpnb2x2dXB2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTYwMjE2NTIsImV4cCI6MjAzMTU5NzY1Mn0.1bp5V61Oguo5zLUhCFJmCabUY1sujeISr_CR2XUKvh4',//
anonKey:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InZ2dGVmcWRxYWhjcHpnb2x2dXB2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTYwMjE3ODksImV4cCI6MjAzMTU5Nzc4OX0.6g5EtS9HrgxC6cpCYgOT0HLpA4lEnASQbKs9mfnUM7k',
//Locale
//url:'http://192.168.179.86:8000/',//
// annonKey: //Constants.supabaseAnnonKey,//'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InZ2dGVmcWRxYWhjcHpnb2x2dXB2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTYwMjE2NTIsImV4cCI6MjAzMTU5NzY1Mn0.1bp5V61Oguo5zLUhCFJmCabUY1sujeISr_CR2XUKvh4',//
);
runApp( MyApp());
runApp(MyApp());
}
/// Supabase client
final supabase = Supabase.instance.client;
/// Error message to display the user when unexpected error occurs.
const unexpectedErrorMessage = 'Unexpected error occurred.';
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
@ -97,4 +100,4 @@ class _HomePageState extends State<HomePage> {
*/
*/

View File

@ -1,12 +1,29 @@
import 'package:flutter/material.dart';
import 'package:learn_project/screens/subheader_Datepicker.dart';
//import 'package:learn_project/main.dart';
import 'package:intl/intl.dart';
//import 'package:supabase_flutter/supabase_flutter.dart';
class Frame28 extends StatelessWidget {
final List<Map<String, dynamic>> events;
const Frame28({Key? key, required this.events}) : super(key: key);
/* void initState() {
super.initState();
_loadData();
} */
/* */
class Frame28 extends StatelessWidget {
@override
Widget build(BuildContext context) {
var body = SafeArea(
child: Column(
//_loadData();
var body = CustomScrollView(
slivers: [
SliverSafeArea(sliver: SliverToBoxAdapter(
child: Container(
alignment: Alignment.center,
child: Column(
children: <Widget>[
//Header Container
HeaderSection(),
@ -21,577 +38,66 @@ class Frame28 extends StatelessWidget {
Container(
width: 380,
//height: 259,
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
child: Column(
child: const Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// TODO: muss noch angepasst werden jedes mal wenn ein neuer Tag ist wieder diesen Text anzeigen
Text(
'Heute',
style: TextStyle(
color: Color(0xFF171717),
fontSize: 12,
fontFamily: 'Inter',
fontWeight: FontWeight.w600,
height: 0,
),
),
SizedBox(height: 10),
Text( 'Heute', style: TextStyle(color: Color(0xFF171717), fontSize: 12, fontFamily: 'Inter', fontWeight: FontWeight.w600, height: 0,),),
//Kurze Zwischenbereich zum trennen
SizedBox(height: 4),
//EventCard2Section(),
/* const SizedBox(height: 20),
EventCard2Section(),
const SizedBox(height: 20),
Text('Morgen', style: TextStyle(color: Color(0xFF171717), fontSize: 12, fontFamily: 'Inter', fontWeight: FontWeight.w600, height: 0,),),
//Kurze Zwischenbereich zum trennen
const SizedBox(height: 4),
Container(
width: 379,
height: 120,
child: Stack(
children: [
Positioned(
left: 0,
top: 0,
child: Container(
width: 360,
height: 110,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
border: Border(
left: BorderSide(width: 1, color: Color(0xFFBFBCBC)),
top: BorderSide(width: 1, color: Color(0xFFBFBCBC)),
right: BorderSide(color: Color(0xFFBFBCBC)),
bottom: BorderSide(color: Color(0xFFBFBCBC)),
),
boxShadow: [
BoxShadow(
color: Color(0xFFF8AB14),
blurRadius: 0,
offset: Offset(0, 10),
spreadRadius: 0,
)
],
),
),
),
Positioned(
left: 230,
top: 1,
child: Image.asset(
'assets/images/Vector01.png', // Pfad zum Bild
height: 110, // Höhe des Bildes
width: 130, // Breite des Bildes
),
),
Positioned(
right: 30,
top: 12,
child: Container(
width: 32,
height: 32,
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 32,
height: 32,
decoration: BoxDecoration(
color: Color.fromARGB(196, 171, 170, 170), // Hintergrundfarbe des Buttons
shape: BoxShape.circle, // Runde Form
),
child: IconButton(
padding: EdgeInsets.zero, // Entfernt zusätzlichen Abstand
icon: Icon(Icons.bookmark_border_outlined),
color: Colors.white, // Icon-Farbe
iconSize: 16, // Größe des Icons
onPressed: () {
// Aktion beim Drücken des Buttons
},
),
),
],
),
),
),
Positioned(
left: 15,
top: 14,
child: SizedBox(
//width: 55,
//height: 24,
child: Text(
'Suxul',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w800,
height: 0,
),
),
),
),
Positioned(
left: 92,
top: 14,
child: Text(
'Weiberfasching',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w400,
height: 0,
),
),
),
Positioned(
left: 15,
top: 90,
child: SizedBox(
//width: 196,
//height: 15,
child: Text(
'Eintritt: Bis 21 Uhr frei',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 12,
fontFamily: 'Inter',
fontWeight: FontWeight.w400,
height: 0,
),
),
),
),
Positioned(
left: 15,
top: 70,
child: SizedBox(
width: 72.79,
height: 44.40,
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: '20:30',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w800,
height: 0.06,
),
),
])))),
Positioned(
left: 15,
top: 45,
child: SizedBox(
width: 72.79,
height: 44.40,
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: 'Beginn\n',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 12,
fontFamily: 'Inter',
fontWeight: FontWeight.w200,
height: 0.14,
),
),
],
),
),
),
),
],
),
),
const SizedBox(height: 20),
Container(
width: 379,
height: 120,
child: Stack(
children: [
Positioned(
left: 0,
top: 0,
child: Container(
width: 360,
height: 110,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
border: Border(
left: BorderSide(width: 1, color: Color(0xFFBFBCBC)),
top: BorderSide(width: 1, color: Color(0xFFBFBCBC)),
right: BorderSide(color: Color(0xFFBFBCBC)),
bottom: BorderSide(color: Color(0xFFBFBCBC)),
),
boxShadow: [
BoxShadow(
color: Color(0xFFF8AB14),
blurRadius: 0,
offset: Offset(0, 10),
spreadRadius: 0,
)
],
),
),
),
Positioned(
left: 230,
top: 1,
child: Image.asset(
'assets/images/Vector01.png', // Pfad zum Bild
height: 110, // Höhe des Bildes
width: 130, // Breite des Bildes
),
),
Positioned(
right: 30,
top: 12,
child: Container(
width: 32,
height: 32,
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 32,
height: 32,
decoration: BoxDecoration(
color: Color.fromARGB(196, 171, 170, 170), // Hintergrundfarbe des Buttons
shape: BoxShape.circle, // Runde Form
),
child: IconButton(
padding: EdgeInsets.zero, // Entfernt zusätzlichen Abstand
icon: Icon(Icons.bookmark_border_outlined),
color: Colors.white, // Icon-Farbe
iconSize: 16, // Größe des Icons
onPressed: () {
// Aktion beim Drücken des Buttons
},
),
),
],
),
),
),
Positioned(
left: 15,
top: 14,
child: SizedBox(
//width: 55,
//height: 24,
child: Text(
'Suxul',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w800,
height: 0,
),
),
),
),
Positioned(
left: 92,
top: 14,
child: Text(
'Weiberfasching',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w400,
height: 0,
),
),
),
Positioned(
left: 15,
top: 90,
child: SizedBox(
//width: 196,
//height: 15,
child: Text(
'Eintritt: Bis 21 Uhr frei',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 12,
fontFamily: 'Inter',
fontWeight: FontWeight.w400,
height: 0,
),
),
),
),
Positioned(
left: 15,
top: 70,
child: SizedBox(
width: 72.79,
height: 44.40,
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: '20:30',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w800,
height: 0.06,
),
),
])))),
Positioned(
left: 15,
top: 45,
child: SizedBox(
width: 72.79,
height: 44.40,
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: 'Beginn\n',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 12,
fontFamily: 'Inter',
fontWeight: FontWeight.w200,
height: 0.14,
),
),
],
),
),
),
),
],
),
),
],
),
),
const SizedBox(height: 20),
Container(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// TODO: muss noch angepasst werden jedes mal wenn ein neuer Tag ist wieder diesen Text anzeigen
Text(
'Morgen',
style: TextStyle(
color: Color(0xFF171717),
fontSize: 12,
fontFamily: 'Inter',
fontWeight: FontWeight.w600,
height: 0,
),
),
//Kurze Zwischenbereich zum trennen
const SizedBox(height: 4),
Container(
width: 379,
height: 120,
child: Stack(
children: [
Positioned(
left: 0,
top: 0,
child: Container(
width: 360,
height: 110,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
border: Border(
left: BorderSide(width: 1, color: Color(0xFFBFBCBC)),
top: BorderSide(width: 1, color: Color(0xFFBFBCBC)),
right: BorderSide(color: Color(0xFFBFBCBC)),
bottom: BorderSide(color: Color(0xFFBFBCBC)),
),
boxShadow: [
BoxShadow(
color: Color(0xFFF8AB14),
blurRadius: 0,
offset: Offset(0, 10),
spreadRadius: 0,
)
],
),
),
),
Positioned(
left: 230,
top: 1,
child: Image.asset(
'assets/images/Vector01.png', // Pfad zum Bild
height: 110, // Höhe des Bildes
width: 130, // Breite des Bildes
),
),
Positioned(
right: 30,
top: 12,
child: Container(
width: 32,
height: 32,
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 32,
height: 32,
decoration: BoxDecoration(
color: Color.fromARGB(196, 171, 170, 170), // Hintergrundfarbe des Buttons
shape: BoxShape.circle, // Runde Form
),
child: IconButton(
padding: EdgeInsets.zero, // Entfernt zusätzlichen Abstand
icon: Icon(Icons.bookmark_border_outlined),
color: Colors.white, // Icon-Farbe
iconSize: 16, // Größe des Icons
onPressed: () {
// Aktion beim Drücken des Buttons
},
),
),
],
),
),
),
Positioned(
left: 15,
top: 14,
child: SizedBox(
//width: 55,
//height: 24,
child: Text(
'Suxul',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w800,
height: 0,
),
),
),
),
Positioned(
left: 92,
top: 14,
child: Text(
'Weiberfasching',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w400,
height: 0,
),
),
),
Positioned(
left: 15,
top: 90,
child: SizedBox(
//width: 196,
//height: 15,
child: Text(
'Eintritt: Bis 21 Uhr frei',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 12,
fontFamily: 'Inter',
fontWeight: FontWeight.w400,
height: 0,
),
),
),
),
Positioned(
left: 15,
top: 70,
child: SizedBox(
width: 72.79,
height: 44.40,
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: '20:30',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w800,
height: 0.06,
),
),
])))),
Positioned(
left: 15,
top: 45,
child: SizedBox(
width: 72.79,
height: 44.40,
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: 'Beginn\n',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 12,
fontFamily: 'Inter',
fontWeight: FontWeight.w200,
height: 0.14,
),
),
],
),
),
),
),
],
),
),
],
EventCard2Section(),
const SizedBox(height: 20),
EventCard2Section(),
const SizedBox(height: 20),
EventCard2Section(),
const SizedBox(height: 20),
EventCard2Section(),
const SizedBox(height: 20),
EventCard2Section(), */
],
),
),
],
),
),
],
)],),);
),])
),),),
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
return EventCard2Section(
title: events[index]['name'],
description: events[index]['description'],
location: events[index]['location']['name'],
start_time: extractTime24h(events[index]['time'][0]['start_date']),
);
},
childCount: events.length,
),),
]);
return Scaffold(backgroundColor: Colors.white,
body: body,
);
}
}
String extractTime24h(String timestamp) {
try {
DateTime dateTime = DateTime.parse(timestamp);
String hours = dateTime.hour.toString().padLeft(2, '0');
String minutes = dateTime.minute.toString().padLeft(2, '0');
return '$hours:$minutes';
} catch (e) {
print('Error parsing timestamp: $e');
return '--:--'; // or some other error indicator
}
}

View File

@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:learn_project/utils/class.dart';
import 'package:learn_project/utils/widgets.dart';
//import 'package:learn_project/utils/class.dart';
//import 'package:learn_project/utils/widgets.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import 'dart:async';
//import 'dart:async';
class DetailsPage extends StatelessWidget {

View File

@ -3,54 +3,93 @@ import 'package:learn_project/screens/details_db.dart';
import 'package:learn_project/utils/data.dart';
import 'package:learn_project/screens/subheader_Datepicker.dart';
import 'package:learn_project/screens/detail_widget.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:learn_project/main.dart';
class HomePage extends StatelessWidget {
const HomePage({super.key});
Future<List<Map<String, dynamic>>> _loadData() async {
final _data = await supabase.from('events').select();
//get the id of the event
return _data;
//Create a date entry and connect it with the event
// Überprüfe, ob der Insert erfolgreich war
}
Future<List<Map<String, dynamic>>> fetchEvents(String category) async {
try {
final response = await supabase
.from("events")
//.innerJoin('event_category', 'events.id = event_category.event_id')
.select('id,name,description,detail,subheader,location(name),time(start_date),event_category(*), event_category!inner(events_id)')
.eq('event_category.category_id',category);
//select('id, name, cities(id, name)')
//find all events mit Ort und zusatzinfos die die Kathegorie haben welche ausgewählt wurde am heutigen Tag dann kommender Tag usw.
final test = response[0]['time'][0]['start_date'];
return (response as List).cast<Map<String, dynamic>>();
} catch (e) {
throw Exception('Failed to fetch data: $e');
}
}
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
/*24 is for notification bar on Android*/
final double itemHeight = (size.height - kToolbarHeight - 24) / 5;
final double itemWidth = size.width / 2.3;
var body = SafeArea(
child: Column(
children: <Widget>[
//Header Container
HeaderSection(),
//Body Container
Expanded(
child: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return [
SliverToBoxAdapter(
child: Container(
height: 35,
padding: const EdgeInsets.all(0),
child: ButtonSection(), // Dein Button-Bereich
),
headerSliverBuilder:
(BuildContext context, bool innerBoxIsScrolled) {
return [
SliverToBoxAdapter(
child: Container(
height: 35,
padding: const EdgeInsets.all(0),
child: ButtonSection(), // Dein Button-Bereich
),
];
},
body:Column(
children:[
GridView.builder(
shrinkWrap: true, // Damit der GridView korrekt in die Column passt
//physics: NeverScrollableScrollPhysics(), // Deaktiviert das Scrolling des GridView
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, // Anzahl der Spalten im Grid
),
itemCount: Data.recipes.length, // Anzahl der Elemente im Grid
itemBuilder: (BuildContext context, int index) {
),
];
},
body: Column(
children: [
GridView.builder(
shrinkWrap:
true, // Damit der GridView korrekt in die Column passt
//physics: NeverScrollableScrollPhysics(), // Deaktiviert das Scrolling des GridView
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: (itemWidth /
itemHeight), // Anzahl der Spalten im Grid
),
itemCount:
Data.recipes.length, // Anzahl der Elemente im Grid
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: const EdgeInsets.all(6.0),
child: InkWell(
onTap: () {
Navigator.push(
onTap: () async {
/* List<Map<String, dynamic>> events =
await _loadData(); */
List<Map<String, dynamic>> events2 =
await fetchEvents(Data.recipes[index].category);
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => Frame28(
//recipe: Data.recipes[index],
events: events2,
)));
},
child: Card(
color: Color.fromARGB(255, 249, 171, 21),
color: Data.recipes[index].color,//Color.fromARGB(255, 249, 171, 21),
//color: Color.fromARGB(255, 253, 73, 73), //FD4949 //Nachtleben
//color: Color.fromARGB(255, 80, 168, 250), //50A8FA//Kunst
//color: Color.fromARGB(255, 80, 240, 250), //50F0FA //Sport
@ -76,11 +115,12 @@ class HomePage extends StatelessWidget {
tag: Data.recipes[index].id,
child: FadeInImage(
image: AssetImage(
Data.recipes[index].imageUrl,
),
Data.recipes[index].imageUrl,
),
fit: BoxFit.cover,
placeholder: AssetImage(
'assets/images/loading.gif', ),
'assets/images/loading.gif',
),
),
),
),
@ -102,141 +142,21 @@ class HomePage extends StatelessWidget {
),
);
},
),
Image.asset(
'assets/images/FooterFooter.png', // Pfad zum Bild
height: 127, // Höhe des Bildes
width: 390, // Breite des Bildes
),
],
),
),
),
/* Expanded(
child: Column(
children:[
Container(
padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
height: 35,
child: ButtonSection(),
),
Expanded(
child:GridView.builder(
shrinkWrap: false,
itemCount: Data.recipes.length,
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2),
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: const EdgeInsets.all(6.0),
child: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailsPage(
//recipe: Data.recipes[index],
)));
},
child: Card(
color: Color.fromARGB(255, 249, 171, 21),
//color: Color.fromARGB(255, 253, 73, 73), //FD4949 //Nachtleben
//color: Color.fromARGB(255, 80, 168, 250), //50A8FA//Kunst
//color: Color.fromARGB(255, 80, 240, 250), //50F0FA //Sport
//color: Color.fromARGB(255, 130, 73, 253), //8249FD //Gesundheit
//color: Color.fromARGB(255, 253, 73, 73), //FD4949//Essen
//color: Color.fromARGB(255, 255, 0, 199), //FF00C7//Soziales
//color: Color.fromARGB(255, 66, 255, 0), //42FF00//Familie
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6.0),
),
child: Container(
width: MediaQuery.of(context).size.width / 2,
height: 50,
child: Column(
children: <Widget>[
Expanded(
child: ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(6.0),
topRight: Radius.circular(6.0),
),
child: Hero(
tag: Data.recipes[index].id,
child: FadeInImage(
image: AssetImage(
Data.recipes[index].imageUrl),
fit: BoxFit.cover,
placeholder: AssetImage(
'assets/images/loading.gif'),
),
),
),
),
Text(
Data.recipes[index].title,
style: TextStyle(
color: Colors.white,
fontSize: 20,
fontWeight: FontWeight.bold),
),
Padding(
padding: const EdgeInsets.all(2.0),
),
],
),
),
),
),
);
}),
),Image.asset(
'assets/images/FooterFooter.png', // Pfad zum Bild
height: 127, // Höhe des Bildes
width: 390, // Breite des Bildes
),],
),
), */
//Footer Container
//Here you will get unexpected behaviour when keyboard pops-up.
//So its better to use `bottomNavigationBar` to avoid this.
/* Container(
padding: const EdgeInsets.all(8.0),
color: Colors.white,
alignment: Alignment.center,
child:
Image.asset(
'assets/images/FooterFooter.png', // Pfad zum Bild
height: 127, // Höhe des Bildes
width: 390, // Breite des Bildes
),
), */
),
Image.asset(
'assets/images/FooterFooter.png', // Pfad zum Bild
height: 127, // Höhe des Bildes
width: 390, // Breite des Bildes
),
],
),
),
),
],
),
);
return Scaffold(
/* appBar: AppBar(
centerTitle: true,
title: Text('Recipes'),
titleTextStyle: TextStyle(
color: Colors.white, fontWeight: FontWeight.bold, fontSize: 20),
backgroundColor: Color(0xff263341),
actions: <Widget>[
IconButton(
icon: Icon(Icons.search),
onPressed: () {},
)
],
), */
backgroundColor: Colors.white,
body: body,
);

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:learn_project/utils/helper_functions.dart';
class ButtonSection extends StatelessWidget {
@override
@ -59,109 +60,780 @@ class HeaderSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.fromLTRB(5, 2, 5, 5),
height: 76,
color: Colors.white,
alignment: Alignment.bottomLeft,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
SizedBox(
height: 50, //height of button
//width of button
child: IconButton(
icon: Image.asset('assets/images/logo.png'),
onPressed: () {},
),
),
const SizedBox(
//width of button
width: 10,
),
SizedBox(
height: 10, //height of button
width: 20, //width of button
child: Icon(Icons.keyboard_arrow_down),
),
const SizedBox(
//width of button
width: 10,
),
SizedBox(
width: 100.0,
child: TextField(
controller: TextEditingController(text: "Ingolstadt"),
decoration: InputDecoration(
border: UnderlineInputBorder(),
),
),
),
// const SizedBox(
// //width of button
// width: 40,
// ),
SizedBox(width:3),
Spacer(),
SizedBox(
height: 41, //height of button
//width of button
child: IconButton(
icon: const Icon(Icons.search),
onPressed: () {},
),
),
const SizedBox(
height: 40,
child: VerticalDivider(
thickness: 1,
width: 20,
color: Colors.black,
),
),
SizedBox(
height: 50, //height of button
//width of button
child: IconButton(
icon: Image.asset('assets/images/Login.png'),
onPressed: () {},
),
),
]),
const Divider(
height: 1,
thickness: 1,
indent: 0,
endIndent: 0,
color: Colors.black,
padding: const EdgeInsets.fromLTRB(5, 2, 5, 5),
height: 76,
color: Colors.white,
alignment: Alignment.bottomLeft,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
SizedBox(
height: 50, //height of button
//width of button
child: IconButton(
icon: Image.asset('assets/images/logo.png'),
onPressed: () {},
),
),
],
const SizedBox(
//width of button
width: 10,
),
SizedBox(
height: 10, //height of button
width: 20, //width of button
child: Icon(Icons.keyboard_arrow_down),
),
const SizedBox(
//width of button
width: 10,
),
SizedBox(
width: 100.0,
child: TextField(
controller: TextEditingController(text: "Ingolstadt"),
decoration: InputDecoration(
border: UnderlineInputBorder(),
),
),
),
// const SizedBox(
// //width of button
// width: 40,
// ),
SizedBox(width: 3),
Spacer(),
SizedBox(
height: 41, //height of button
//width of button
child: IconButton(
icon: const Icon(Icons.search),
onPressed: () {},
),
),
const SizedBox(
height: 40,
child: VerticalDivider(
thickness: 1,
width: 20,
color: Colors.black,
),
),
SizedBox(
height: 50, //height of button
//width of button
child: IconButton(
icon: Image.asset('assets/images/Login.png'),
onPressed: () {},
),
),
]),
const Divider(
height: 1,
thickness: 1,
indent: 0,
endIndent: 0,
color: Colors.black,
),
],
),
);
}
}
class EventCard2Section extends StatelessWidget {
final String title;
final String description;
final String location;
final String start_time;
const EventCard2Section({
Key? key,
required this.title,
required this.description,
required this.location,
required this.start_time,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: 379,
height: 120,
child: Stack(
children: [
Positioned(
left: 0,
top: 0,
child: Container(
width: 360,
height: 110,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
border: Border(
left: BorderSide(width: 1, color: Color(0xFFBFBCBC)),
top: BorderSide(width: 1, color: Color(0xFFBFBCBC)),
right: BorderSide(color: Color(0xFFBFBCBC)),
bottom: BorderSide(color: Color(0xFFBFBCBC)),
),
boxShadow: [
BoxShadow(
color: Color(0xFFF8AB14),
blurRadius: 0,
offset: Offset(0, 10),
spreadRadius: 0,
)
],
),
),
);}}
/* child: SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 30.0),
child: Column(
children: <Widget>[
),
Positioned(
left: 230,
top: 1,
child: Image.asset(
'assets/images/Vector01.png', // Pfad zum Bild
height: 110, // Höhe des Bildes
width: 130, // Breite des Bildes
),
),
Positioned(
right: 30,
top: 12,
child: Container(
width: 32,
height: 32,
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
color: Colors.red,
height: 200.0,
alignment: Alignment.center,
child: Text("Content 1"),
),
Container(
color: Colors.green,
height: 300.0,
alignment: Alignment.center,
child: Text("Content 1"),
),
//TextField nearly at bottom
TextField(
decoration: InputDecoration(hintText: "Enter Text Here"),
width: 32,
height: 32,
decoration: BoxDecoration(
color: Color.fromARGB(
196, 171, 170, 170), // Hintergrundfarbe des Buttons
shape: BoxShape.circle, // Runde Form
),
child: IconButton(
padding: EdgeInsets.zero, // Entfernt zusätzlichen Abstand
icon: Icon(Icons.bookmark_border_outlined),
color: Colors.white, // Icon-Farbe
iconSize: 16, // Größe des Icons
onPressed: () {
// Aktion beim Drücken des Buttons
},
),
),
],
),
), */
),
),
Positioned(
left: 15,
top: 14,
child: SizedBox(
//width: 55,
//height: 24,
child: Text(
location,
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w800,
height: 0,
),
),
),
),
Positioned(
left: 92,
top: 14,
child: Text(
title,
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w400,
height: 0,
),
),
),
Positioned(
left: 15,
top: 90,
child: SizedBox(
//width: 196,
//height: 15,
child: Text(
shortenText(description,30),
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 12,
fontFamily: 'Inter',
fontWeight: FontWeight.w400,
height: 0,
),
),
),
),
Positioned(
left: 15,
top: 70,
child: SizedBox(
width: 72.79,
height: 44.40,
child: Text.rich(TextSpan(children: [
TextSpan(
text: start_time,
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w800,
height: 0.06,
),
),
])))),
Positioned(
left: 15,
top: 45,
child: SizedBox(
width: 72.79,
height: 44.40,
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: 'Beginn\n',
style: TextStyle(
color: Color(0xFF0A0A0A),
fontSize: 12,
fontFamily: 'Inter',
fontWeight: FontWeight.w200,
height: 0.14,
),
),
],
),
),
),
),
],
),
);
}
}
class GesundheitWellnes extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
Container(
width: 167,
height: 130,
child: Stack(
children: [
Positioned(
left: 0,
top: 0,
child: Container(
width: 167,
height: 130,
decoration: ShapeDecoration(
image: DecorationImage(
image: NetworkImage("https://via.placeholder.com/167x130"),
fit: BoxFit.cover,
),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
shadows: [
BoxShadow(
color: Color(0xFFF9AB15),
blurRadius: 0,
offset: Offset(0, 10),
spreadRadius: 0,
)
],
),
),
),
Positioned(
left: 16,
top: 15,
child: Text(
'64',
style: TextStyle(
color: Colors.white,
fontSize: 18,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
),
Positioned(
left: 13,
top: 86,
child: Text(
'Musik',
style: TextStyle(
color: Colors.white,
fontSize: 24,
fontFamily: 'Inter',
fontWeight: FontWeight.w800,
height: 0,
),
),
),
Positioned(
left: 127,
top: 9,
child: Container(
width: 31,
height: 31,
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(),
),
),
],
),
),
],
);
}
}
class TagSlider extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
Container(
width: 390,
height: 73,
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 73,
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 145,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Hip Hop/Rap',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 143,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'EDM/Elektro',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 102,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Elektro',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 180,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Klassische Musik',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 86,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Rock',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 187,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Singer/Songwriter',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 78,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Rap',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 123,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'DJ/Dance',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 78,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Pop',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 256,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Lateinamerikanische Musik',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 110,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Hip Hop',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 84,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Jazz',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 91,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Metal',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
Container(
width: 79,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8),
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
side: BorderSide(width: 1),
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'R6B',
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontFamily: 'Inter',
fontWeight: FontWeight.w500,
height: 0,
),
),
],
),
),
],
),
),
],
),
),
],
);
}
}

View File

@ -1,3 +1,5 @@
import 'dart:ui';
class Nutrients {
String name;
String weight;
@ -6,7 +8,8 @@ class Nutrients {
}
class Recipe {
String id, imageUrl, title;
String id, imageUrl, title,category;
Color color;
List<String> steps;
List<String> ingredients;
List<Nutrients> nutrients;
@ -16,5 +19,7 @@ class Recipe {
required this.imageUrl,
required this.steps,
required this.ingredients,
required this.nutrients});
required this.nutrients,
required this.color,
required this.category});
}

View File

@ -2,6 +2,10 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:learn_project/utils/class.dart';
//import 'dart:convert';
import 'package:learn_project/main.dart';
import 'package:intl/intl.dart' as intl;
import 'package:supabase_flutter/supabase_flutter.dart';
const Duration fakeAPIDuration = Duration(milliseconds: 50);
const Duration debounceDuration = Duration(milliseconds: 50);
class Data {
@ -10,6 +14,8 @@ class Data {
id: '1',
title: 'Musik',
imageUrl: 'assets/images/Musik.png',
color: Color.fromARGB(255, 249, 171, 21), //FD4949 //Musik
category: '34725c49-740b-45c5-8a51-7c742f92a621',
nutrients: [
Nutrients(name: 'Calories', weight: '200', percent: 0.7),
Nutrients(name: 'Protein', weight: '10gm', percent: 0.5),
@ -30,6 +36,8 @@ class Data {
id: '2',
title: 'Nachtleben',
imageUrl: 'assets/images/Nachtleben.png',
color: Color.fromARGB(255, 253, 73, 73), //FD4949 //Nachtleben
category: '2d8c714e-3290-4d8c-8a95-e3b100ad8599',
nutrients: [
Nutrients(name: 'Calories', weight: '200', percent: 0.7),
Nutrients(name: 'Protein', weight: '10gm', percent: 0.5),
@ -50,6 +58,8 @@ class Data {
id: '3',
title: 'Kunst & Kultur',
imageUrl: 'assets/images/Soziales.png',
color: Color.fromARGB(255, 80, 168, 250), //50A8FA//Kunst
category: '09d1f862-2b56-47af-8ee6-3c50056e3fa2',
nutrients: [
Nutrients(name: 'Calories', weight: '100', percent: 0.2),
Nutrients(name: 'Protein', weight: '10gm', percent: 0.7),
@ -71,6 +81,8 @@ class Data {
id: '4',
title: 'Sport & Verein',
imageUrl: 'assets/images/Sport.png',
color: Color.fromARGB(255, 80, 240, 250), //50F0FA //Sport
category: '',
nutrients: [
Nutrients(name: 'Calories', weight: '200', percent: 0.7),
Nutrients(name: 'Protein', weight: '10gm', percent: 0.5),
@ -88,9 +100,11 @@ class Data {
'4 ounces milk'
]),
Recipe(
id: '4',
id: '5',
title: 'Gesundheit',
imageUrl: 'assets/images/Gesundheit.png',
color: Color.fromARGB(255, 130, 73, 253), //8249FD //Gesundheit
category: '',
nutrients: [
Nutrients(name: 'Calories', weight: '200', percent: 0.7),
Nutrients(name: 'Protein', weight: '10gm', percent: 0.5),
@ -108,9 +122,11 @@ class Data {
'4 ounces milk'
]),
Recipe(
id: '4',
id: '6',
title: 'Essen & Trinken',
imageUrl: 'assets/images/Essen.png',
color: Color.fromARGB(255, 253, 73, 73), //FD4949//Essen
category: '',
nutrients: [
Nutrients(name: 'Calories', weight: '200', percent: 0.7),
Nutrients(name: 'Protein', weight: '10gm', percent: 0.5),
@ -129,12 +145,90 @@ class Data {
]),
];
//color: Color.fromARGB(255, 255, 0, 199), //FF00C7//Soziales
//color: Color.fromARGB(255, 66, 255, 0), //42FF00//Familie,
}
class SupabaseDataService {
Future<List<Map<String, dynamic>>> fetchEvents(String cathegory) async {
try {
final response = await supabase
.from("events")
.select('id,name,description,detail,subheader,location(name),time(startdate)')
.eq('category(id)',cathegory);
//select('id, name, cities(id, name)')
//find all events mit Ort und zusatzinfos die die Kathegorie haben welche ausgewählt wurde am heutigen Tag dann kommender Tag usw.
return (response as List).cast<Map<String, dynamic>>();
} catch (e) {
throw Exception('Failed to fetch data: $e');
}
}
Future<Map<String, dynamic>> fetchSingleRecord(String tableName, String id) async {
try {
final response = await supabase
.from(tableName)
.select()
.eq('id', id)
.single();
return response as Map<String, dynamic>;
} catch (e) {
throw Exception('Failed to fetch record: $e');
}
}
/* Future<void> insertData(String tableName, Map<String, dynamic> data) async {
try {
final response = await supabase
.from(tableName)
.insert(data);
if (response.error != null) {
throw response.error!;
}
} catch (e) {
throw Exception('Failed to insert data: $e');
}
}
Future<void> updateData(String tableName, String id, Map<String, dynamic> data) async {
try {
final response = await supabase
.from(tableName)
.update(data)
.eq('id', id);
if (response.error != null) {
throw response.error!;
}
} catch (e) {
throw Exception('Failed to update data: $e');
}
}
Future<void> deleteData(String tableName, String id) async {
try {
final response = await _supabase
.from(tableName)
.delete()
.eq('id', id);
if (response.error != null) {
throw response.error!;
}
} catch (e) {
throw Exception('Failed to delete data: $e');
}
} */
}
/* class _AsyncAutocomplete extends StatefulWidget {
const _AsyncAutocomplete();

View File

@ -0,0 +1,19 @@
String shortenText(String text, int maxLength) {
// Wenn der Text kürzer als die maximale Länge ist, gib den Text unverändert zurück
if (text.length <= maxLength) {
return text;
}
// Den Text bis zur maximalen Länge abschneiden
String shortened = text.substring(0, maxLength);
// Überprüfen, ob das Zeichen nach der abgeschnittenen Länge ein Leerzeichen ist
// Wenn nicht, das letzte vollständige Wort suchen und entfernen
int lastSpace = shortened.lastIndexOf(' ');
if (lastSpace != -1) {
shortened = shortened.substring(0, lastSpace);
}
// Drei Punkte hinzufügen
return '$shortened...';
}

View File

@ -308,18 +308,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
url: "https://pub.dev"
source: hosted
version: "10.0.4"
version: "10.0.5"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
url: "https://pub.dev"
source: hosted
version: "3.0.3"
version: "3.0.5"
leak_tracker_testing:
dependency: transitive
description:
@ -348,18 +348,18 @@ packages:
dependency: transitive
description:
name: material_color_utilities
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
version: "0.8.0"
version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: "https://pub.dev"
source: hosted
version: "1.12.0"
version: "1.15.0"
mime:
dependency: transitive
description:
@ -601,10 +601,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
url: "https://pub.dev"
source: hosted
version: "0.7.0"
version: "0.7.2"
timeago:
dependency: "direct main"
description:
@ -697,10 +697,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
url: "https://pub.dev"
source: hosted
version: "14.2.1"
version: "14.2.5"
web:
dependency: transitive
description: