This commit is contained in:
Hamza-Ayed
2023-08-10 18:01:47 +03:00
parent 766354ac99
commit f0c90127fe
16 changed files with 908 additions and 188 deletions

View File

@@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:ride/constant/colors.dart';
class DrawerMenuPage extends StatelessWidget {
const DrawerMenuPage({super.key});
@override
Widget build(BuildContext context) {
return Container(
height: 500,
color: AppColor.secondaryColor.withOpacity(.5),
child: Column(
children: [
Container(
height: 100,
color: AppColor.secondaryColor,
),
Container(
color: Colors.transparent,
)
],
),
);
}
}

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:ride/constant/colors.dart';
import 'package:ride/constant/style.dart';
import 'package:ride/views/widgets/circle_container.dart';
@@ -11,11 +12,20 @@ class HomePage extends StatelessWidget {
return Scaffold(
backgroundColor: AppColor.secondaryColor,
appBar: AppBar(
elevation: 0,
backgroundColor: AppColor.secondaryColor,
elevation: 0,
leading: IconButton(
onPressed: () {
Get.back();
},
icon: const Icon(
Icons.arrow_back_ios_new,
color: AppColor.primaryColor,
),
),
title: Text(
'home',
style: AppStyle.title,
'Home'.tr,
style: AppStyle.title.copyWith(fontSize: 30),
),
),
body: Center(

View File

@@ -2,20 +2,27 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:ride/constant/colors.dart';
import 'package:ride/constant/style.dart';
import 'package:ride/controller/home/map_page_controller.dart';
import '../../constant/style.dart';
import '../../controller/home/menu_controller.dart';
import 'map_widget.dart/buttom_sheet_map_show.dart';
import 'map_widget.dart/map_menu_widget.dart';
import 'map_widget.dart/menu_map_page.dart';
import 'map_widget.dart/picker_animation_container.dart';
class MapPage extends StatelessWidget {
const MapPage({super.key});
@override
Widget build(BuildContext context) {
Get.put(MapController());
Get.put(MyMenuController());
return Scaffold(
body: GetBuilder<MapController>(
builder: (controller) => Stack(
children: [
GoogleMap(
body: Stack(
children: [
GetBuilder<MapController>(
builder: (controller) => GoogleMap(
onMapCreated: controller.onMapCreated,
cameraTargetBounds: CameraTargetBounds(controller.boundsdata),
minMaxZoomPreference: const MinMaxZoomPreference(6, 18),
@@ -34,12 +41,15 @@ class MapPage extends StatelessWidget {
'${argument.latitude.toString()},${argument.longitude.toString()}');
Get.back();
controller.changeButtomSheetShown();
controller.bottomSheet();
},
);
},
onTap: (argument) {
controller.hidePlaces();
controller.changeButtomSheetShown();
controller.bottomSheet();
},
initialCameraPosition: CameraPosition(
@@ -58,8 +68,13 @@ class MapPage extends StatelessWidget {
infoWindow: const InfoWindow(title: 'my location'),
),
Marker(
markerId: const MarkerId('destination'),
position: controller.mydestination),
markerId: const MarkerId('destination'),
position: controller.mydestination,
draggable: true,
onDragEnd: (v) {
print(v);
},
),
},
polylines: {
Polyline(
@@ -82,116 +97,44 @@ class MapPage extends StatelessWidget {
buildingsEnabled: true,
mapToolbarEnabled: true,
onCameraMove: (position) {
controller.mylocation = position.target;
controller.newMylocation = position.target;
// print('my' + controller.mylocation.toString());
// print('new' + controller.newMylocation.toString());
},
myLocationEnabled: true,
// liteModeEnabled: true,
),
Positioned(
top: 10,
left: 0,
right: 0,
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(16),
child: Container(
decoration:
const BoxDecoration(color: AppColor.secondaryColor),
child: TextField(
decoration: const InputDecoration(
suffixIcon: Icon(Icons.search)),
controller: controller.placeController,
onChanged: (value) {
if (controller.placeController.text.length > 6) {
controller.getPlaces();
controller.changeHeight();
}
},
// onEditingComplete: () => controller.changeHeight(),
),
),
),
Container(
height:
controller.places.isNotEmpty ? controller.height : 0,
color: AppColor.secondaryColor,
child: ListView.builder(
itemCount: controller.places.length,
itemBuilder: (BuildContext context, int index) {
var res = controller.places[index];
return TextButton(
onPressed: () {
controller.changeHeight();
Get.defaultDialog(
title: 'Are You sure to ride to ${res['name']}',
middleText: '',
onConfirm: () {
controller.getMap(
'${controller.mylocation.latitude.toString()},${controller.mylocation.longitude.toString()}',
"${res['geometry']['location']['lat']},${res['geometry']['location']['lng']}");
controller.places = [];
Get.back();
},
);
},
child: Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Image.network(
res['icon'],
width: 30,
),
Column(
children: [
Text(
res['name'].toString(),
style: AppStyle.title,
),
Text(
res['vicinity'].toString(),
style: AppStyle.subtitle,
),
],
),
Column(
children: [
Text(
'rate',
style: AppStyle.subtitle,
),
Text(
res['rating'].toString(),
style: AppStyle.subtitle,
),
],
),
],
),
const Divider(
thickness: 1,
)
],
),
);
},
),
)
],
),
),
// Positioned(
// bottom: 0,
// left: 0,
// right: 0,
// child: Container(
// height: 130, color: AppColor.secondaryColor, child: null))
],
),
),
const PickerIconOnMap(),
PickerAnimtionContainer(),
const MapMenuWidget(),
const MenuIconMapPageWidget(),
buttomSheetMapPage()
],
),
);
}
}
class PickerIconOnMap extends StatelessWidget {
const PickerIconOnMap({
super.key,
});
@override
Widget build(BuildContext context) {
return GetBuilder<MapController>(
builder: (controller) => Positioned(
bottom: 0,
top: 0,
left: 0,
right: 0,
child: controller.isPickerShown
? const Icon(
Icons.add_location,
color: Colors.purple,
)
: const SizedBox(),
));
}
}

