diff --git a/.github/workflows/greetings.yaml b/.github/workflows/greetings.yaml
new file mode 100644
index 0000000..704db0e
--- /dev/null
+++ b/.github/workflows/greetings.yaml
@@ -0,0 +1,16 @@
+name: Greetings
+
+on: [pull_request_target, issues]
+
+jobs:
+ greeting:
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ pull-requests: write
+ steps:
+ - uses: actions/first-interaction@v1
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ issue-message: "Hi there! Thanks for opening this issue. We appreciate your contribution to this open-source project. We aim to respond or assign your issue as soon as possible."
+ pr-message: "Welcome to Our repository.π Thank you so much for taking the time to point this out."
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..cee5c73
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,47 @@
+# **Contributing Guidelines** π
+
+This documentation contains a set of guidelines to help you during the contribution process.
+We are happy to welcome all the contributions from anyone willing to improve/add new scripts to this project.
+Thank you for helping out and remember, **no contribution is too small.**
+
+Please note we have a [code of conduct](CODE_OF_CONDUCT.md) please follow it in all your interactions with the project.
+
+
+
+
+
+## **Need some help regarding the basics?π€**
+
+
+You can refer to the following articles on basics of Git and Github and also contact the Project Mentors,
+in case you are stuck:
+
+- [Forking a Repo](https://help.github.com/en/github/getting-started-with-github/fork-a-repo)
+- [Cloning a Repo](https://help.github.com/en/desktop/contributing-to-projects/creating-an-issue-or-pull-request)
+- [How to create a Pull Request](https://opensource.com/article/19/7/create-pull-request-github)
+- [Getting started with Git and GitHub](https://towardsdatascience.com/getting-started-with-git-and-github-6fcd0f2d4ac6)
+- [Learn GitHub from Scratch](https://docs.github.com/en/get-started/start-your-journey/git-and-github-learning-resources)
+
+
+
+## **Issue Report Process π**
+
+1. Go to the project's issues.
+2. Give proper description for the issues.
+3. Don't spam to get the assignment of the issue π.
+4. Wait for till someone is looking into it !.
+5. Start working on issue only after you got assigned that issue π.
+
+
+
+## **Pull Request Process π**
+
+1. Ensure that you have self reviewed your code π
+2. Make sure you have added the proper description for the functionality of the code
+3. I have commented my code, particularly in hard-to-understand areas.
+4. Add screenshot it help in review.
+5. Submit your PR by giving the necesarry information in PR template and hang tight we will review it really soon π
+
+
+
+# **Thank you for contributingπ**
diff --git a/lib/cubit/index_cubit.dart b/lib/cubit/index_cubit.dart
new file mode 100644
index 0000000..f3916e2
--- /dev/null
+++ b/lib/cubit/index_cubit.dart
@@ -0,0 +1,9 @@
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class IndexCubit extends Cubit {
+ IndexCubit() : super(0);
+
+ void changeIndex(int newIndex) {
+ emit(newIndex);
+ }
+}
diff --git a/lib/main.dart b/lib/main.dart
index 2b947ca..51162b8 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,18 +1,22 @@
import 'package:flutter/material.dart';
import 'package:adaptive_theme/adaptive_theme.dart';
import 'package:learn/pages/about.dart';
-import 'package:learn/pages/atoz.dart';
-import 'package:learn/pages/birds.dart';
-import 'package:learn/pages/animals.dart';
import 'package:learn/pages/flowers.dart';
-import 'package:learn/pages/parts.dart';
-import 'package:learn/pages/shapes.dart';
-import 'package:learn/pages/solar.dart';
-import 'package:learn/utils/assets_path.dart';
+import 'package:learn/pages/modules/atoz.dart';
+import 'package:learn/pages/modules/birds.dart';
+import 'package:learn/pages/modules/animals.dart';
+import 'package:learn/pages/explore.dart';
+import 'package:learn/pages/favorite.dart';
+import 'package:learn/pages/modules/parts.dart';
+import 'package:learn/pages/modules/shapes.dart';
+import 'package:learn/pages/modules/solar.dart';
import 'package:learn/utils/routes.dart';
import 'package:learn/widgets/drawer.dart';
-import 'package:learn/pages/colours.dart';
+import 'package:learn/pages/modules/colours.dart';
import 'package:fluttertoast/fluttertoast.dart';
+import 'package:learn/widgets/navbar/navbar.dart';
+
+import 'pages/home.dart';
DateTime? currentBackPressTime;
@@ -33,331 +37,45 @@ class MyApp extends StatelessWidget {
light: ThemeData.light(),
dark: ThemeData.dark(),
initial: savedThemeMode ?? AdaptiveThemeMode.light,
- builder: (theme, darkTheme) => MaterialApp(
- debugShowCheckedModeBanner: false,
- title: 'Home',
- theme: theme,
- darkTheme: darkTheme,
- home: const MyHomePage(),
- routes: {
- AllRoutes.homeRoute: (context) => const MyHomePage(),
- AllRoutes.atozRoute: (context) => const AtoZ(),
- AllRoutes.birdsRoute: (context) => BirdsPage(),
- AllRoutes.shapesRoute: (context) => const ShapesPage(),
- AllRoutes.partsRoute: (context) => const PartsPage(),
- AllRoutes.solarRoute: (context) => PlanetsPage(),
- AllRoutes.animalRoute: (context) => AnimalsPage(),
- AllRoutes.colourRoute: (context) => const ColoursPage(),
- AllRoutes.flowerRoute: (context) => const FlowerPage(),
- AllRoutes.aboutRoute: (context) => const AboutPage(),
- },
- ),
- );
- }
-}
-
-class MyHomePage extends StatefulWidget {
- const MyHomePage({Key? key}) : super(key: key);
-
- @override
- State createState() => _MyHomePageState();
-}
-
-class _MyHomePageState extends State {
- bool _isImageClicked1 = false;
- bool _isImageClicked2 = false;
- bool _isImageClicked3 = false;
- bool _isImageClicked4 = false;
- bool _isImageClicked5 = false;
- bool _isDarkTheme = false;
-
- Future _onBackPressed() {
- DateTime now = DateTime.now();
- if (currentBackPressTime == null ||
- now.difference(currentBackPressTime!) > const Duration(seconds: 2)) {
- currentBackPressTime = now;
- Fluttertoast.showToast(
- msg: "Press back again to exit",
- toastLength: Toast.LENGTH_SHORT,
- gravity: ToastGravity.BOTTOM,
- );
- return Future.value(false);
- }
- return Future.value(true);
- }
-
- @override
- Widget build(BuildContext context) {
- return WillPopScope(
- onWillPop: _onBackPressed,
- child: Scaffold(
- appBar: AppBar(
- title: const Text(
- 'Home',
- style: TextStyle(fontWeight: FontWeight.bold),
- ),
- actions: [
- IconButton(
- icon: Icon(
- _isDarkTheme ? Icons.dark_mode : Icons.light_mode,
+ builder: (theme, darkTheme) => BlocProvider(
+ create: (context) => IndexCubit(),
+ child: BlocBuilder(
+ builder: (context, index) {
+ return MaterialApp(
+ debugShowCheckedModeBanner: false,
+ title: 'Home',
+ theme: theme,
+ darkTheme: darkTheme,
+ home: Scaffold(
+ body: const [
+ MyHomePage(),
+ ExplorePage(),
+ FavoritePage(),
+ AboutPage(),
+ ][index],
+ bottomNavigationBar: const BottomNavBar(),
),
- onPressed: () {
- setState(() {
- _isDarkTheme = !_isDarkTheme;
- });
- final themeMode = Theme.of(context).brightness == Brightness.dark
- ? AdaptiveThemeMode.light
- : AdaptiveThemeMode.dark;
- AdaptiveTheme.of(context).setThemeMode(themeMode);
+ routes: {
+ AllRoutes.homeRoute: (context) => const MyHomePage(),
+ AllRoutes.atozRoute: (context) => const AtoZ(),
+ AllRoutes.birdsRoute: (context) => BirdsPage(),
+ AllRoutes.shapesRoute: (context) => const ShapesPage(),
+ AllRoutes.partsRoute: (context) => const PartsPage(),
+ AllRoutes.solarRoute: (context) => PlanetsPage(),
+ AllRoutes.animalRoute: (context) => AnimalsPage(),
+ AllRoutes.colourRoute: (context) => const ColoursPage(),
+ AllRoutes.aboutRoute: (context) => const AboutPage(),
+ AllRoutes.flowerRoute: (context) => const FlowerPage(),
+ AllRoutes.exploreRoute: (context) => const ExplorePage(),
+ AllRoutes.favoriteRoute: (context) => const FavoritePage(),
},
- ),
- ],
+ );
+ },
),
- body: SingleChildScrollView(
- child: Padding(
- padding: const EdgeInsets.all(38.0),
- child: Column(
- children: [
- GestureDetector(
- onTap: () {
- setState(() {
- _isImageClicked1 = !_isImageClicked1;
- });
- Future.delayed(const Duration(milliseconds: 300), () {
- Navigator.pushNamed(context, AllRoutes.atozRoute);
- });
- },
- child: AnimatedContainer(
- duration: const Duration(milliseconds: 300),
- curve: Curves.easeInOut,
- height: _isImageClicked1 ? 325 : 350,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(12),
- border: Border.all(color: Colors.black, width: 2),
- boxShadow: [
- BoxShadow(
- color: Colors.black.withOpacity(0.2),
- spreadRadius: 2,
- blurRadius: 5,
- offset: const Offset(0, 3),
- ),
- ],
- image: const DecorationImage(
- image: AssetImage('assets/images/alphabets.jpg'),
- fit: BoxFit.cover,
- ),
- ),
- ),
- ),
- const SizedBox(height: 20),
- const Text(
- 'ALPHABETS',
- style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
- ),
- const Text("Learn A to Z with pronunciation and an example"),
- const SizedBox(
- height: 20,
- ),
- GestureDetector(
- onTap: () {
- setState(() {
- _isImageClicked2 = !_isImageClicked2;
- });
- Future.delayed(const Duration(milliseconds: 300), () {
- Navigator.pushNamed(context, AllRoutes.animalRoute);
- });
- },
- child: AnimatedContainer(
- duration: const Duration(milliseconds: 300),
- curve: Curves.easeInOut,
- height: _isImageClicked2 ? 325 : 350,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(12),
- border: Border.all(color: Colors.black, width: 2),
- boxShadow: [
- BoxShadow(
- color: Colors.black.withOpacity(0.2),
- spreadRadius: 2,
- blurRadius: 5,
- offset: const Offset(0, 3),
- ),
- ],
- image: const DecorationImage(
- image: AssetImage('assets/images/animals.jpg'),
- fit: BoxFit.cover,
- ),
- ),
- ),
- ),
- const SizedBox(height: 20),
- const Text(
- 'ANIMALS',
- style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
- ),
- const Text("Learn about animals and their voices"),
- const SizedBox(
- height: 20,
- ),
- GestureDetector(
- onTap: () {
- setState(() {
- _isImageClicked3 = !_isImageClicked3;
- });
- Future.delayed(const Duration(milliseconds: 300), () {
- Navigator.pushNamed(context, AllRoutes.partsRoute);
- });
- },
- child: AnimatedContainer(
- duration: const Duration(milliseconds: 300),
- curve: Curves.easeInOut,
- height: _isImageClicked3 ? 325 : 350,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(12),
- border: Border.all(color: Colors.black, width: 2),
- boxShadow: [
- BoxShadow(
- color: Colors.black.withOpacity(0.2),
- spreadRadius: 2,
- blurRadius: 5,
- offset: const Offset(0, 3),
- ),
- ],
- image: const DecorationImage(
- image: AssetImage('assets/body/body.jpg'),
- fit: BoxFit.cover,
- ),
- ),
- ),
- ),
- const SizedBox(height: 20),
- const Text(
- 'BODY PARTS',
- style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
- ),
- const Text("Know about body parts and their pronunciation."),
- const SizedBox(height: 20),
- GestureDetector(
- onTap: () {
- setState(() {
- _isImageClicked4 = !_isImageClicked4;
- });
- Future.delayed(const Duration(milliseconds: 300), () {
- Navigator.pushNamed(context, AllRoutes.birdsRoute);
- });
- },
- child: AnimatedContainer(
- duration: const Duration(milliseconds: 300),
- curve: Curves.easeInOut,
- height: _isImageClicked4 ? 325 : 350,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(12),
- border: Border.all(color: Colors.black, width: 2),
- boxShadow: [
- BoxShadow(
- color: Colors.black.withOpacity(0.2),
- spreadRadius: 2,
- blurRadius: 5,
- offset: const Offset(0, 3),
- ),
- ],
- image: const DecorationImage(
- image: AssetImage('assets/images/birds.jpg'),
- fit: BoxFit.cover,
- ),
- ),
- ),
- ),
- const SizedBox(height: 20),
- const Text(
- 'BIRDS',
- style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
- ),
- const Text("Look out for Birds with their sounds."),
-
- const SizedBox(height: 20),
- GestureDetector(
- onTap: () {
- setState(() {
- _isImageClicked4 = !_isImageClicked4;
- });
- Future.delayed(const Duration(milliseconds: 300), () {
- Navigator.pushNamed(context, AllRoutes.colourRoute);
- });
- },
- child: AnimatedContainer(
- duration: const Duration(milliseconds: 300),
- curve: Curves.easeInOut,
- height: _isImageClicked4 ? 325 : 350,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(12),
- border: Border.all(color: Colors.black, width: 2),
- boxShadow: [
- BoxShadow(
- color: Colors.black.withOpacity(0.2),
- spreadRadius: 2,
- blurRadius: 5,
- offset: const Offset(0, 3),
- ),
- ],
- image: const DecorationImage(
- image: AssetImage('assets/images/colours/colors-cover.png'),
- fit: BoxFit.cover,
- ),
- ),
- ),
- ),
- const SizedBox(height: 20),
- const Text(
- 'COLOURS',
- style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
- ),
- const Text("Explore and learn about the colours!"),
-
- const SizedBox(height: 20),
- GestureDetector(
- onTap: () {
- setState(() {
- _isImageClicked5 = !_isImageClicked5;
- });
- Future.delayed(const Duration(milliseconds: 300), () {
- Navigator.pushNamed(context, AllRoutes.flowerRoute);
- });
- },
- child: AnimatedContainer(
- duration: const Duration(milliseconds: 300),
- curve: Curves.easeInOut,
- height: _isImageClicked5 ? 325 : 350,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(12),
- border: Border.all(color: Colors.black, width: 2),
- boxShadow: [
- BoxShadow(
- color: Colors.black.withOpacity(0.2),
- spreadRadius: 2,
- blurRadius: 5,
- offset: const Offset(0, 3),
- ),
- ],
- image: const DecorationImage(
- image: AssetImage('assets/images/flowers/flower_banner.jpeg'),
- fit: BoxFit.cover,
- ),
- ),
- ),
- ),
- const SizedBox(height: 20),
- const Text(
- 'FLOWERS',
- style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
- ),
- const Text("Explore beauty of nature flowers."),
-
- ],
- ),
- ),
- ),
- drawer: const MyDrawer(),
),
);
}
}
+
+
+
diff --git a/lib/pages/explore.dart b/lib/pages/explore.dart
new file mode 100644
index 0000000..5017895
--- /dev/null
+++ b/lib/pages/explore.dart
@@ -0,0 +1,18 @@
+import 'package:flutter/material.dart';
+
+// Explore Page
+// All the modules will be placed here like alphabets, animals, etc...
+// TODO: Implement the Explore Page
+
+class ExplorePage extends StatelessWidget {
+ const ExplorePage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return const Scaffold(
+ body: Center(
+ child: Text("Explore Page"),
+ )
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/favorite.dart b/lib/pages/favorite.dart
new file mode 100644
index 0000000..bebd58d
--- /dev/null
+++ b/lib/pages/favorite.dart
@@ -0,0 +1,16 @@
+import 'package:flutter/material.dart';
+
+class FavoritePage extends StatelessWidget {
+ const FavoritePage({super.key});
+
+ // Favorite Page
+ // All the favorited modules by the user will be placed here
+ // TODO: Implement the Favorite Page
+
+ @override
+ Widget build(BuildContext context) {
+ return Center(
+ child: Text("Favorited Items here"),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/home.dart b/lib/pages/home.dart
new file mode 100644
index 0000000..cb749e3
--- /dev/null
+++ b/lib/pages/home.dart
@@ -0,0 +1,273 @@
+import 'package:adaptive_theme/adaptive_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:fluttertoast/fluttertoast.dart';
+import 'package:learn/main.dart';
+
+import '../utils/routes.dart';
+import '../widgets/drawer.dart';
+
+class MyHomePage extends StatefulWidget {
+ const MyHomePage({Key? key}) : super(key: key);
+
+ @override
+ State createState() => _MyHomePageState();
+}
+
+class _MyHomePageState extends State {
+ bool _isImageClicked1 = false;
+ bool _isImageClicked2 = false;
+ bool _isImageClicked3 = false;
+ bool _isImageClicked4 = false;
+ bool _isDarkTheme = false;
+
+ Future _onBackPressed() {
+ DateTime now = DateTime.now();
+ if (currentBackPressTime == null ||
+ now.difference(currentBackPressTime!) > const Duration(seconds: 2)) {
+ currentBackPressTime = now;
+ Fluttertoast.showToast(
+ msg: "Press back again to exit",
+ toastLength: Toast.LENGTH_SHORT,
+ gravity: ToastGravity.BOTTOM,
+ );
+ return Future.value(false);
+ }
+ return Future.value(true);
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return WillPopScope(
+ onWillPop: _onBackPressed,
+ child: Scaffold(
+ appBar: AppBar(
+ title: const Text(
+ 'Home',
+ style: TextStyle(fontWeight: FontWeight.bold),
+ ),
+ actions: [
+ IconButton(
+ icon: Icon(
+ _isDarkTheme ? Icons.dark_mode : Icons.light_mode,
+ ),
+ onPressed: () {
+ setState(() {
+ _isDarkTheme = !_isDarkTheme;
+ });
+ final themeMode =
+ Theme.of(context).brightness == Brightness.dark
+ ? AdaptiveThemeMode.light
+ : AdaptiveThemeMode.dark;
+ AdaptiveTheme.of(context).setThemeMode(themeMode);
+ },
+ ),
+ ],
+ ),
+ body: SingleChildScrollView(
+ child: Padding(
+ padding: const EdgeInsets.all(38.0),
+ child: Column(
+ children: [
+ GestureDetector(
+ onTap: () {
+ setState(() {
+ _isImageClicked1 = !_isImageClicked1;
+ });
+ Future.delayed(const Duration(milliseconds: 300), () {
+ Navigator.pushNamed(context, AllRoutes.atozRoute);
+ });
+ },
+ child: AnimatedContainer(
+ duration: const Duration(milliseconds: 300),
+ curve: Curves.easeInOut,
+ height: _isImageClicked1 ? 325 : 350,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(12),
+ border: Border.all(color: Colors.black, width: 2),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.black.withOpacity(0.2),
+ spreadRadius: 2,
+ blurRadius: 5,
+ offset: const Offset(0, 3),
+ ),
+ ],
+ image: const DecorationImage(
+ image: AssetImage('assets/images/alphabets.jpg'),
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ),
+ const SizedBox(height: 20),
+ const Text(
+ 'ALPHABETS',
+ style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
+ ),
+ const Text("Learn A to Z with pronunciation and an example"),
+ const SizedBox(
+ height: 20,
+ ),
+ GestureDetector(
+ onTap: () {
+ setState(() {
+ _isImageClicked2 = !_isImageClicked2;
+ });
+ Future.delayed(const Duration(milliseconds: 300), () {
+ Navigator.pushNamed(context, AllRoutes.animalRoute);
+ });
+ },
+ child: AnimatedContainer(
+ duration: const Duration(milliseconds: 300),
+ curve: Curves.easeInOut,
+ height: _isImageClicked2 ? 325 : 350,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(12),
+ border: Border.all(color: Colors.black, width: 2),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.black.withOpacity(0.2),
+ spreadRadius: 2,
+ blurRadius: 5,
+ offset: const Offset(0, 3),
+ ),
+ ],
+ image: const DecorationImage(
+ image: AssetImage('assets/images/animals.jpg'),
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ),
+ const SizedBox(height: 20),
+ const Text(
+ 'ANIMALS',
+ style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
+ ),
+ const Text("Learn about animals and their voices"),
+ const SizedBox(
+ height: 20,
+ ),
+ GestureDetector(
+ onTap: () {
+ setState(() {
+ _isImageClicked3 = !_isImageClicked3;
+ });
+ Future.delayed(const Duration(milliseconds: 300), () {
+ Navigator.pushNamed(context, AllRoutes.partsRoute);
+ });
+ },
+ child: AnimatedContainer(
+ duration: const Duration(milliseconds: 300),
+ curve: Curves.easeInOut,
+ height: _isImageClicked3 ? 325 : 350,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(12),
+ border: Border.all(color: Colors.black, width: 2),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.black.withOpacity(0.2),
+ spreadRadius: 2,
+ blurRadius: 5,
+ offset: const Offset(0, 3),
+ ),
+ ],
+ image: const DecorationImage(
+ image: AssetImage('assets/body/body.jpg'),
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ),
+ const SizedBox(height: 20),
+ const Text(
+ 'BODY PARTS',
+ style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
+ ),
+ const Text("Know about body parts and their pronunciation."),
+ const SizedBox(height: 20),
+ GestureDetector(
+ onTap: () {
+ setState(() {
+ _isImageClicked4 = !_isImageClicked4;
+ });
+ Future.delayed(const Duration(milliseconds: 300), () {
+ Navigator.pushNamed(context, AllRoutes.birdsRoute);
+ });
+ },
+ child: AnimatedContainer(
+ duration: const Duration(milliseconds: 300),
+ curve: Curves.easeInOut,
+ height: _isImageClicked4 ? 325 : 350,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(12),
+ border: Border.all(color: Colors.black, width: 2),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.black.withOpacity(0.2),
+ spreadRadius: 2,
+ blurRadius: 5,
+ offset: const Offset(0, 3),
+ ),
+ ],
+ image: const DecorationImage(
+ image: AssetImage('assets/images/birds.jpg'),
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ),
+ const SizedBox(height: 20),
+ const Text(
+ 'BIRDS',
+ style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
+ ),
+ const Text("Look out for Birds with their sounds."),
+ const SizedBox(height: 20),
+ GestureDetector(
+ onTap: () {
+ setState(() {
+ _isImageClicked4 = !_isImageClicked4;
+ });
+ Future.delayed(const Duration(milliseconds: 300), () {
+ Navigator.pushNamed(context, AllRoutes.colourRoute);
+ });
+ },
+ child: AnimatedContainer(
+ duration: const Duration(milliseconds: 300),
+ curve: Curves.easeInOut,
+ height: _isImageClicked4 ? 325 : 350,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(12),
+ border: Border.all(color: Colors.black, width: 2),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.black.withOpacity(0.2),
+ spreadRadius: 2,
+ blurRadius: 5,
+ offset: const Offset(0, 3),
+ ),
+ ],
+ image: const DecorationImage(
+ image: AssetImage(
+ 'assets/images/colours/colors-cover.png'),
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ ),
+ const SizedBox(height: 20),
+ const Text(
+ 'COLOURS',
+ style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
+ ),
+ const Text("Explore and learn about the colours!"),
+ ],
+ ),
+ ),
+ ),
+ drawer: const MyDrawer(),
+ ),
+ );
+ }
+}
diff --git a/lib/pages/animals.dart b/lib/pages/modules/animals.dart
similarity index 100%
rename from lib/pages/animals.dart
rename to lib/pages/modules/animals.dart
diff --git a/lib/pages/atoz.dart b/lib/pages/modules/atoz.dart
similarity index 100%
rename from lib/pages/atoz.dart
rename to lib/pages/modules/atoz.dart
diff --git a/lib/pages/birds.dart b/lib/pages/modules/birds.dart
similarity index 100%
rename from lib/pages/birds.dart
rename to lib/pages/modules/birds.dart
diff --git a/lib/pages/colours.dart b/lib/pages/modules/colours.dart
similarity index 100%
rename from lib/pages/colours.dart
rename to lib/pages/modules/colours.dart
diff --git a/lib/pages/parts.dart b/lib/pages/modules/parts.dart
similarity index 100%
rename from lib/pages/parts.dart
rename to lib/pages/modules/parts.dart
diff --git a/lib/pages/shapes.dart b/lib/pages/modules/shapes.dart
similarity index 100%
rename from lib/pages/shapes.dart
rename to lib/pages/modules/shapes.dart
diff --git a/lib/pages/solar.dart b/lib/pages/modules/solar.dart
similarity index 100%
rename from lib/pages/solar.dart
rename to lib/pages/modules/solar.dart
diff --git a/lib/utils/constants.dart b/lib/utils/constants.dart
index 432bb87..b2c4175 100644
--- a/lib/utils/constants.dart
+++ b/lib/utils/constants.dart
@@ -1,8 +1,8 @@
import 'dart:ui';
-import '../pages/animals.dart';
-import '../pages/atoz.dart';
-import '../pages/birds.dart';
+import '../pages/modules/animals.dart';
+import '../pages/modules/atoz.dart';
+import '../pages/modules/birds.dart';
class AppConstants {
static const List candidates = [
diff --git a/lib/utils/routes.dart b/lib/utils/routes.dart
index 2b2378f..981ed55 100644
--- a/lib/utils/routes.dart
+++ b/lib/utils/routes.dart
@@ -2,6 +2,8 @@
class AllRoutes {
static String loginRoute = "/login";
static String homeRoute = "/home";
+ static String exploreRoute = "/explore";
+ static String favoriteRoute = "/favorite";
static String animalRoute = "/animals";
static String birdsRoute = "/birds";
static String shapesRoute = "/shapes";
diff --git a/lib/widgets/navbar/navbar.dart b/lib/widgets/navbar/navbar.dart
new file mode 100644
index 0000000..fa64c4b
--- /dev/null
+++ b/lib/widgets/navbar/navbar.dart
@@ -0,0 +1,45 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:learn/cubit/index_cubit.dart';
+
+class BottomNavBar extends StatefulWidget {
+ const BottomNavBar({super.key});
+
+ @override
+ State createState() => _BottomNavBarState();
+}
+
+class _BottomNavBarState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return BlocBuilder(
+ builder: (context, index) {
+ final currentPageIndex = index;
+ return NavigationBar(
+ selectedIndex: currentPageIndex,
+ onDestinationSelected: (index) {
+ context.read().changeIndex(index);
+ },
+ destinations: const [
+ NavigationDestination(
+ icon: Icon(Icons.home_rounded),
+ label: "Home",
+ ),
+ NavigationDestination(
+ icon: Icon(Icons.search_rounded),
+ label: "Explore",
+ ),
+ NavigationDestination(
+ icon: Icon(Icons.favorite_rounded),
+ label: "Favorite",
+ ),
+ NavigationDestination(
+ icon: Icon(Icons.person_rounded),
+ label: "About",
+ ),
+ ],
+ );
+ },
+ );
+ }
+}
diff --git a/pubspec.lock b/pubspec.lock
index b1849e9..cd7e9d7 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -13,10 +13,10 @@ packages:
dependency: transitive
description:
name: args
- sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
+ sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
url: "https://pub.dev"
source: hosted
- version: "2.4.2"
+ version: "2.5.0"
async:
dependency: transitive
description:
@@ -29,10 +29,18 @@ packages:
dependency: transitive
description:
name: audio_session
- sha256: "6fdf255ed3af86535c96452c33ecff1245990bb25a605bfb1958661ccc3d467f"
+ sha256: a49af9981eec5d7cd73b37bacb6ee73f8143a6a9f9bd5b6021e6c346b9b6cf4e
url: "https://pub.dev"
source: hosted
- version: "0.1.18"
+ version: "0.1.19"
+ bloc:
+ dependency: transitive
+ description:
+ name: bloc
+ sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "8.1.4"
boolean_selector:
dependency: transitive
description:
@@ -93,10 +101,10 @@ packages:
dependency: transitive
description:
name: ffi
- sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
+ sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
url: "https://pub.dev"
source: hosted
- version: "2.1.0"
+ version: "2.1.2"
file:
dependency: transitive
description:
@@ -118,14 +126,22 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
+ flutter_bloc:
+ dependency: "direct main"
+ description:
+ name: flutter_bloc
+ sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2
+ url: "https://pub.dev"
+ source: hosted
+ version: "8.1.5"
flutter_card_swiper:
dependency: "direct main"
description:
name: flutter_card_swiper
- sha256: "05bbbc11a0f57a6b9294cebe857d4d3dfdfbdad4e1628f4dc910c317d9684319"
+ sha256: "880ad669017154d6d1f8c3abd861db08af97b3b7b0f7d7d5cbde690a9253811d"
url: "https://pub.dev"
source: hosted
- version: "7.0.0"
+ version: "7.0.1"
flutter_lints:
dependency: "direct dev"
description:
@@ -138,10 +154,10 @@ packages:
dependency: "direct main"
description:
name: flutter_svg
- sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c
+ sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2"
url: "https://pub.dev"
source: hosted
- version: "2.0.9"
+ version: "2.0.10+1"
flutter_test:
dependency: "direct dev"
description: flutter
@@ -172,18 +188,26 @@ packages:
dependency: "direct main"
description:
name: google_fonts
- sha256: f0b8d115a13ecf827013ec9fc883390ccc0e87a96ed5347a3114cac177ef18e8
+ sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.2.1"
+ google_nav_bar:
+ dependency: "direct main"
+ description:
+ name: google_nav_bar
+ sha256: "1c8e3882fa66ee7b74c24320668276ca23affbd58f0b14a24c1e5590f4d07ab0"
url: "https://pub.dev"
source: hosted
- version: "6.1.0"
+ version: "5.0.6"
http:
dependency: transitive
description:
name: http
- sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba
+ sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
url: "https://pub.dev"
source: hosted
- version: "1.2.0"
+ version: "1.2.1"
http_parser:
dependency: transitive
description:
@@ -196,10 +220,10 @@ packages:
dependency: "direct main"
description:
name: just_audio
- sha256: b607cd1a43bac03d85c3aaee00448ff4a589ef2a77104e3d409889ff079bf823
+ sha256: b7cb6bbf3750caa924d03f432ba401ec300fd90936b3f73a9b33d58b1e96286b
url: "https://pub.dev"
source: hosted
- version: "0.9.36"
+ version: "0.9.37"
just_audio_platform_interface:
dependency: transitive
description:
@@ -272,6 +296,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.11.0"
+ nested:
+ dependency: transitive
+ description:
+ name: nested
+ sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
path:
dependency: transitive
description:
@@ -292,26 +324,26 @@ packages:
dependency: transitive
description:
name: path_provider
- sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b
+ sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
url: "https://pub.dev"
source: hosted
- version: "2.1.2"
+ version: "2.1.3"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
- sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668"
+ sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
url: "https://pub.dev"
source: hosted
- version: "2.2.2"
+ version: "2.2.4"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
- sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f"
+ sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
url: "https://pub.dev"
source: hosted
- version: "2.3.2"
+ version: "2.4.0"
path_provider_linux:
dependency: transitive
description:
@@ -360,6 +392,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.8"
+ provider:
+ dependency: transitive
+ description:
+ name: provider
+ sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.1.2"
rxdart:
dependency: transitive
description:
@@ -372,26 +412,26 @@ packages:
dependency: transitive
description:
name: shared_preferences
- sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
+ sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
url: "https://pub.dev"
source: hosted
- version: "2.2.2"
+ version: "2.2.3"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
- sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06"
+ sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
url: "https://pub.dev"
source: hosted
- version: "2.2.1"
+ version: "2.2.2"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
- sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
+ sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7"
url: "https://pub.dev"
source: hosted
- version: "2.3.5"
+ version: "2.4.0"
shared_preferences_linux:
dependency: transitive
description:
@@ -412,10 +452,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_web
- sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21"
+ sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
url: "https://pub.dev"
source: hosted
- version: "2.2.2"
+ version: "2.3.0"
shared_preferences_windows:
dependency: transitive
description:
@@ -497,26 +537,26 @@ packages:
dependency: "direct main"
description:
name: url_launcher
- sha256: c512655380d241a337521703af62d2c122bf7b77a46ff7dd750092aa9433499c
+ sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e"
url: "https://pub.dev"
source: hosted
- version: "6.2.4"
+ version: "6.2.6"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
- sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f"
+ sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775"
url: "https://pub.dev"
source: hosted
- version: "6.2.2"
+ version: "6.3.1"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
- sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03"
+ sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89"
url: "https://pub.dev"
source: hosted
- version: "6.2.4"
+ version: "6.3.0"
url_launcher_linux:
dependency: transitive
description:
@@ -529,26 +569,26 @@ packages:
dependency: transitive
description:
name: url_launcher_macos
- sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234
+ sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
url: "https://pub.dev"
source: hosted
- version: "3.1.0"
+ version: "3.2.0"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
- sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f
+ sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
source: hosted
- version: "2.3.1"
+ version: "2.3.2"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
- sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b
+ sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a"
url: "https://pub.dev"
source: hosted
- version: "2.2.3"
+ version: "2.3.1"
url_launcher_windows:
dependency: transitive
description:
@@ -561,34 +601,34 @@ packages:
dependency: transitive
description:
name: uuid
- sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8
+ sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8"
url: "https://pub.dev"
source: hosted
- version: "4.3.3"
+ version: "4.4.0"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
- sha256: "4ac59808bbfca6da38c99f415ff2d3a5d7ca0a6b4809c71d9cf30fba5daf9752"
+ sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3"
url: "https://pub.dev"
source: hosted
- version: "1.1.10+1"
+ version: "1.1.11+1"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
- sha256: f3247e7ab0ec77dc759263e68394990edc608fb2b480b80db8aa86ed09279e33
+ sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da
url: "https://pub.dev"
source: hosted
- version: "1.1.10+1"
+ version: "1.1.11+1"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
- sha256: "18489bdd8850de3dd7ca8a34e0c446f719ec63e2bab2e7a8cc66a9028dd76c5a"
+ sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81"
url: "https://pub.dev"
source: hosted
- version: "1.1.10+1"
+ version: "1.1.11+1"
vector_math:
dependency: transitive
description:
@@ -609,18 +649,18 @@ packages:
dependency: transitive
description:
name: web
- sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
+ sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
url: "https://pub.dev"
source: hosted
- version: "0.3.0"
+ version: "0.5.1"
win32:
dependency: transitive
description:
name: win32
- sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8"
+ sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb"
url: "https://pub.dev"
source: hosted
- version: "5.2.0"
+ version: "5.5.0"
xdg_directories:
dependency: transitive
description:
@@ -638,5 +678,5 @@ packages:
source: hosted
version: "6.5.0"
sdks:
- dart: ">=3.2.0 <4.0.0"
- flutter: ">=3.16.0"
+ dart: ">=3.3.0 <4.0.0"
+ flutter: ">=3.19.2"
diff --git a/pubspec.yaml b/pubspec.yaml
index f42cc59..ec70bb6 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -43,6 +43,8 @@ dependencies:
flutter_card_swiper: ^7.0.0
adaptive_theme: ^3.6.0
fluttertoast: ^8.2.5
+ google_nav_bar: ^5.0.6
+ flutter_bloc: ^8.1.5
dev_dependencies:
flutter_test: