add detail page

This commit is contained in:
2026-03-03 09:56:06 +01:00
parent 18c156c9d1
commit 4e385c28bf
11 changed files with 1863 additions and 144 deletions

128
lib/pages/home_view.dart Normal file
View File

@@ -0,0 +1,128 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../controllers/home_controller.dart';
import '../models/filament_model.dart';
import '../widgets/filament_card.dart';
import '../widgets/glass_app_bar.dart';
import '../pages/detail_view.dart';
class HomePage extends GetView<HomeController> {
static const String namedRoute = '/home-page';
const HomePage({super.key});
@override
Widget build(BuildContext context) {
final homeCtrl = controller;
return Scaffold(
extendBodyBehindAppBar: true,
appBar: GlassAppBar(
title: 'Filament Tracker',
subtitle: 'Verwalte deine Filamente',
),
floatingActionButton: FloatingActionButton(
onPressed: homeCtrl.openAddDialog,
backgroundColor: const Color(0xFF7B9FFF),
foregroundColor: Colors.white,
tooltip: 'Filament hinzufügen',
child: const Icon(Icons.add_rounded),
),
body: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFF0D0F14),
Color(0xFF141824),
Color(0xFF1A2035),
Color(0xFF0F1520),
],
stops: [0.0, 0.35, 0.65, 1.0],
),
),
child: Obx(() {
if (homeCtrl.isloading.value) {
return const Center(child: CircularProgressIndicator());
}
if (homeCtrl.filaments.isEmpty) {
return const Center(
child: Text(
'Noch keine Filamente vorhanden.\nKlicke auf "+" um ein Filament hinzuzufügen.',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 16, color: Colors.white70),
),
);
}
return LayoutBuilder(
builder: (context, constraints) {
final isWide = constraints.maxWidth >= 700;
return CustomScrollView(
slivers: [
SliverPadding(
padding: EdgeInsets.only(
top: MediaQuery.of(context).padding.top + 96,
left: isWide ? 24 : 16,
right: isWide ? 24 : 16,
bottom: 96,
),
sliver: isWide
? SliverGrid(
gridDelegate:
const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 560,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
childAspectRatio: 1.3,
),
delegate: SliverChildBuilderDelegate(
(context, i) =>
_buildCard(homeCtrl, homeCtrl.filaments[i]),
childCount: homeCtrl.filaments.length,
),
)
: SliverList(
delegate: SliverChildBuilderDelegate(
(context, i) => Padding(
padding: const EdgeInsets.only(bottom: 16),
child: _buildCard(
homeCtrl,
homeCtrl.filaments[i],
),
),
childCount: homeCtrl.filaments.length,
),
),
),
],
);
},
);
}),
),
);
}
Widget _buildCard(HomeController ctrl, FilamentModel filament) {
return FilamentCard(
filament: filament,
onTap: () async {
final result = await Get.toNamed(DetailPage.namedRoute, arguments: filament);
// 'deleted' → Filament aus der lokalen Liste entfernen
if (result == 'deleted') {
ctrl.deleteFilamentLocal(filament);
}
// Wurde bearbeitet → geändertes Filament zurück übergeben
if (result is FilamentModel) {
ctrl.editFilament(result);
}
},
onEdit: () => ctrl.openEditDialog(filament),
onDelete: () => ctrl.deleteFilament(filament),
);
}
}