go router added

This commit is contained in:
amirrezaghabeli
2025-08-05 08:23:05 +03:30
parent d5984b8bbf
commit 676124567f
14 changed files with 887 additions and 108 deletions
+62 -53
View File
@@ -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,
+1 -1
View File
@@ -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
+25
View File
@@ -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),
),
),
);
}
}
+4 -49
View File
@@ -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,
),
),
),
],
);