diff --git a/lib/controllers/camera_controller.dart b/lib/controllers/camera_controller.dart index 83c34f2..a843bb1 100644 --- a/lib/controllers/camera_controller.dart +++ b/lib/controllers/camera_controller.dart @@ -8,7 +8,13 @@ import 'package:openwardrobe/repositories/app_repository.dart'; class CameraController { final AppRepository _appRepository = GetIt.instance(); + List _selectedImages = []; + List _selectedWebImages = []; + Future> pickImages({bool fromGallery = false}) async { + _selectedImages.clear(); + _selectedWebImages.clear(); + if (kIsWeb) { final result = await FilePicker.platform.pickFiles( type: FileType.image, @@ -16,6 +22,7 @@ class CameraController { ); if (result != null && result.files.isNotEmpty) { + _selectedWebImages = result.files.map((file) => file.bytes!).toList(); return result.files.map((file) => File(file.path!)).toList(); } else { throw Exception('No images selected'); @@ -27,6 +34,7 @@ class CameraController { ); if (pickedFile != null) { + _selectedImages = [File(pickedFile.path)]; return [File(pickedFile.path)]; } else { throw Exception('No image selected'); diff --git a/lib/controllers/settings_account_controller.dart b/lib/controllers/settings_account_controller.dart index a63544f..f8b0646 100644 --- a/lib/controllers/settings_account_controller.dart +++ b/lib/controllers/settings_account_controller.dart @@ -55,6 +55,7 @@ class SettingsAccountController { ); if (pickedFile != null) { + _selectedImages.clear(); return File(pickedFile.path); } else { return null; @@ -68,6 +69,7 @@ class SettingsAccountController { ); if (pickedFile != null) { + _selectedWebImages.clear(); return await pickedFile.readAsBytes(); } else { return null; diff --git a/lib/presentation/blocs/camera/camera_cubit.dart b/lib/presentation/blocs/camera/camera_cubit.dart index f94738a..a914d2e 100644 --- a/lib/presentation/blocs/camera/camera_cubit.dart +++ b/lib/presentation/blocs/camera/camera_cubit.dart @@ -47,4 +47,4 @@ class CameraCubit extends Cubit { } return super.close(); } -} \ No newline at end of file +} diff --git a/lib/ui/screens/camera/page.dart b/lib/ui/screens/camera/page.dart index b6afd45..d97eeca 100644 --- a/lib/ui/screens/camera/page.dart +++ b/lib/ui/screens/camera/page.dart @@ -169,6 +169,7 @@ Future _submitImages() async { @override void dispose() { + context.read().close(); super.dispose(); } @@ -269,4 +270,4 @@ Future _submitImages() async { ), ); } -} \ No newline at end of file +} diff --git a/lib/ui/screens/lookbook/page.dart b/lib/ui/screens/lookbook/page.dart index 6709660..9dfaf13 100644 --- a/lib/ui/screens/lookbook/page.dart +++ b/lib/ui/screens/lookbook/page.dart @@ -5,59 +5,73 @@ import 'package:openwardrobe/presentation/blocs/lookbook/lookbook_cubit.dart'; import 'package:openwardrobe/presentation/blocs/lookbook/lookbook_state.dart'; import 'package:openwardrobe/ui/widgets/lookbook/lookbook_component.dart'; -class LookbookScreen extends StatelessWidget { +class LookbookScreen extends StatefulWidget { const LookbookScreen({super.key}); + @override + _LookbookScreenState createState() => _LookbookScreenState(); +} + +class _LookbookScreenState extends State { + @override + void initState() { + super.initState(); + context.read().fetchLookbookItems(); + } + + @override + void dispose() { + context.read().close(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return BlocProvider( - create: (context) => LookbookCubit()..fetchLookbookItems(), - child: Scaffold( - appBar: AppBar( - title: const Text('Lookbook'), - ), - body: SingleChildScrollView( - child: IntrinsicHeight( - child: Align( - alignment: Alignment.topCenter, - child: Column( - children: [ - const SizedBox(height: 20), - Expanded( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 500), - child: BlocBuilder( - builder: (context, state) { - return switch (state) { - LookbookLoading() => const Center( - child: CircularProgressIndicator(), - ), - LookbookError(message: var message) => Center( - child: Text('Error: $message'), - ), - LookbookLoaded(lookbookItems: final items) => items.isEmpty - ? const Center(child: Text('No items found')) - : SingleChildScrollView( - child: Wrap( - spacing: 8.0, - runSpacing: 8.0, - alignment: WrapAlignment.start, - children: items.map((item) => Container( - width: 150, - child: LookbookComponent(item: item), - )).toList(), - ), + return Scaffold( + appBar: AppBar( + title: const Text('Lookbook'), + ), + body: SingleChildScrollView( + child: IntrinsicHeight( + child: Align( + alignment: Alignment.topCenter, + child: Column( + children: [ + const SizedBox(height: 20), + Expanded( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 500), + child: BlocBuilder( + builder: (context, state) { + return switch (state) { + LookbookLoading() => const Center( + child: CircularProgressIndicator(), + ), + LookbookError(message: var message) => Center( + child: Text('Error: $message'), + ), + LookbookLoaded(lookbookItems: final items) => items.isEmpty + ? const Center(child: Text('No items found')) + : SingleChildScrollView( + child: Wrap( + spacing: 8.0, + runSpacing: 8.0, + alignment: WrapAlignment.start, + children: items.map((item) => Container( + width: 150, + child: LookbookComponent(item: item), + )).toList(), ), - LookbookInitial() => const Center( - child: CircularProgressIndicator(), - ), - }; - }, - ), + ), + LookbookInitial() => const Center( + child: CircularProgressIndicator(), + ), + }; + }, ), - ) - ], - ), + ), + ) + ], ), ), ), diff --git a/lib/ui/screens/settings/page.dart b/lib/ui/screens/settings/page.dart index 91126cb..ee30792 100644 --- a/lib/ui/screens/settings/page.dart +++ b/lib/ui/screens/settings/page.dart @@ -1,54 +1,63 @@ import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; -class SettingsScreen extends StatelessWidget { +class SettingsScreen extends StatefulWidget { const SettingsScreen({Key? key}) : super(key: key); @override - Widget build(BuildContext context) { + _SettingsScreenState createState() => _SettingsScreenState(); +} +class _SettingsScreenState extends State { + @override + Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Settings'), ), body: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Settings', - style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), - ), - const SizedBox(height: 20), - ListTile( - title: const Text('Account'), - onTap: () { - // Navigate to account settings - }, - ), - ListTile( - title: const Text('Notifications'), - onTap: () { - // Navigate to notification settings - }, - ), - ListTile( - title: const Text('Privacy'), - onTap: () { - // Navigate to privacy settings - }, - ), - ListTile( - title: const Text('About'), - onTap: () { - // Navigate to about page - }, - ), - ], + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Settings', + style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 20), + ListTile( + title: const Text('Account'), + onTap: () { + // Navigate to account settings + }, + ), + ListTile( + title: const Text('Notifications'), + onTap: () { + // Navigate to notification settings + }, ), - ) + ListTile( + title: const Text('Privacy'), + onTap: () { + // Navigate to privacy settings + }, + ), + ListTile( + title: const Text('About'), + onTap: () { + // Navigate to about page + }, + ), + ], + ), + ), ); - + } + + @override + void dispose() { + // Dispose of any resources or controllers to prevent memory leaks + super.dispose(); } } diff --git a/lib/ui/screens/wardrobe/page.dart b/lib/ui/screens/wardrobe/page.dart index 6d83ad4..4db11c1 100644 --- a/lib/ui/screens/wardrobe/page.dart +++ b/lib/ui/screens/wardrobe/page.dart @@ -35,6 +35,14 @@ class _WardrobeScreenState extends State { ]); } + @override + void dispose() { + // Dispose of any resources or controllers to prevent memory leaks + context.read().close(); + context.read().close(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/ui/screens/wardrobe/settings/account_page.dart b/lib/ui/screens/wardrobe/settings/account_page.dart index 5e5cc09..8995283 100644 --- a/lib/ui/screens/wardrobe/settings/account_page.dart +++ b/lib/ui/screens/wardrobe/settings/account_page.dart @@ -24,6 +24,14 @@ class _SettingsAccountPageState extends State { _userProfileFuture = _controller.fetchUserProfile(); } + @override + void dispose() { + _usernameController.dispose(); + _displayNameController.dispose(); + _bioController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/ui/screens/wardrobe_item/page.dart b/lib/ui/screens/wardrobe_item/page.dart index 212a3d7..f5a8504 100644 --- a/lib/ui/screens/wardrobe_item/page.dart +++ b/lib/ui/screens/wardrobe_item/page.dart @@ -8,22 +8,34 @@ import 'package:collection/collection.dart'; import 'package:openwardrobe/presentation/blocs/category/category_cubit.dart'; // Added import import 'package:openwardrobe/presentation/blocs/category/category_state.dart'; // Added import -class WardrobeItemPage extends StatelessWidget { +class WardrobeItemPage extends StatefulWidget { final String itemId; const WardrobeItemPage({super.key, required this.itemId}); + @override + _WardrobeItemPageState createState() => _WardrobeItemPageState(); +} + +class _WardrobeItemPageState extends State { + late WardrobeItemCubit _wardrobeItemCubit; + + @override + void initState() { + super.initState(); + _wardrobeItemCubit = WardrobeItemCubit()..loadWardrobeItem(widget.itemId); + } + + @override + void dispose() { + _wardrobeItemCubit.close(); + super.dispose(); + } + @override Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider( - create: (context) => WardrobeItemCubit()..loadWardrobeItem(itemId), - ), - BlocProvider( - create: (context) => CategoryCubit()..loadCategories('userId'), // Replace 'userId' with actual userId - ), - ], + return BlocProvider( + create: (context) => _wardrobeItemCubit, child: Scaffold( appBar: AppBar( title: const Text('Wardrobe Item'),