diff --git a/lib/app_theme.dart b/lib/app_theme.dart new file mode 100644 index 0000000..306eaf4 --- /dev/null +++ b/lib/app_theme.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +class AppTheme { + AppTheme._(); + + static ThemeData get lightTheme => _baseTheme( + colorScheme: ColorScheme.fromSeed( + seedColor: Colors.indigo, + brightness: Brightness.light, + ), + ); + + static ThemeData get darkTheme => _baseTheme( + colorScheme: ColorScheme.fromSeed( + seedColor: Colors.indigo, + brightness: Brightness.dark, + ), + ); + + static ThemeData _baseTheme({required ColorScheme colorScheme}) { + final theme = ThemeData(useMaterial3: true, colorScheme: colorScheme); + final universalBorderRadius = BorderRadius.circular(12); + + return theme.copyWith( + inputDecorationTheme: InputDecorationTheme( + border: OutlineInputBorder(borderRadius: universalBorderRadius), + ), + + listTileTheme: ListTileThemeData( + shape: RoundedRectangleBorder( + borderRadius: universalBorderRadius, + side: BorderSide(color: colorScheme.secondaryContainer, width: 2), + ), + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index cf4ea08..4b87d97 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import 'app_theme.dart'; import 'model/repositories/local_repository.dart'; import 'pages/task_edit_page.dart'; import 'pages/task_overview_page.dart'; @@ -33,6 +34,8 @@ class MainApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( + theme: AppTheme.lightTheme, + darkTheme: AppTheme.darkTheme, routes: { TaskOverviewPage.routeName: (context) => TaskOverviewPage(), TaskEditPage.routeName: (context) => TaskEditPage(), diff --git a/lib/pages/task_edit_page.dart b/lib/pages/task_edit_page.dart index 36c2d1d..a25d716 100644 --- a/lib/pages/task_edit_page.dart +++ b/lib/pages/task_edit_page.dart @@ -80,7 +80,9 @@ class _TaskEditPageState extends State { horizontal: MediaQuery.of(context).size.width * 0.05, ), child: Column( + spacing: 12, children: [ + SizedBox(height: 6), TextFormField( autofocus: true, controller: titleController, diff --git a/lib/pages/task_overview_page.dart b/lib/pages/task_overview_page.dart index 9f26226..6ef7ddd 100644 --- a/lib/pages/task_overview_page.dart +++ b/lib/pages/task_overview_page.dart @@ -22,11 +22,16 @@ class _TaskOverviewPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(), - body: ReorderableListView.builder( - itemBuilder: itemBuilder, - itemCount: tasks.length, - onReorderItem: context.controller().reorderTask, + appBar: AppBar(title: Text('Hallo Yannick')), + body: Padding( + padding: EdgeInsetsGeometry.symmetric( + horizontal: MediaQuery.of(context).size.width * 0.05, + ), + child: ReorderableListView.builder( + itemBuilder: itemBuilder, + itemCount: tasks.length, + onReorderItem: context.controller().reorderTask, + ), ), floatingActionButton: FloatingActionButton( onPressed: onCreateTaskTapped, @@ -38,27 +43,31 @@ class _TaskOverviewPageState extends State { Widget itemBuilder(BuildContext context, int index) { final task = tasks.elementAt(index); - return TaskDismissible( + return Padding( key: Key(task.id), - onDismissedRight: () => - context.controller().deleteTask(task), - child: ListTile( - title: Text(task.title), - subtitle: task.description.isNotEmpty ? Text(task.description) : null, - trailing: Checkbox( - value: task.isCompleted, - onChanged: (isCompleted) => context - .controller() - .saveTask(task.copyWith(isCompleted: isCompleted)), + padding: const EdgeInsets.only(bottom: 12), + child: TaskDismissible( + key: Key(task.id), + onDismissedRight: () => + context.controller().deleteTask(task), + child: ListTile( + title: Text(task.title), + subtitle: task.description.isNotEmpty ? Text(task.description) : null, + trailing: Checkbox( + value: task.isCompleted, + onChanged: (isCompleted) => context + .controller() + .saveTask(task.copyWith(isCompleted: isCompleted)), + ), + onTap: () async { + final result = await onTaskTapped(task); + if (result != null && context.mounted) { + context.controller().saveTask( + result.toTask(id: task.id), + ); + } + }, ), - onTap: () async { - final result = await onTaskTapped(task); - if (result != null && context.mounted) { - context.controller().saveTask( - result.toTask(id: task.id), - ); - } - }, ), ); }