View File

@@ -0,0 +1,132 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../constant/colors.dart';
import '../../../constant/style.dart';
import '../../../controller/home/map_page_controller.dart';
GetBuilder<MapController> buttomSheetMapPage() {
return GetBuilder<MapController>(
builder: (controller) => controller.isButtomSheetShown
? Positioned(
left: 5,
bottom: 0,
right: 5,
child: AnimatedContainer(
// clipBehavior: Clip.antiAliasWithSaveLayer,
curve: Curves.easeInCirc,
onEnd: () {
controller.height = 240;
},
height: controller.heightButtomSheetShown,
duration: const Duration(seconds: 2),
child: Column(
children: [
controller.data.isEmpty
? const SizedBox()
: Container(
// height: 100,
decoration: BoxDecoration(
color: AppColor.secondaryColor,
boxShadow: [
const BoxShadow(
color: AppColor.accentColor,
offset: Offset(2, 2)),
BoxShadow(
color:
AppColor.accentColor.withOpacity(.4),
offset: const Offset(-2, -2))
],
borderRadius: const BorderRadius.all(
Radius.circular(15))),
child: Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
'assets/images/jeep.png',
width: Get.width * .2,
repeat: ImageRepeat.repeatX,
),
)
],
),
),
const SizedBox(
height: 5,
),
Container(
// height: 130,
decoration: BoxDecoration(
color: AppColor.secondaryColor,
boxShadow: [
const BoxShadow(
color: AppColor.accentColor,
offset: Offset(2, 2)),
BoxShadow(
color: AppColor.accentColor.withOpacity(.4),
offset: const Offset(-2, -2))
],
borderRadius:
const BorderRadius.all(Radius.circular(15))),
child: controller.data.isEmpty
? const SizedBox()
: Center(
child: Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
children: [
Text(
'distance is ${controller.data[0]['distance']['text']}',
style: AppStyle.title,
),
Text(
'duration is ${controller.data[0]['duration']['text']}',
style: AppStyle.title,
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
children: [
Text(
'Cost for .21/km ${controller.cost.toStringAsFixed(2)} ',
style: AppStyle.title,
),
Text(
'costDuration ${controller.averageDuration.toStringAsFixed(2)} is ${controller.costDuration.toStringAsFixed(2)} ',
style: AppStyle.title,
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
children: [
Text(
'totalDriver ${controller.totalDriver.toStringAsFixed(2)}',
style: AppStyle.title,
),
Text(
'totaME ${controller.totaME.toStringAsFixed(2)} ',
style: AppStyle.title,
),
],
),
Text(
'Cost for passenger ${controller.totalPassenger.toStringAsFixed(2)} ',
style: AppStyle.title,
),
],
),
),
),
],
),
),
)
: const SizedBox());
}

