Merge branch 'main' of https://github.com/WDI-Ideas/Tanami_App into jayeshjain25
BIN
assets/images/academy_screen/bg1.jpg
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
assets/images/academy_screen/bg2.jpg
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
assets/images/academy_screen/bg3.jpg
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
assets/images/academy_screen/bg4.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
assets/images/academy_screen/bg5.jpg
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
assets/images/academy_screen/dark_overlay.png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
assets/images/academy_screen/video.png
Normal file
|
After Width: | Height: | Size: 769 B |
BIN
assets/images/portfolio_screen/document.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
assets/images/portfolio_screen/download.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
@@ -77,6 +77,7 @@ class AppText {
|
||||
static const String currentval = "Current valuation";
|
||||
static const String totalreturn = "Total return";
|
||||
static const String disttodate = "Distributions to date";
|
||||
static const String includeddocs = "Included Documents";
|
||||
|
||||
//Dialog
|
||||
static const String exitText = "Exit";
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
|
||||
class AcademyScreen extends StatefulWidget {
|
||||
const AcademyScreen({super.key});
|
||||
@@ -8,8 +13,223 @@ class AcademyScreen extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _AcademyScreenState extends State<AcademyScreen> {
|
||||
List data = [
|
||||
{
|
||||
'img_path': 'assets/images/academy_screen/bg1.jpg',
|
||||
'date': 'July / 10 / 2025',
|
||||
'title': 'Article ',
|
||||
'videos': '3',
|
||||
'desc':
|
||||
'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.'
|
||||
},
|
||||
{
|
||||
'img_path': 'assets/images/academy_screen/bg2.jpg',
|
||||
'date': 'July / 10 / 2025',
|
||||
'title': 'Article ',
|
||||
'videos': '3',
|
||||
'desc':
|
||||
'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.'
|
||||
},
|
||||
{
|
||||
'img_path': 'assets/images/academy_screen/bg3.jpg',
|
||||
'date': 'July / 10 / 2025',
|
||||
'videos': '3',
|
||||
'title': 'Article ',
|
||||
'desc':
|
||||
'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.'
|
||||
},
|
||||
{
|
||||
'img_path': 'assets/images/academy_screen/bg4.jpg',
|
||||
'date': 'July / 10 / 2025',
|
||||
'videos': '3',
|
||||
'title': 'Article ',
|
||||
'desc':
|
||||
'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.',
|
||||
},
|
||||
{
|
||||
'img_path': 'assets/images/academy_screen/bg5.jpg',
|
||||
'date': 'July / 10 / 2025',
|
||||
'videos': '3',
|
||||
'title': 'Article ',
|
||||
'desc':
|
||||
'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.',
|
||||
},
|
||||
{
|
||||
'img_path': 'assets/images/academy_screen/bg4.jpg',
|
||||
'date': 'July / 10 / 2025',
|
||||
'videos': '3',
|
||||
'title': 'Article ',
|
||||
'desc':
|
||||
'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.',
|
||||
},
|
||||
{
|
||||
'img_path': 'assets/images/academy_screen/bg4.jpg',
|
||||
'date': 'July / 10 / 2025',
|
||||
'videos': '3',
|
||||
'title': 'Article ',
|
||||
'desc':
|
||||
'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.',
|
||||
},
|
||||
{
|
||||
'img_path': 'assets/images/academy_screen/bg4.jpg',
|
||||
'date': 'July / 10 / 2025',
|
||||
'videos': '3',
|
||||
'title': 'Article ',
|
||||
'desc':
|
||||
'Forem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vulputate libero et velit interdum, ac aliquet odio mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur tempus urna at turpis condimentum lobortis.',
|
||||
},
|
||||
];
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(body: Text('Academy'),);
|
||||
return Scaffold(
|
||||
backgroundColor: Colors.white,
|
||||
appBar: AppBar(
|
||||
backgroundColor: Colors.white,
|
||||
elevation: 0,
|
||||
scrolledUnderElevation: 0,
|
||||
automaticallyImplyLeading: false,
|
||||
title: Text(
|
||||
'Academy',
|
||||
style: GoogleFonts.dmSans(
|
||||
color: Color(0xFF272727),
|
||||
fontSize: 22.sp,
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
),
|
||||
titleSpacing: 16,
|
||||
),
|
||||
body: ListView.builder(
|
||||
itemCount: data.length,
|
||||
itemBuilder: (context, index) {
|
||||
return Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 10.0, horizontal: 16.0),
|
||||
child: Container(
|
||||
height: 140.h,
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.all(Radius.circular(20.0)),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.15),
|
||||
spreadRadius: 2,
|
||||
blurRadius: 10,
|
||||
offset: Offset(0, 3), // changes position of shadow
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Container(
|
||||
height: 140.h,
|
||||
width: 164.w,
|
||||
decoration: const BoxDecoration(
|
||||
color: Color(0xFFF8F8F8),
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(20.0),
|
||||
),
|
||||
),
|
||||
child: Stack(
|
||||
children: [
|
||||
ClipRRect(
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(20.0),
|
||||
bottomLeft: Radius.circular(20.0),
|
||||
),
|
||||
child: Image.asset(
|
||||
data[index]['img_path'],
|
||||
fit: BoxFit.cover,
|
||||
height: double.infinity,
|
||||
alignment: Alignment.topCenter,
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
bottom: 0.0,
|
||||
child: ClipRRect(
|
||||
borderRadius: const BorderRadius.only(
|
||||
bottomLeft: Radius.circular(20.0),
|
||||
),
|
||||
child: Image.asset(
|
||||
'assets/images/academy_screen/dark_overlay.png',
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
bottom: 8.0, left: 12.0,
|
||||
// alignment: Alignment.bottomLeft,
|
||||
child: Row(
|
||||
children: [
|
||||
Image.asset(
|
||||
'assets/images/academy_screen/video.png',
|
||||
height: 15.sp,
|
||||
),
|
||||
SizedBox(
|
||||
width: 5.w,
|
||||
),
|
||||
Text(
|
||||
'${data[index]['videos']} videos',
|
||||
style: GoogleFonts.dmSans(
|
||||
color: Color(0xFFD8D8D8),
|
||||
fontSize: 12.sp,
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 20.0, horizontal: 16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
data[index]['date'],
|
||||
style: GoogleFonts.dmSans(
|
||||
color: Color(0xFF8D8D8D),
|
||||
fontSize: 11.sp,
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 4.h,
|
||||
),
|
||||
Text(
|
||||
data[index]['title'],
|
||||
style: GoogleFonts.dmSans(
|
||||
color: Colors.black,
|
||||
fontSize: 17.sp,
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 12.h,
|
||||
),
|
||||
SizedBox(
|
||||
width: 158.w,
|
||||
child: Text(
|
||||
data[index]['desc'],
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: GoogleFonts.dmSans(
|
||||
color: Color(0xFF8D8D8D),
|
||||
fontSize: 11.sp,
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'package:carousel_slider/carousel_slider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
@@ -11,6 +12,16 @@ class DetailsScreen extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _DetailsScreenState extends State<DetailsScreen> {
|
||||
int _current = 0;
|
||||
final CarouselController _controller = CarouselController();
|
||||
final List imgList = [
|
||||
{'id': 1, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
|
||||
{'id': 2, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
|
||||
{'id': 3, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
|
||||
{'id': 4, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
|
||||
{'id': 5, 'img_path': 'assets/images/portfolio_screen/detailsbg.png'},
|
||||
];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
@@ -54,13 +65,58 @@ class _DetailsScreenState extends State<DetailsScreen> {
|
||||
topLeft: Radius.circular(20.0),
|
||||
topRight: Radius.circular(20.0),
|
||||
),
|
||||
child: Image.asset(
|
||||
'assets/images/portfolio_screen/detailsbg.png',
|
||||
fit: BoxFit.cover,
|
||||
width: double.infinity,
|
||||
alignment: Alignment.topCenter,
|
||||
child: CarouselSlider(
|
||||
items: imgList
|
||||
.map(
|
||||
(item) => Image.asset(
|
||||
item['img_path'],
|
||||
fit: BoxFit.cover,
|
||||
width: double.infinity,
|
||||
alignment: Alignment.topCenter,
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
carouselController: _controller,
|
||||
options: CarouselOptions(
|
||||
scrollPhysics: const BouncingScrollPhysics(),
|
||||
autoPlay: true,
|
||||
aspectRatio: 2,
|
||||
viewportFraction: 1,
|
||||
onPageChanged: (index, reason) {
|
||||
setState(() {
|
||||
_current = index;
|
||||
});
|
||||
}),
|
||||
),
|
||||
),
|
||||
Align(
|
||||
alignment: Alignment.bottomCenter,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 17.0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children:
|
||||
imgList.asMap().entries.map((entry) {
|
||||
return GestureDetector(
|
||||
onTap: () =>
|
||||
_controller.animateToPage(entry.key),
|
||||
child: Container(
|
||||
width: 20.w,
|
||||
height: 7.h,
|
||||
margin: const EdgeInsets.symmetric(
|
||||
horizontal: 3.0),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius:
|
||||
BorderRadius.circular(10),
|
||||
color: (_current == entry.key)
|
||||
? Colors.white
|
||||
: Colors.grey,
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
)),
|
||||
Positioned(
|
||||
top: 20,
|
||||
left: 20,
|
||||
@@ -304,6 +360,114 @@ class _DetailsScreenState extends State<DetailsScreen> {
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 20.h,
|
||||
),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: const BorderRadius.all(Radius.circular(20.0)),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.15),
|
||||
spreadRadius: 2,
|
||||
blurRadius: 10,
|
||||
offset: Offset(0, 3), // changes position of shadow
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(20.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
AppText.includeddocs,
|
||||
style: GoogleFonts.dmSans(
|
||||
color: Colors.black,
|
||||
fontSize: 15.sp,
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 16.h,
|
||||
),
|
||||
GridView.count(
|
||||
shrinkWrap: true,
|
||||
childAspectRatio: 1.7,
|
||||
mainAxisSpacing: 10.h,
|
||||
crossAxisSpacing: 10.w,
|
||||
crossAxisCount: 2, // Number of columns
|
||||
children: List.generate(
|
||||
6,
|
||||
(index) {
|
||||
return Center(
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Color(0xFFF4F4F4),
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(10.0)),
|
||||
),
|
||||
padding: EdgeInsets.all(20.0),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Image.asset(
|
||||
'assets/images/portfolio_screen/document.png',
|
||||
height: 16.sp,
|
||||
),
|
||||
SizedBox(
|
||||
width: 7.w,
|
||||
),
|
||||
Text(
|
||||
"Filename.pdf",
|
||||
style: GoogleFonts.dmSans(
|
||||
color: Colors.black,
|
||||
fontSize: 12.sp,
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: 14.h,
|
||||
),
|
||||
Row(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.end,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
"512 Mb",
|
||||
style: GoogleFonts.dmSans(
|
||||
color: Color(0xFF535353),
|
||||
fontSize: 12.sp,
|
||||
fontWeight: FontWeight.w700,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 7.w,
|
||||
),
|
||||
Image.asset(
|
||||
'assets/images/portfolio_screen/download.png',
|
||||
height: 20.sp,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -45,7 +45,8 @@ class BottomSection extends StatelessWidget {
|
||||
successToastMessage(context, "login successful !");
|
||||
goRouter.pop();
|
||||
|
||||
goRouter.goNamed(RouteName.biometricScreen);
|
||||
// goRouter.goNamed(RouteName.biometricScreen);
|
||||
goRouter.goNamed(RouteName.mainScreen);
|
||||
} else if (state is LoginFailure) {
|
||||
goRouter.pop();
|
||||
errorToastMessage(
|
||||
|
||||
@@ -105,6 +105,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
carousel_slider:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: carousel_slider
|
||||
sha256: "9c695cc963bf1d04a47bd6021f68befce8970bcd61d24938e1fb0918cf5d9c42"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2.1"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
@@ -76,6 +76,7 @@ dependencies:
|
||||
|
||||
#OTP Autofill
|
||||
sms_autofill: ^2.3.1
|
||||
carousel_slider: ^4.2.1
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
@@ -99,6 +100,7 @@ flutter:
|
||||
- assets/images/bottom_bar/active/
|
||||
- assets/images/bottom_bar/inactive/
|
||||
- assets/images/portfolio_screen/
|
||||
- assets/images/academy_screen/
|
||||
- assets/images/biometric_screen/
|
||||
- assets/images/biometric_screen/png/
|
||||
- assets/images/biometric_screen/svg/
|
||||
|
||||