firstios
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -42,3 +42,7 @@ app.*.map.json
|
|||||||
/android/app/debug
|
/android/app/debug
|
||||||
/android/app/profile
|
/android/app/profile
|
||||||
/android/app/release
|
/android/app/release
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
lib/constant/credential.dart
|
||||||
@@ -1,33 +1,24 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<application
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
android:label="ride"
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
android:name="${applicationName}"
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
android:icon="@mipmap/ic_launcher">
|
|
||||||
<activity
|
<application android:label="ride" android:name="${applicationName}" android:icon="@mipmap/ic_launcher">
|
||||||
android:name=".MainActivity"
|
<activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize">
|
||||||
android:exported="true"
|
|
||||||
android:launchMode="singleTop"
|
|
||||||
android:theme="@style/LaunchTheme"
|
|
||||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
|
||||||
android:hardwareAccelerated="true"
|
|
||||||
android:windowSoftInputMode="adjustResize">
|
|
||||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||||
the Android process has started. This theme is visible to the user
|
the Android process has started. This theme is visible to the user
|
||||||
while the Flutter UI initializes. After that, this theme continues
|
while the Flutter UI initializes. After that, this theme continues
|
||||||
to determine the Window background behind the Flutter UI. -->
|
to determine the Window background behind the Flutter UI. -->
|
||||||
<meta-data
|
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" />
|
||||||
android:name="io.flutter.embedding.android.NormalTheme"
|
|
||||||
android:resource="@style/NormalTheme"
|
|
||||||
/>
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
<meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0" />
|
||||||
|
|
||||||
<!-- Don't delete the meta-data below.
|
<!-- Don't delete the meta-data below.
|
||||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||||
<meta-data
|
<meta-data android:name="flutterEmbedding" android:value="2" />
|
||||||
android:name="flutterEmbedding"
|
|
||||||
android:value="2" />
|
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
ext.kotlin_version = '1.7.10'
|
ext.kotlin_version = '1.9.0'
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
|||||||
BIN
assets/images/picker.png
Normal file
BIN
assets/images/picker.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 448 B |
@@ -1,12 +0,0 @@
|
|||||||
import 'dart:convert';
|
|
||||||
|
|
||||||
class AppCredintials {
|
|
||||||
static const String basicAuthCredentials = 'hamzaayedphp:malDEV@2101';
|
|
||||||
static const String serverAPI =
|
|
||||||
'AAAAinYllCo:APA91bF1shTpzSsSxqbfY6c60D8zs1ZsdIsl9ix6nl7GDdjCqWPRK0G0ub5SqFdb1jDpQDvQPxGg-697MWLo0sy3oYImBwBLObyhk0GjtNzyr0PbE3hI-pOvhf8Vp1xgUgBmofbZYXkH';
|
|
||||||
// static const String mapAPIKEY = 'AIzaSyC1pjEgB78OFz_-2nwTvGltHjXho0y99MY';
|
|
||||||
static const String mapAPIKEY = 'AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0';
|
|
||||||
String getBasicAuthCredentials() {
|
|
||||||
return base64Encode(utf8.encode(basicAuthCredentials));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
class AppLink {
|
class AppLink {
|
||||||
static const String server = 'https://ride.mobile-app.store/';
|
static const String server = 'https://ride.mobile-app.store/';
|
||||||
|
static const String googleMapsLink = 'https://maps.googleapis.com/maps/api/';
|
||||||
|
|
||||||
static const String test = "$server/test.php";
|
static const String test = "$server/test.php";
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ class CRUD {
|
|||||||
'Basic ${base64Encode(utf8.encode(AppCredintials.basicAuthCredentials))}',
|
'Basic ${base64Encode(utf8.encode(AppCredintials.basicAuthCredentials))}',
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
var jsonData = jsonDecode(response.body);
|
var jsonData = jsonDecode(response.body);
|
||||||
if (jsonData['status'] == 'success') {
|
if (jsonData['status'] == 'success') {
|
||||||
@@ -55,6 +56,26 @@ class CRUD {
|
|||||||
return (response.body);
|
return (response.body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<dynamic> getGoogleApi({
|
||||||
|
required String link,
|
||||||
|
Map<String, dynamic>? payload,
|
||||||
|
}) async {
|
||||||
|
var url = Uri.parse(
|
||||||
|
link,
|
||||||
|
);
|
||||||
|
var response = await http.post(
|
||||||
|
url,
|
||||||
|
body: payload,
|
||||||
|
);
|
||||||
|
print(response.request);
|
||||||
|
var jsonData = jsonDecode(response.body);
|
||||||
|
// print(jsonData);
|
||||||
|
if (jsonData['status'] == 'OK') {
|
||||||
|
return jsonData;
|
||||||
|
}
|
||||||
|
return (jsonData['status']);
|
||||||
|
}
|
||||||
|
|
||||||
Future<dynamic> update({
|
Future<dynamic> update({
|
||||||
required String endpoint,
|
required String endpoint,
|
||||||
required Map<String, dynamic> data,
|
required Map<String, dynamic> data,
|
||||||
|
|||||||
273
lib/controller/home/map_page_controller.dart
Normal file
273
lib/controller/home/map_page_controller.dart
Normal file
@@ -0,0 +1,273 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'dart:math' as math;
|
||||||
|
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||||
|
import 'package:google_polyline_algorithm/google_polyline_algorithm.dart';
|
||||||
|
import 'package:ride/constant/colors.dart';
|
||||||
|
import 'package:ride/constant/credential.dart';
|
||||||
|
import 'package:ride/constant/links.dart';
|
||||||
|
import 'package:ride/constant/style.dart';
|
||||||
|
import 'package:ride/controller/functions/crud.dart';
|
||||||
|
|
||||||
|
class MapController extends GetxController {
|
||||||
|
bool isloading = true;
|
||||||
|
TextEditingController placeController = TextEditingController();
|
||||||
|
List data = [];
|
||||||
|
List<LatLng> bounds = [];
|
||||||
|
List places = [];
|
||||||
|
LatLngBounds? boundsdata;
|
||||||
|
List<Marker> markers = [];
|
||||||
|
List<Polyline> polylines = [];
|
||||||
|
LatLng mylocation = const LatLng(32.111965, 36.067427);
|
||||||
|
LatLng mydestination = const LatLng(32.115295, 36.064773);
|
||||||
|
final List<LatLng> polylineCoordinates = [];
|
||||||
|
BitmapDescriptor markerIcon = BitmapDescriptor.defaultMarker;
|
||||||
|
double height = 200;
|
||||||
|
|
||||||
|
changeHeight() {
|
||||||
|
if (places.isEmpty) {
|
||||||
|
height = 0;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
height = 200;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
hidePlaces() {
|
||||||
|
height = 0;
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future getPlaces() async {
|
||||||
|
var url =
|
||||||
|
'${AppLink.googleMapsLink}place/nearbysearch/json?keyword=${placeController.text}&location=32.111946,${mylocation.longitude}&radius=10000&type=restaurant&language=ar&key=${AppCredintials.mapAPIKEY}';
|
||||||
|
|
||||||
|
var response = await CRUD().getGoogleApi(link: url, payload: {});
|
||||||
|
|
||||||
|
places = response['results'];
|
||||||
|
print(places);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
LatLng fromString(String location) {
|
||||||
|
List<String> parts = location.split(',');
|
||||||
|
double lat = double.parse(parts[0]);
|
||||||
|
double lng = double.parse(parts[1]);
|
||||||
|
return LatLng(lat, lng);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearpolyline() {
|
||||||
|
polylines = [];
|
||||||
|
polylineCoordinates.clear();
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void addCustomPicker() {
|
||||||
|
ImageConfiguration config = const ImageConfiguration(
|
||||||
|
size: Size(20, 20),
|
||||||
|
// scale: 1.0,
|
||||||
|
);
|
||||||
|
BitmapDescriptor.fromAssetImage(config, 'assets/images/picker.png')
|
||||||
|
.then((value) {
|
||||||
|
markerIcon = value;
|
||||||
|
update();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
GoogleMapController? mapController;
|
||||||
|
void onMapCreated(GoogleMapController controller) {
|
||||||
|
mapController = controller;
|
||||||
|
controller.getVisibleRegion();
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
getMap(String origin, destination) async {
|
||||||
|
var origin1 = fromString(origin);
|
||||||
|
var destination1 = fromString(destination);
|
||||||
|
isloading = false;
|
||||||
|
mydestination = destination1;
|
||||||
|
mylocation = origin1;
|
||||||
|
update();
|
||||||
|
|
||||||
|
var url =
|
||||||
|
('${AppLink.googleMapsLink}directions/json?&language=en&avoid=tolls|ferries&destination=$destination&origin=$origin&key=${AppCredintials.mapAPIKEY}');
|
||||||
|
|
||||||
|
var response = await CRUD().getGoogleApi(link: url, payload: {});
|
||||||
|
data = response['routes'][0]['legs'];
|
||||||
|
|
||||||
|
final points =
|
||||||
|
decodePolyline(response["routes"][0]["overview_polyline"]["points"]);
|
||||||
|
for (int i = 0; i < points.length; i++) {
|
||||||
|
double lat = points[i][0].toDouble();
|
||||||
|
double lng = points[i][1].toDouble();
|
||||||
|
polylineCoordinates.add(LatLng(lat, lng));
|
||||||
|
}
|
||||||
|
// // Define the northeast and southwest coordinates
|
||||||
|
final bounds = response["routes"][0]["bounds"];
|
||||||
|
// LatLng northeast =
|
||||||
|
// LatLng(bounds['northeast']['lat'], bounds['northeast']['lng']);
|
||||||
|
// LatLng southwest =
|
||||||
|
// LatLng(bounds['southwest']['lat'], bounds['southwest']['lng']);
|
||||||
|
|
||||||
|
// // Create the LatLngBounds using the coordinates
|
||||||
|
// boundsdata = LatLngBounds(northeast: northeast, southwest: southwest);
|
||||||
|
// update();
|
||||||
|
// print(boundsdata);
|
||||||
|
////////////////////////////////////////////
|
||||||
|
// Create the northeast and southwest LatLng objects
|
||||||
|
LatLng northeast =
|
||||||
|
LatLng(bounds['northeast']['lat'], bounds['northeast']['lng']);
|
||||||
|
LatLng southwest =
|
||||||
|
LatLng(bounds['southwest']['lat'], bounds['southwest']['lng']);
|
||||||
|
|
||||||
|
// Create the LatLngBounds object
|
||||||
|
LatLngBounds boundsData =
|
||||||
|
LatLngBounds(northeast: northeast, southwest: southwest);
|
||||||
|
|
||||||
|
// Calculate padding for the bounding box
|
||||||
|
double distance = math.sqrt(
|
||||||
|
math.pow(northeast.latitude - southwest.latitude, 2) +
|
||||||
|
math.pow(northeast.longitude - southwest.longitude, 2),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Define the map padding
|
||||||
|
final double padding = 50.0;
|
||||||
|
|
||||||
|
// Get the screen dimensions
|
||||||
|
final screenSize = Get.size;
|
||||||
|
print(screenSize.width);
|
||||||
|
print('================');
|
||||||
|
// Adjust the bounding box to include padding
|
||||||
|
LatLngBounds adjustedBounds = LatLngBounds(
|
||||||
|
southwest: LatLng(boundsData.southwest.latitude - padding,
|
||||||
|
boundsData.southwest.longitude - padding),
|
||||||
|
northeast: LatLng(boundsData.northeast.latitude + padding,
|
||||||
|
boundsData.northeast.longitude + padding),
|
||||||
|
);
|
||||||
|
// Calculate the zoom level based on the distance and screen size
|
||||||
|
double zoomLevel = getZoomLevel(distance, screenSize.width);
|
||||||
|
// Animate the camera to the adjusted bounds
|
||||||
|
mapController!.animateCamera(CameraUpdate.newLatLngBounds(
|
||||||
|
adjustedBounds,
|
||||||
|
screenSize.width,
|
||||||
|
));
|
||||||
|
|
||||||
|
if (polylines.isNotEmpty) {
|
||||||
|
clearpolyline();
|
||||||
|
} else {
|
||||||
|
var polyline = Polyline(
|
||||||
|
polylineId: PolylineId(response["routes"][0]["summary"]),
|
||||||
|
points: polylineCoordinates,
|
||||||
|
width: 10,
|
||||||
|
color: Colors.blue,
|
||||||
|
);
|
||||||
|
|
||||||
|
polylines.add(polyline);
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double getZoomLevel(double distance, double screenWidth) {
|
||||||
|
const double zoomFactor = 15.0;
|
||||||
|
const double pixelRatio =
|
||||||
|
156543.03392; // Earth circumference in pixels at zoom level 0
|
||||||
|
|
||||||
|
double zoomLevel =
|
||||||
|
(math.log(pixelRatio * screenWidth / (distance * zoomFactor))) /
|
||||||
|
math.log(2);
|
||||||
|
return zoomLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
double getDistanceFromText(String distanceText) {
|
||||||
|
// Remove any non-digit characters from the distance text
|
||||||
|
String distanceValue = distanceText.replaceAll(RegExp(r'[^0-9.]+'), '');
|
||||||
|
|
||||||
|
// Parse the extracted numerical value as a double
|
||||||
|
double distance = double.parse(distanceValue);
|
||||||
|
|
||||||
|
return distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bottomSheet() {
|
||||||
|
String distanceText = data[0]['distance']['text'];
|
||||||
|
String durationText = data[0]['duration']['text'];
|
||||||
|
double distance = getDistanceFromText(distanceText);
|
||||||
|
double duration = getDistanceFromText(durationText);
|
||||||
|
double cost = distance * 0.21;
|
||||||
|
double costDuration = duration * 0.05;
|
||||||
|
double totalPassenger = cost + costDuration;
|
||||||
|
Get.bottomSheet(
|
||||||
|
Container(
|
||||||
|
height: 130,
|
||||||
|
color: AppColor.secondaryColor,
|
||||||
|
child: data.isEmpty
|
||||||
|
? Center(
|
||||||
|
child: Text(
|
||||||
|
'Where are you want to go..',
|
||||||
|
style: AppStyle.title,
|
||||||
|
))
|
||||||
|
: Center(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'distance is ${data[0]['distance']['text']}',
|
||||||
|
style: AppStyle.title,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'duration is ${data[0]['duration']['text']}',
|
||||||
|
style: AppStyle.title,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'Cost for .21/km $cost ',
|
||||||
|
style: AppStyle.title,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'Cost duration .05/m $costDuration ',
|
||||||
|
style: AppStyle.title,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'Total cost $totalPassenger ',
|
||||||
|
style: AppStyle.title,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
elevation: 6,
|
||||||
|
enableDrag: true,
|
||||||
|
isDismissible: true,
|
||||||
|
useRootNavigator: true,
|
||||||
|
backgroundColor: AppColor.secondaryColor,
|
||||||
|
barrierColor: AppColor.accentColor.withOpacity(.4),
|
||||||
|
persistent: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<LatLng> polylineCoordinate = [];
|
||||||
|
double calculateCost(double distance) {
|
||||||
|
const double costRate = 0.27;
|
||||||
|
// double distanceInKm = distance / 1000; // convert distance to kilometers
|
||||||
|
double cost = costRate * distance;
|
||||||
|
return cost;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
// getPolyLine();
|
||||||
|
// getMap();
|
||||||
|
addCustomPicker();
|
||||||
|
|
||||||
|
super.onInit();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ import 'constant/box_name.dart';
|
|||||||
import 'controller/local/local_controller.dart';
|
import 'controller/local/local_controller.dart';
|
||||||
import 'controller/local/translations.dart';
|
import 'controller/local/translations.dart';
|
||||||
import 'firebase_options.dart';
|
import 'firebase_options.dart';
|
||||||
import 'views/home/auth/login_page.dart';
|
import 'views/home/map_page.dart';
|
||||||
|
|
||||||
final box = GetStorage();
|
final box = GetStorage();
|
||||||
void main() async {
|
void main() async {
|
||||||
@@ -30,7 +30,7 @@ class MyApp extends StatelessWidget {
|
|||||||
LocaleController controller = Get.put(LocaleController());
|
LocaleController controller = Get.put(LocaleController());
|
||||||
|
|
||||||
return GetMaterialApp(
|
return GetMaterialApp(
|
||||||
title: 'Fleek-tech',
|
title: 'Ride',
|
||||||
translations: MyTranslation(),
|
translations: MyTranslation(),
|
||||||
debugShowCheckedModeBanner: false,
|
debugShowCheckedModeBanner: false,
|
||||||
locale: controller.language,
|
locale: controller.language,
|
||||||
@@ -40,6 +40,6 @@ class MyApp extends StatelessWidget {
|
|||||||
home: box.read(BoxName.lang).toString() != 'ar' &&
|
home: box.read(BoxName.lang).toString() != 'ar' &&
|
||||||
box.read(BoxName.lang).toString() != 'en'
|
box.read(BoxName.lang).toString() != 'en'
|
||||||
? const Language()
|
? const Language()
|
||||||
: LoginPage());
|
: const MapPage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
import '../../../controller/auth/login_controller.dart';
|
import '../../controller/auth/login_controller.dart';
|
||||||
|
|
||||||
class LoginPage extends StatelessWidget {
|
class LoginPage extends StatelessWidget {
|
||||||
final controller = Get.put(LoginController());
|
final controller = Get.put(LoginController());
|
||||||
138
lib/views/home/map_page.dart
Normal file
138
lib/views/home/map_page.dart
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
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/controller/home/map_page_controller.dart';
|
||||||
|
|
||||||
|
class MapPage extends StatelessWidget {
|
||||||
|
const MapPage({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
Get.put(MapController());
|
||||||
|
return Scaffold(
|
||||||
|
body: GetBuilder<MapController>(
|
||||||
|
builder: (controller) => Stack(
|
||||||
|
children: [
|
||||||
|
GoogleMap(
|
||||||
|
onMapCreated: controller.onMapCreated,
|
||||||
|
cameraTargetBounds: CameraTargetBounds(controller.boundsdata),
|
||||||
|
minMaxZoomPreference: const MinMaxZoomPreference(12, 18),
|
||||||
|
onLongPress: (argument) {
|
||||||
|
Get.defaultDialog(
|
||||||
|
title: 'Are you want to go to this site',
|
||||||
|
content: Column(
|
||||||
|
children: [
|
||||||
|
Text('${argument.latitude},${argument.longitude}'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
onConfirm: () {
|
||||||
|
controller.clearpolyline();
|
||||||
|
controller.getMap('32.111946, 36.067396',
|
||||||
|
'${argument.latitude.toString()},${argument.longitude.toString()}');
|
||||||
|
|
||||||
|
Get.back();
|
||||||
|
controller.bottomSheet();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
onTap: (argument) {
|
||||||
|
controller.hidePlaces();
|
||||||
|
controller.bottomSheet();
|
||||||
|
},
|
||||||
|
initialCameraPosition: CameraPosition(
|
||||||
|
target: controller.mylocation,
|
||||||
|
zoom: 15,
|
||||||
|
),
|
||||||
|
markers: {
|
||||||
|
Marker(
|
||||||
|
markerId: const MarkerId('MyLocation'),
|
||||||
|
position: controller.mylocation,
|
||||||
|
draggable: true,
|
||||||
|
icon: controller.markerIcon,
|
||||||
|
onDragEnd: (value) {
|
||||||
|
print(value);
|
||||||
|
},
|
||||||
|
infoWindow: const InfoWindow(title: 'my location'),
|
||||||
|
),
|
||||||
|
Marker(
|
||||||
|
markerId: const MarkerId('destination'),
|
||||||
|
position: controller.mydestination),
|
||||||
|
},
|
||||||
|
polylines: {
|
||||||
|
Polyline(
|
||||||
|
polylineId: const PolylineId('route'),
|
||||||
|
points: controller.polylineCoordinates,
|
||||||
|
color: AppColor.primaryColor,
|
||||||
|
width: 3,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
mapType: MapType.normal,
|
||||||
|
myLocationButtonEnabled: true,
|
||||||
|
indoorViewEnabled: true,
|
||||||
|
trafficEnabled: 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: Text(
|
||||||
|
res['name'].toString(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ import Foundation
|
|||||||
import firebase_core
|
import firebase_core
|
||||||
import firebase_messaging
|
import firebase_messaging
|
||||||
import flutter_local_notifications
|
import flutter_local_notifications
|
||||||
import geolocator_apple
|
import location
|
||||||
import path_provider_foundation
|
import path_provider_foundation
|
||||||
import sqflite
|
import sqflite
|
||||||
import url_launcher_macos
|
import url_launcher_macos
|
||||||
@@ -17,7 +17,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|||||||
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
|
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
|
||||||
FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin"))
|
FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin"))
|
||||||
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
|
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
|
||||||
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
|
LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin"))
|
||||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
|
||||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||||
|
|||||||
104
pubspec.lock
104
pubspec.lock
@@ -97,6 +97,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.5"
|
version: "1.0.5"
|
||||||
|
custom_searchable_dropdown:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: custom_searchable_dropdown
|
||||||
|
sha256: c2676b1ee55f0b71a7cd890ae473cf97651f018b2695b3bf57c8c28a14e2fa95
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.1"
|
||||||
dbus:
|
dbus:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -214,14 +222,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.15"
|
version: "2.0.15"
|
||||||
flutter_polyline_points:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: flutter_polyline_points
|
|
||||||
sha256: "02699e69142f51a248d784b6e3eec524194467fca5f7c4da19699ce2368b6980"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "1.0.0"
|
|
||||||
flutter_test:
|
flutter_test:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description: flutter
|
description: flutter
|
||||||
@@ -232,54 +232,6 @@ packages:
|
|||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
geolocator:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: geolocator
|
|
||||||
sha256: "5c23f3613f50586c0bbb2b8f970240ae66b3bd992088cf60dd5ee2e6f7dde3a8"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "9.0.2"
|
|
||||||
geolocator_android:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: geolocator_android
|
|
||||||
sha256: "835ff5b4888a2f8eba128996494faf9c5d422785322a81dc0565b99e0f6c379d"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "4.2.2"
|
|
||||||
geolocator_apple:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: geolocator_apple
|
|
||||||
sha256: "36527c555f4c425f7d8fa8c7c07d67b78e3ff7590d40448051959e1860c1cfb4"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "2.2.7"
|
|
||||||
geolocator_platform_interface:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: geolocator_platform_interface
|
|
||||||
sha256: af4d69231452f9620718588f41acc4cb58312368716bfff2e92e770b46ce6386
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "4.0.7"
|
|
||||||
geolocator_web:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: geolocator_web
|
|
||||||
sha256: f68a122da48fcfff68bbc9846bb0b74ef651afe84a1b1f6ec20939de4d6860e1
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "2.1.6"
|
|
||||||
geolocator_windows:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: geolocator_windows
|
|
||||||
sha256: f5911c88e23f48b598dd506c7c19eff0e001645bdc03bb6fecb9f4549208354d
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.1.1"
|
|
||||||
get:
|
get:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -360,6 +312,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.5.3"
|
version: "0.5.3"
|
||||||
|
google_polyline_algorithm:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: google_polyline_algorithm
|
||||||
|
sha256: "357874f00d3f93c3ba1bf4b4d9a154aa9ee87147c068238c1e8392012b686a03"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.1.0"
|
||||||
google_sign_in:
|
google_sign_in:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -456,6 +416,30 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.1"
|
version: "2.1.1"
|
||||||
|
location:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: location
|
||||||
|
sha256: c8e0c8cd92c6ce8b42760f9aafd6d80592459e2e0cd702bc336061c738ec4715
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "5.0.2+1"
|
||||||
|
location_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: location_platform_interface
|
||||||
|
sha256: a211a41b1fdfaddaf02996750dd703abcc7ac1d4fd90e978c8773ccf2260af68
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.1.1"
|
||||||
|
location_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: location_web
|
||||||
|
sha256: acde3e95c4dec2b82cbdc3490bf010eeaf66e793e20f62364887e072bd701d49
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.1.1"
|
||||||
lottie:
|
lottie:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -757,14 +741,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.7"
|
version: "3.0.7"
|
||||||
uuid:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: uuid
|
|
||||||
sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.0.7"
|
|
||||||
vector_math:
|
vector_math:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -38,9 +38,7 @@ dependencies:
|
|||||||
firebase_messaging: ^14.6.5
|
firebase_messaging: ^14.6.5
|
||||||
firebase_core: ^2.15.0
|
firebase_core: ^2.15.0
|
||||||
flutter_local_notifications: ^15.1.0+1
|
flutter_local_notifications: ^15.1.0+1
|
||||||
geolocator: ^9.0.2
|
|
||||||
google_maps_flutter: ^2.4.0
|
google_maps_flutter: ^2.4.0
|
||||||
flutter_polyline_points: ^1.0.0
|
|
||||||
sqflite: ^2.3.0
|
sqflite: ^2.3.0
|
||||||
path: ^1.8.3
|
path: ^1.8.3
|
||||||
google_sign_in: ^6.1.4
|
google_sign_in: ^6.1.4
|
||||||
@@ -51,6 +49,9 @@ dependencies:
|
|||||||
get: ^4.6.5
|
get: ^4.6.5
|
||||||
get_storage: ^2.1.1
|
get_storage: ^2.1.1
|
||||||
url_launcher: ^6.1.12
|
url_launcher: ^6.1.12
|
||||||
|
location: ^5.0.2+1
|
||||||
|
google_polyline_algorithm: ^3.1.0
|
||||||
|
custom_searchable_dropdown: ^2.1.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|||||||
@@ -7,14 +7,11 @@
|
|||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
#include <firebase_core/firebase_core_plugin_c_api.h>
|
#include <firebase_core/firebase_core_plugin_c_api.h>
|
||||||
#include <geolocator_windows/geolocator_windows.h>
|
|
||||||
#include <url_launcher_windows/url_launcher_windows.h>
|
#include <url_launcher_windows/url_launcher_windows.h>
|
||||||
|
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
FirebaseCorePluginCApiRegisterWithRegistrar(
|
FirebaseCorePluginCApiRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("FirebaseCorePluginCApi"));
|
registry->GetRegistrarForPlugin("FirebaseCorePluginCApi"));
|
||||||
GeolocatorWindowsRegisterWithRegistrar(
|
|
||||||
registry->GetRegistrarForPlugin("GeolocatorWindows"));
|
|
||||||
UrlLauncherWindowsRegisterWithRegistrar(
|
UrlLauncherWindowsRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
firebase_core
|
firebase_core
|
||||||
geolocator_windows
|
|
||||||
url_launcher_windows
|
url_launcher_windows
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user