View File

@@ -0,0 +1,125 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../constant/colors.dart';
import '../../../constant/style.dart';
import '../../../controller/home/map_page_controller.dart';
GetBuilder<MapController> formSearchPlaces() {
return GetBuilder<MapController>(
builder: (controller) => Positioned(
top: 5,
// width: Get.width * .8,
left: 50,
right: 0,
child: Column(
children: [
Container(
height: controller.places.isNotEmpty ? controller.height : 0,
color: AppColor.secondaryColor,
child: ListView.builder(
itemCount: controller.places.length,
itemBuilder: (BuildContext context, int index) {
var res = controller.places[index];
return InkWell(
onTap: () {
controller.changeHeight();
Get.defaultDialog(
title: 'Are You sure to ride to ${res['name']}',
middleText: '',
onConfirm: () {
controller.clearpolyline();
controller.getMap(
'${controller.mylocation.latitude.toString()},${controller.mylocation.longitude.toString()}',
"${res['geometry']['location']['lat']},${res['geometry']['location']['lng']}");
controller.places = [];
Get.back();
controller.bottomSheet();
// Get.back();
},
);
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Image.network(
res['icon'],
width: 30,
),
Column(
children: [
Text(
res['name'].toString(),
style: AppStyle.title,
),
Text(
res['vicinity'].toString(),
style: AppStyle.subtitle,
),
],
),
Column(
children: [
Text(
'rate',
style: AppStyle.subtitle,
),
Text(
res['rating'].toString(),
style: AppStyle.subtitle,
),
],
),
],
),
const Divider(
thickness: 1,
)
],
),
),
);
},
),
),
Padding(
padding: const EdgeInsets.all(16),
child: Container(
decoration:
const BoxDecoration(color: AppColor.secondaryColor),
child: TextField(
decoration: InputDecoration(
suffixIcon: const Icon(Icons.search),
hintText: 'Type here Place',
hintMaxLines: 1,
prefixIcon: IconButton(
onPressed: () {
controller.placeController.clear();
controller.clearPlaces();
},
icon: Icon(
Icons.clear,
color: Colors.red[300],
),
),
),
controller: controller.placeController,
onChanged: (value) {
if (controller.placeController.text.length > 5) {
controller.getPlaces();
controller.changeHeight();
}
},
// onEditingComplete: () => controller.changeHeight(),
),
),
)
],
),
));
}

View File

