diff --git a/lib/main.dart b/lib/main.dart index 9501fd9..d4a79ae 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:hacktoberxmlsa_app/providers/theme_provider.dart'; import 'package:hacktoberxmlsa_app/providers/userProfile.dart'; import 'package:hacktoberxmlsa_app/services/colors.dart'; +import 'package:hacktoberxmlsa_app/theme.dart'; import 'package:hacktoberxmlsa_app/views/homePage.dart'; import 'package:hacktoberxmlsa_app/views/splashScreen.dart'; import 'package:provider/provider.dart'; @@ -14,6 +16,7 @@ void main() { runApp( MultiProvider( providers: [ + ChangeNotifierProvider(create: (_) => ThemeProvider()), ChangeNotifierProvider(create: (_) => UserProfileProvider()), ], child: MyApp(), @@ -26,18 +29,18 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - final ThemeData systemDarkTheme = ThemeData.dark(); - - return MaterialApp( - debugShowCheckedModeBanner: false, - theme: systemDarkTheme.copyWith( - primaryColor: primaryColorDark, - ), - initialRoute: '/splash', - routes: { - '/': (context) => const HomePage(), - '/splash': (context) => SplashScreen(), - }, - ); + return Consumer<ThemeProvider>(builder: (context, themeProvider, child) { + return MaterialApp( + debugShowCheckedModeBanner: false, + theme: lightTheme, + darkTheme: darkTheme, + themeMode: themeProvider.currentTheme, + initialRoute: '/splash', + routes: { + '/': (context) => const HomePage(), + '/splash': (context) => SplashScreen(), + }, + ); + }); } } diff --git a/lib/providers/theme_provider.dart b/lib/providers/theme_provider.dart new file mode 100644 index 0000000..533122a --- /dev/null +++ b/lib/providers/theme_provider.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class ThemeProvider extends ChangeNotifier { + bool _isLightTheme = true; + + bool get isLightTheme => _isLightTheme; + + ThemeMode get currentTheme => + _isLightTheme ? ThemeMode.light : ThemeMode.dark; + + void toggleTheme() { + _isLightTheme = !_isLightTheme; + notifyListeners(); + } +} diff --git a/lib/theme.dart b/lib/theme.dart new file mode 100644 index 0000000..859f6d1 --- /dev/null +++ b/lib/theme.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +final ThemeData lightTheme = ThemeData( + primaryColor: Colors.blue, + scaffoldBackgroundColor: Colors.white, + brightness: Brightness.light, + appBarTheme: AppBarTheme( + color: Colors.blue, + iconTheme: IconThemeData(color: Colors.white), + ), +); + +final ThemeData darkTheme = ThemeData( + primaryColor: Colors.black, + scaffoldBackgroundColor: Colors.grey[900], + brightness: Brightness.dark, + appBarTheme: AppBarTheme( + color: Colors.black, + iconTheme: IconThemeData(color: Colors.white), + ), +); diff --git a/lib/views/homePage.dart b/lib/views/homePage.dart index 391b9ff..421d14c 100644 --- a/lib/views/homePage.dart +++ b/lib/views/homePage.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:hacktoberxmlsa_app/providers/theme_provider.dart'; import 'package:hacktoberxmlsa_app/services/colors.dart'; import 'package:hacktoberxmlsa_app/views/noteCard.dart'; import 'package:hacktoberxmlsa_app/views/notePage.dart'; import 'package:hacktoberxmlsa_app/views/profile.dart'; +import 'package:provider/provider.dart'; class HomePage extends StatefulWidget { const HomePage({super.key}); @@ -37,18 +39,32 @@ class _HomePageState extends State<HomePage> { ), GestureDetector( onTap: () { - Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) { + Navigator.pushReplacement(context, + MaterialPageRoute(builder: (context) { return ProfilePage(); })); }, child: CircleAvatar( - foregroundImage: NetworkImage('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRnDNmpgYnTP4ELmIob69uKE1O0Rbrotna00g&s'), + foregroundImage: NetworkImage( + 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRnDNmpgYnTP4ELmIob69uKE1O0Rbrotna00g&s'), radius: screenWidth * 0.05, ), ), ], ), ), + actions: [ + IconButton( + icon: Icon( + Provider.of<ThemeProvider>(context).isLightTheme + ? Icons.light_mode + : Icons.dark_mode, + ), + onPressed: () { + Provider.of<ThemeProvider>(context, listen: false).toggleTheme(); + }, + ), + ], ), body: Stack( children: [ @@ -68,7 +84,8 @@ class _HomePageState extends State<HomePage> { }, decoration: InputDecoration( filled: false, - contentPadding: EdgeInsets.symmetric(vertical: 10, horizontal: 20), + contentPadding: + EdgeInsets.symmetric(vertical: 10, horizontal: 20), labelStyle: TextStyle( color: Colors.white, ), @@ -78,7 +95,9 @@ class _HomePageState extends State<HomePage> { borderSide: BorderSide(width: 2, color: purple), ), hintText: 'Search your notes here', - hintStyle: TextStyle(color: Colors.white60, fontWeight: FontWeight.normal)), + hintStyle: TextStyle( + color: Colors.white60, + fontWeight: FontWeight.normal)), ), SizedBox( height: screenHeight * 0.02, @@ -102,14 +121,16 @@ class _HomePageState extends State<HomePage> { padding: const EdgeInsets.all(8.0), child: NoteCard( noteTitle: 'Note ${index + 1}', - noteContent: 'This is the content of note ${index + 1}', + noteContent: + 'This is the content of note ${index + 1}', onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => NotePage( title: 'Note ${index + 1}', - content: 'This is the content of note ${index + 1}', + content: + 'This is the content of note ${index + 1}', ))); }), ); @@ -141,11 +162,13 @@ class _HomePageState extends State<HomePage> { MaterialPageRoute( builder: (context) => NotePage( title: 'Note ${index + 1}', - content: 'This is the content of note ${index + 1}', + content: + 'This is the content of note ${index + 1}', ))); }, noteTitle: 'Quick Note ${index + 1}', - noteContent: 'This is a quick note. Content preview for note ${index + 1}.', + noteContent: + 'This is a quick note. Content preview for note ${index + 1}.', ); }, ), @@ -169,7 +192,8 @@ class _HomePageState extends State<HomePage> { right: screenWidth * 0.05, child: FloatingActionButton( onPressed: () { - Navigator.push(context, MaterialPageRoute(builder: (context) => NotePage())); + Navigator.push(context, + MaterialPageRoute(builder: (context) => NotePage())); }, child: Icon(Icons.add), backgroundColor: purple, diff --git a/lib/views/notePage.dart b/lib/views/notePage.dart index a44a014..b04f6d6 100644 --- a/lib/views/notePage.dart +++ b/lib/views/notePage.dart @@ -1,9 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:hacktoberxmlsa_app/providers/theme_provider.dart'; import 'package:hacktoberxmlsa_app/views/homePage.dart'; import 'package:hacktoberxmlsa_app/views/intivePopPage.dart'; +import 'package:provider/provider.dart'; class NotePage extends StatefulWidget { - final String? title; final String? content; @@ -14,13 +15,12 @@ class NotePage extends StatefulWidget { } class _NotePageState extends State<NotePage> { - late TextEditingController titleController; late TextEditingController contentController; FocusNode noteFocus = FocusNode(); - @override + @override void initState() { super.initState(); titleController = TextEditingController(text: widget.title ?? ''); @@ -34,7 +34,7 @@ class _NotePageState extends State<NotePage> { leading: IconButton( onPressed: () { Navigator.pop(context); - }, + }, icon: Icon(Icons.arrow_back_ios_new_rounded), ), actions: [ @@ -44,8 +44,17 @@ class _NotePageState extends State<NotePage> { }, icon: const Icon(Icons.more_horiz_rounded), ), + IconButton( + icon: Icon( + Provider.of<ThemeProvider>(context).isLightTheme + ? Icons.light_mode + : Icons.dark_mode, + ), + onPressed: () { + Provider.of<ThemeProvider>(context, listen: false).toggleTheme(); + }, + ), ], - ), body: SafeArea( child: Padding( @@ -57,27 +66,19 @@ class _NotePageState extends State<NotePage> { children: [ TextField( controller: titleController, - style: const TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold - ), + style: + const TextStyle(fontSize: 30, fontWeight: FontWeight.bold), decoration: const InputDecoration( - hintText: "Title", - border: InputBorder.none - ), + hintText: "Title", border: InputBorder.none), ), Expanded( child: TextField( controller: contentController, focusNode: noteFocus, maxLines: null, - style: const TextStyle( - fontSize: 20 - ), + style: const TextStyle(fontSize: 20), decoration: const InputDecoration( - hintText: "Note", - border: InputBorder.none - ), + hintText: "Note", border: InputBorder.none), ), ), ], @@ -86,4 +87,4 @@ class _NotePageState extends State<NotePage> { ), ); } -} \ No newline at end of file +} diff --git a/lib/views/profile.dart b/lib/views/profile.dart index 3d1338e..fbd1149 100644 --- a/lib/views/profile.dart +++ b/lib/views/profile.dart @@ -1,5 +1,6 @@ import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:hacktoberxmlsa_app/providers/theme_provider.dart'; import 'package:hacktoberxmlsa_app/providers/userProfile.dart'; import 'package:hacktoberxmlsa_app/services/colors.dart'; import 'package:hacktoberxmlsa_app/utils/auth_utils.dart'; @@ -7,7 +8,7 @@ import 'package:hacktoberxmlsa_app/views/homePage.dart'; import 'package:hacktoberxmlsa_app/widgets/button.dart'; import 'package:hacktoberxmlsa_app/widgets/textfield.dart'; import 'package:provider/provider.dart'; -import 'package:image_picker/image_picker.dart'; +import 'package:image_picker/image_picker.dart'; class ProfilePage extends StatefulWidget { const ProfilePage({super.key}); @@ -67,7 +68,7 @@ class _ProfilePageState extends State<ProfilePage> { @override Widget build(BuildContext context) { final userProfile = Provider.of<UserProfileProvider>(context); - + double screenWidth = MediaQuery.of(context).size.width; double screenHeight = MediaQuery.of(context).size.height; @@ -82,8 +83,14 @@ class _ProfilePageState extends State<ProfilePage> { ), actions: [ IconButton( - onPressed: () {}, - icon: const Icon(Icons.light_mode), + onPressed: () { + Provider.of<ThemeProvider>(context, listen: false).toggleTheme(); + }, + icon: Icon( + Provider.of<ThemeProvider>(context).isLightTheme + ? Icons.light_mode + : Icons.dark_mode, + ), ), ], ),