go router added
This commit is contained in:
@@ -1,77 +1,86 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../common/widgets/bottom_navigation.dart';
|
||||
import '../../core/constants/colors.dart';
|
||||
import '../../core/utils/size_config.dart';
|
||||
import 'widgets.dart';
|
||||
|
||||
class Homescreen extends StatelessWidget {
|
||||
const Homescreen({super.key});
|
||||
class HomeScreen extends StatelessWidget {
|
||||
const HomeScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: Colors.white,
|
||||
body: _body(),
|
||||
bottomNavigationBar: TenderBottomNavigation(),
|
||||
);
|
||||
}
|
||||
|
||||
SafeArea _body() {
|
||||
return SafeArea(
|
||||
child: ListView(
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsetsDirectional.fromSTEB(
|
||||
24.0.w(),
|
||||
26.0.h(),
|
||||
24.0.w(),
|
||||
24.0.h(),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
_appbar(),
|
||||
SizedBox(height: 32.0.h()),
|
||||
_progressBarsRow(),
|
||||
SizedBox(height: 32.0.h()),
|
||||
_firstStatisticsRow(),
|
||||
SizedBox(height: 8.0.h()),
|
||||
_secondStatisticsRow(),
|
||||
SizedBox(height: 32.0.h()),
|
||||
_yourTenderText(),
|
||||
SizedBox(height: 28.0.h()),
|
||||
_bottomListView(),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
child: Scaffold(
|
||||
backgroundColor: Colors.white,
|
||||
body: _body(context),
|
||||
appBar: _appbar(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _appbar() {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
Widget _body(BuildContext context) {
|
||||
return ListView(
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.home,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Color(0xFF222222),
|
||||
Padding(
|
||||
padding: EdgeInsetsDirectional.fromSTEB(
|
||||
24.0.w(),
|
||||
26.0.h(),
|
||||
24.0.w(),
|
||||
24.0.h(),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
// _appbar(),
|
||||
// SizedBox(height: 32.0.h()),
|
||||
_progressBarsRow(),
|
||||
SizedBox(height: 32.0.h()),
|
||||
_firstStatisticsRow(),
|
||||
SizedBox(height: 8.0.h()),
|
||||
_secondStatisticsRow(),
|
||||
SizedBox(height: 32.0.h()),
|
||||
_yourTenderText(),
|
||||
SizedBox(height: 28.0.h()),
|
||||
_bottomListView(),
|
||||
],
|
||||
),
|
||||
),
|
||||
Image.asset(
|
||||
'assets/icons/tenderLogo.png',
|
||||
width: 59.0.w(),
|
||||
height: 28.0.h(),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
PreferredSize _appbar() {
|
||||
return PreferredSize(
|
||||
preferredSize: Size.fromHeight(56.0.h()),
|
||||
child: Container(
|
||||
color: AppColors.backgroundColor,
|
||||
padding: EdgeInsets.symmetric(horizontal: 24.0.w()),
|
||||
height: 56.0.h(),
|
||||
width: double.infinity,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.home,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Color(0xFF222222),
|
||||
),
|
||||
),
|
||||
Image.asset(
|
||||
'assets/icons/tenderLogo.png',
|
||||
width: 59.0.w(),
|
||||
height: 28.0.h(),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _progressBarsRow() {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
|
||||
@@ -30,7 +30,7 @@ class _ProgressBarColumnState extends State<ProgressBarColumn>
|
||||
// Initialize the animation controller
|
||||
_controller = AnimationController(
|
||||
vsync: this,
|
||||
duration: Duration(milliseconds: 1500), // duration of the animation
|
||||
duration: Duration(milliseconds: 2000), // duration of the animation
|
||||
);
|
||||
|
||||
// Create a Tween animation from 0.0 to 0.75
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../core/constants/colors.dart';
|
||||
|
||||
class ProfileScreen extends StatelessWidget {
|
||||
const ProfileScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: AppBar(
|
||||
title: const Text('Profile'),
|
||||
backgroundColor: AppColors.grey10,
|
||||
elevation: 0,
|
||||
),
|
||||
body: const Center(
|
||||
child: Text(
|
||||
'Profile Screen',
|
||||
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
|
||||
import '../../common/widgets/bottom_navigation.dart';
|
||||
import '../../core/constants/assets.dart';
|
||||
import '../../core/constants/colors.dart';
|
||||
import '../../core/utils/size_config.dart';
|
||||
import 'models/tender_model.dart';
|
||||
import 'widgets/main_tenders_slider.dart';
|
||||
import 'widgets/widgets.dart';
|
||||
|
||||
class TendersScreen extends StatefulWidget {
|
||||
@@ -39,59 +36,17 @@ class _TendersScreenState extends State<TendersScreen>
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
bottomNavigationBar: TenderBottomNavigation(),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
// horizontal: 24.0.w(),
|
||||
vertical: 24.0.h(),
|
||||
),
|
||||
padding: EdgeInsets.symmetric(vertical: 24.0.h()),
|
||||
child: Column(
|
||||
children: [
|
||||
TenderAppBar(),
|
||||
SizedBox(height: 24.0.h()),
|
||||
|
||||
MainTabBar(controller: controller),
|
||||
// MainTabBar(controller: controller),
|
||||
SizedBox(height: 24.0.h()),
|
||||
Stack(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
height: 762.0.h(),
|
||||
child: PageView.builder(
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemCount: sampleTenders.length,
|
||||
itemBuilder: (context, index) {
|
||||
final tender = sampleTenders[index];
|
||||
return TenderCard(
|
||||
date: tender.date,
|
||||
deadline: tender.deadline,
|
||||
title: tender.title,
|
||||
description: tender.description,
|
||||
tenderId: tender.tenderId,
|
||||
location: tender.location,
|
||||
country: tender.country,
|
||||
matchPercentage: tender.matchPercentage,
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: 237.0.h(),
|
||||
bottom: 366.0.h(),
|
||||
left: 9.0.w(),
|
||||
right: 9.0.w(),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
SvgPicture.asset(AssetsManager.arrowCircleLeft),
|
||||
SvgPicture.asset(AssetsManager.arrowCircleRight),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
MainTendersSlider(),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../models/tender_model.dart';
|
||||
import 'tender_card.dart';
|
||||
|
||||
class MainTendersSlider extends StatefulWidget {
|
||||
const MainTendersSlider({super.key});
|
||||
|
||||
@override
|
||||
State<MainTendersSlider> createState() => _MainTendersSliderState();
|
||||
}
|
||||
|
||||
class _MainTendersSliderState extends State<MainTendersSlider> {
|
||||
final PageController pageController = PageController();
|
||||
|
||||
List<Tender> likedTenders = [];
|
||||
List<Tender> dislikedTenders = [];
|
||||
|
||||
void _onDislike(Tender tender) {
|
||||
if (likedTenders.contains(tender)) {
|
||||
likedTenders.remove(tender);
|
||||
}
|
||||
|
||||
if (!dislikedTenders.contains(tender)) {
|
||||
dislikedTenders.add(tender);
|
||||
} else {
|
||||
dislikedTenders.remove(tender);
|
||||
}
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
void _onLike(Tender tender) {
|
||||
if (dislikedTenders.contains(tender)) {
|
||||
dislikedTenders.remove(tender);
|
||||
}
|
||||
|
||||
if (!likedTenders.contains(tender)) {
|
||||
likedTenders.add(tender);
|
||||
} else {
|
||||
likedTenders.remove(tender);
|
||||
}
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
void _goToPreviousPage() {
|
||||
pageController.animateToPage(
|
||||
pageController.page!.toInt() - 1,
|
||||
duration: Duration(milliseconds: 300),
|
||||
curve: Curves.easeInOutCubic,
|
||||
);
|
||||
}
|
||||
|
||||
void _goToNextPage() {
|
||||
pageController.animateToPage(
|
||||
pageController.page!.toInt() + 1,
|
||||
duration: Duration(milliseconds: 300),
|
||||
curve: Curves.easeInOutCubic,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Stack(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
height: 762.0.h(),
|
||||
child: PageView.builder(
|
||||
controller: pageController,
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemCount: sampleTenders.length,
|
||||
itemBuilder: (context, index) {
|
||||
final tender = sampleTenders[index];
|
||||
return TenderCard(
|
||||
date: tender.date,
|
||||
deadline: tender.deadline,
|
||||
title: tender.title,
|
||||
description: tender.description,
|
||||
tenderId: tender.tenderId,
|
||||
location: tender.location,
|
||||
country: tender.country,
|
||||
matchPercentage: tender.matchPercentage,
|
||||
isLiked: likedTenders.contains(tender),
|
||||
isDisliked: dislikedTenders.contains(tender),
|
||||
onDislike: () => _onDislike(tender),
|
||||
onLike: () => _onLike(tender),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: 237.0.h(),
|
||||
bottom: 366.0.h(),
|
||||
left: 9.0.w(),
|
||||
right: 9.0.w(),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: _goToPreviousPage,
|
||||
child: SvgPicture.asset(AssetsManager.arrowCircleLeft),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap: _goToNextPage,
|
||||
child: SvgPicture.asset(AssetsManager.arrowCircleRight),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/colors.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
|
||||
class TenderActionButtons extends StatelessWidget {
|
||||
@@ -30,7 +31,13 @@ class TenderActionButtons extends StatelessWidget {
|
||||
// Dislike button
|
||||
GestureDetector(
|
||||
onTap: onDislike,
|
||||
child: SvgPicture.asset(AssetsManager.dislike),
|
||||
child: SvgPicture.asset(
|
||||
AssetsManager.dislike,
|
||||
colorFilter: ColorFilter.mode(
|
||||
isDisliked ? AppColors.errorColor : AppColors.grey50,
|
||||
BlendMode.srcATop,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(width: 16.0.w()),
|
||||
@@ -44,7 +51,13 @@ class TenderActionButtons extends StatelessWidget {
|
||||
// Like button
|
||||
GestureDetector(
|
||||
onTap: onLike,
|
||||
child: SvgPicture.asset(AssetsManager.like),
|
||||
child: SvgPicture.asset(
|
||||
AssetsManager.like,
|
||||
colorFilter: ColorFilter.mode(
|
||||
isLiked ? AppColors.successColor : AppColors.grey50,
|
||||
BlendMode.srcATop,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user