@@ -0,0 +1,94 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sqflite/sqflite.dart';
import '../../../constant/colors.dart';
import '../../../controller/home/map_page_controller.dart';
import '../../notification/notification_page.dart';
import '../../widgets/icon_widget_menu.dart';
import '../home_page.dart';
import '../profile/passenger_profile_page.dart';
class MapMenuWidget extends StatelessWidget {
const MapMenuWidget({
super.key,
});
@override
Widget build(BuildContext context) {
return GetBuilder<MapController>(
builder: (controller) => Positioned(
right: 60,
left: 60,
child: Padding(
padding: const EdgeInsets.only(right: 20),
child: Opacity(
alwaysIncludeSemantics: false,
opacity: 0.99, // Adjust the opacity value as needed
child: AnimatedContainer(
width: Get.width * .6,
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(12)),
color: AppColor.secondaryColor,
boxShadow: [
BoxShadow(
color: AppColor.primaryColor,
offset: Offset(-7, -7),
blurRadius: 0,
spreadRadius: 0,
blurStyle: BlurStyle.outer),
BoxShadow(
color: AppColor.accentColor,
offset: Offset(3, 3),
blurRadius: 0,
spreadRadius: 0,
blurStyle: BlurStyle.outer)
]),
transform:
Matrix4.translationValues(controller.heightMenu * .1, 1, 1),
curve: Curves.easeOutCubic,
clipBehavior: Clip.hardEdge,
duration: const Duration(milliseconds: 300),
height: controller.heightMenu,
child: controller.heightMenuBool
? Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
IconWidgetMenu(
onpressed: () {
Get.to(
() => const NotificationPage(),
transition: Transition.circularReveal,
);
},
title: 'Notifications'.tr,
icon: Icons.notifications),
IconWidgetMenu(
onpressed: () {
Get.to(
() => const PassengerProfilePage(),
transition: Transition.zoom,
);
},
icon: Icons.person,
title: 'Profile'.tr,
),
IconWidgetMenu(
title: 'Home'.tr,
onpressed: () {
Get.to(
() => const HomePage(),
transition: Transition.downToUp,
curve: Curves.easeInOutExpo,
);
},
icon: Icons.home),
],
)
: const SizedBox(), // Choose the desired overlay color
)),
),
),
);
}
}

View File

@@ -0,0 +1,55 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../constant/box_name.dart';
import '../../../constant/colors.dart';
import '../../../controller/home/map_page_controller.dart';
import '../../../main.dart';
class MenuIconMapPageWidget extends StatelessWidget {
const MenuIconMapPageWidget({
super.key,
});
@override
Widget build(BuildContext context) {
return GetBuilder<MapController>(
builder: (controller) => Positioned(
top: 30,
left: box.read(BoxName.lang) != 'ar' ? 5 : null,
right: box.read(BoxName.lang) == 'ar' ? 5 : null,
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle,
color: AppColor.secondaryColor,
border: Border.all(color: AppColor.accentColor)),
child: AnimatedCrossFade(
sizeCurve: Curves.bounceOut,
duration: const Duration(
milliseconds: 300), // Adjust the duration as needed
crossFadeState: controller.heightMenuBool
? CrossFadeState.showFirst
: CrossFadeState.showSecond,
firstChild: IconButton(
onPressed: () {
controller.getDrawerMenu();
},
icon: const Icon(
Icons.close,
color: AppColor.primaryColor,
),
),
secondChild: IconButton(
onPressed: () {
controller.getDrawerMenu();
},
icon: const Icon(
Icons.menu,
color: AppColor.accentColor,
),
),
),
),
));
}
}

View File

@@ -0,0 +1,108 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../constant/colors.dart';
import '../../../constant/style.dart';
import '../../../controller/home/map_page_controller.dart';
import '../../widgets/elevated_btn.dart';
import 'buttom_sheet_map_show.dart';
import 'form_search_places.dart';
class PickerAnimtionContainer extends StatelessWidget {
PickerAnimtionContainer({
super.key,
});
final controller = MapController();
@override
Widget build(BuildContext context) {
return GetBuilder<MapController>(
builder: (controller) => Positioned(
bottom: 0,
left: 0,
right: 60,
child: AnimatedContainer(
duration: const Duration(milliseconds: 300),
height: controller.places.isNotEmpty
? 300
: controller.heightPickerContainer,
decoration: const BoxDecoration(
boxShadow: [
BoxShadow(
color: AppColor.accentColor, offset: Offset(2, 2)),
BoxShadow(
color: AppColor.accentColor, offset: Offset(-2, -2))
],
color: AppColor.secondaryColor,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(15),
topRight: Radius.circular(15),
)),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
controller.isPickerShown
? const SizedBox()
: Text(
'Hi, Where to ',
style: AppStyle.title,
),
Column(
children: [
const SizedBox(
height: 5,
),
controller.isPickerShown
? InkWell(
onTapDown: (details) =>
controller.changePickerShown(),
child: Container(
height: 4,
width: Get.width * .3,
decoration: BoxDecoration(
color: AppColor.accentColor,
borderRadius: BorderRadius.circular(10),
border: Border.all(
color: AppColor.accentColor,
)),
),
)
: const SizedBox(),
controller.isPickerShown
? InkWell(
onTap: () {},
child: formSearchPlaces(),
)
: TextButton(
onPressed: () {
controller.changePickerShown();
},
child: Builder(builder: (context) {
return Text(
"Pick your destination from Map".tr,
style: AppStyle.subtitle,
);
}),
)
],
),
if (controller.isPickerShown && controller.places.isEmpty)
MyElevatedButton(
title: 'Go to this Target',
onPressed: () async {
await controller.getMap(
'${controller.mylocation.latitude},${controller.mylocation.longitude}',
'${controller.newMylocation.latitude},${controller.newMylocation.longitude}',
);
controller.changePickerShown();
controller.changeButtomSheetShown();
controller.bottomSheet();
},
),
if (controller.isPickerShown && controller.places.isEmpty)
const SizedBox(),
],
),
),
));
}
}

View File

@@ -0,0 +1,34 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../constant/colors.dart';
import '../../../constant/style.dart';
class PassengerProfilePage extends StatelessWidget {
const PassengerProfilePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.secondaryColor,
appBar: AppBar(
backgroundColor: AppColor.secondaryColor,
elevation: 0,
leading: IconButton(
onPressed: () {
Get.back();
},
icon: const Icon(
Icons.arrow_back_ios_new,
color: AppColor.primaryColor,
),
),
title: Text(
'My Profile'.tr,
style: AppStyle.title.copyWith(fontSize: 30),
),
),
body: Container(),
);
}
}

View File

@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:ride/constant/colors.dart';
import 'package:ride/constant/style.dart';
class NotificationPage extends StatelessWidget {
const NotificationPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.secondaryColor,
appBar: AppBar(
backgroundColor: AppColor.secondaryColor,
elevation: 0,
leading: IconButton(
onPressed: () {
Get.back();
},
icon: const Icon(
Icons.arrow_back_ios_new,
color: AppColor.primaryColor,
),
),
title: Text(
'Notificatios'.tr,
style: AppStyle.title.copyWith(fontSize: 30),
),
),
body: SafeArea(
child: Center(
child: null,
)),
);
}
}

View File

@@ -0,0 +1,66 @@
import 'package:flutter/material.dart';
import 'package:ride/constant/style.dart';
import '../../constant/colors.dart';
class IconWidgetMenu extends StatelessWidget {
const IconWidgetMenu({
Key? key,
required this.onpressed,
required this.icon,
required this.title,
}) : super(key: key);
final VoidCallback onpressed;
final IconData icon;
final String title;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: onpressed,
child: Padding(
padding: const EdgeInsets.only(top: 25),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
width: 50,
decoration: const BoxDecoration(
color: AppColor.secondaryColor,
shape: BoxShape.circle,
boxShadow: [
BoxShadow(
color: AppColor.secondaryColor,
offset: Offset(-2, -2),
blurRadius: 0,
spreadRadius: 0,
blurStyle: BlurStyle.outer,
),
BoxShadow(
color: AppColor.accentColor,
offset: Offset(3, 3),
blurRadius: 0,
spreadRadius: 0,
blurStyle: BlurStyle.outer,
),
],
),
child: Center(
child: Icon(
icon,
size: 30,
color: AppColor.primaryColor,
),
),
),
Text(
title,
style: AppStyle.subtitle,
)
],
),
),
);
}
}