integrated with previous

This commit is contained in:
Mohamed Nouffer
2023-06-09 15:55:59 +05:30
parent a358f65853
commit 2cd685b65e
23 changed files with 1950 additions and 397 deletions

View File

@ -0,0 +1,12 @@
import 'package:get/get.dart';
import 'package:rogapp/common/state/game/game_controller.dart';
import 'package:rogapp/screens/auth/controller/auth_controller.dart';
class GameBinding extends Bindings{
@override
void dependencies() {
Get.lazyPut<AuthController>(() => AuthController());
Get.put<GameController>(GameController());
}
}

View File

@ -0,0 +1,25 @@
import 'package:get/get.dart';
import 'package:rogapp/model/user.dart';
import 'package:rogapp/routes/app_pages.dart';
import 'package:rogapp/screens/auth/controller/auth_controller.dart';
class GameController extends GetxController{
AuthController authController = Get.find<AuthController>();
@override
void onInit() {
ever(authController.authList, changeInAuth);
super.onInit();
}
void changeInAuth(List<AuthResponse> change){
if(change.isNotEmpty){
Get.toNamed(AppPages.S_HOME);
}
else{
Get.toNamed(AppPages.S_LOGIN);
}
}
}

View File

@ -9,6 +9,7 @@ class UIs{
size:30, size:30,
color: Pallete.WHITE_COLOR, color: Pallete.WHITE_COLOR,
), ),
automaticallyImplyLeading:false,
centerTitle: true, centerTitle: true,
); );
} }

View File

@ -6,6 +6,7 @@ import 'package:flutter_map_tile_caching/flutter_map_tile_caching.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:rogapp/common/state/game/game_binding.dart';
import 'package:rogapp/pages/index/index_binding.dart'; import 'package:rogapp/pages/index/index_binding.dart';
import 'package:rogapp/routes/app_pages.dart'; import 'package:rogapp/routes/app_pages.dart';
import 'package:rogapp/theme/theme.dart'; import 'package:rogapp/theme/theme.dart';
@ -53,7 +54,7 @@ class MyApp extends StatelessWidget {
opaqueRoute: Get.isOpaqueRouteDefault, opaqueRoute: Get.isOpaqueRouteDefault,
popGesture: Get.isPopGestureEnable, popGesture: Get.isPopGestureEnable,
transitionDuration: const Duration(milliseconds: 230), transitionDuration: const Duration(milliseconds: 230),
//initialBinding: IndexBinding(), //HomeBinding(), initialBinding: GameBinding(),
initialRoute: AppPages.S_LOGIN, initialRoute: AppPages.S_LOGIN,
getPages: AppPages.routes, getPages: AppPages.routes,
enableLog: true, enableLog: true,

View File

@ -0,0 +1,591 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:unicode/unicode.dart';
class LocationResponse {
List<Feature>? features;
String? type;
LocationResponse({
this.features,
this.type,
});
LocationResponse copyWith({
List<Feature>? features,
String? type,
}) {
return LocationResponse(
features: features ?? this.features,
type: type ?? this.type,
);
}
Map<String, dynamic> toMap() {
return {
'features': features?.map((x) => x.toMap()).toList(),
'type': type,
};
}
factory LocationResponse.fromMap(Map<String, dynamic> map) {
return LocationResponse(
features: List<Feature>.from(map['features']?.map((x) => Feature.fromMap(x)) ?? const []),
type: map['type'],
);
}
String toJson() => json.encode(toMap());
factory LocationResponse.fromJson(String source) =>
LocationResponse.fromMap(json.decode(source));
@override
String toString() => 'LocationResponse(features: $features, type: $type)';
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is LocationResponse &&
listEquals(other.features, features) &&
other.type == type;
}
@override
int get hashCode => features.hashCode ^ type.hashCode;
}
class Feature {
Geometry? geometry;
int? id;
Properties? properties;
String? type;
int? location_id;
double? latitude;
double? longitude;
Feature({
this.geometry,
this.id,
this.properties,
this.type,
this.location_id,
this.latitude,
this.longitude
});
Map<String, dynamic> toMap() {
return <String, dynamic>{
'id': id,
'geometry': geometry?.toJson(),
'properties': properties?.toJson(),
'type': type,
// Use the first coordinate as latitude and longitude.
// You may need to adjust this based on your actual data structure.
'location_id': properties?.location_id,
'latitude': geometry?.coordinates?.first?.last,
'longitude': geometry?.coordinates?.first?.first,
};
}
// factory Feature.fromMap(Map<String, dynamic> map) {
// return Feature(
// geometry: Geometry.fromMap(map['geometry']),
// id: map['id'],
// properties: Properties.fromMap(map['properties']),
// type: map['type'],
// );
// }
factory Feature.fromMap(Map<String, dynamic> map) {
Geometry? geometry = map['geometry'] != null
? Geometry.fromMap(map['geometry'])
: null;
double? latitude = geometry?.coordinates?.isNotEmpty ?? false ? geometry!.coordinates![0][0] : null;
double? longitude = geometry?.coordinates?.isNotEmpty ?? false ? geometry!.coordinates![0][1] : null;
return Feature(
id: map['id'] as int?,
geometry: Geometry.fromMap(map['geometry']),
properties: Properties.fromMap(map['properties']),
type: map['type'],
location_id: Properties.fromMap(map['properties']).location_id,
latitude: latitude,
longitude: longitude,
);
}
String toJson() => json.encode(toMap());
factory Feature.fromJson(String source) =>
Feature.fromMap(json.decode(source));
@override
String toString() {
return 'Feature(geometry: $geometry, id: $id, properties: $properties, type: $type)';
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is Feature &&
other.geometry == geometry &&
other.id == id &&
other.properties == properties &&
other.type == type;
}
@override
int get hashCode {
return geometry.hashCode ^ id.hashCode ^ properties.hashCode ^ type.hashCode;
}
}
class Geometry {
List<List<double>>? coordinates;
String? type;
Geometry({
this.coordinates,
this.type,
});
Geometry copyWith({
List<List<double>>? coordinates,
String? type,
}) {
return Geometry(
coordinates: coordinates ?? this.coordinates,
type: type ?? this.type,
);
}
Map<String, dynamic> toMap() {
return {
'coordinates': coordinates,
'type': type,
};
}
factory Geometry.fromMap(Map<String, dynamic> map) {
return Geometry(
coordinates: map['coordinates'] != null
? List<List<double>>.from(
map['coordinates'].map((x) => List<double>.from(x.map((x) => x.toDouble()))))
: null,
type: map['type'],
);
}
String toJson() => json.encode(toMap());
factory Geometry.fromJson(String source) =>
Geometry.fromMap(json.decode(source) as Map<String, dynamic>);
@override
String toString() => 'Geometry(coordinates: $coordinates, type: $type)';
@override
bool operator ==(covariant Geometry other) {
if (identical(this, other)) return true;
return listEquals(other.coordinates, coordinates) && other.type == type;
}
@override
int get hashCode => coordinates.hashCode ^ type.hashCode;
}
class Properties {
final int location_id;
final String? sub_loc_id;
final double? cp;
final String? location_name;
final String? category;
final String? subcategory;
final String? zip;
final String? address;
final String? prefecture;
final String? area;
final String? city;
final double? latitude;
final double? longitude;
final String? photos;
final String? videos;
final String? webcontents;
final String? status;
final String? portal;
final String? group;
final String? phone;
final String? fax;
final String? email;
final String? facility;
final String? remark;
final String? tags;
final dynamic? event_name;
final bool? event_active;
final bool? hidden_location;
final bool? auto_checkin;
final double? checkin_radius;
final double? checkin_point;
final double? buy_point;
final String? evaluation_value;
final bool? shop_closed;
final bool? shop_shutdown;
final String? opening_hours_mon;
final String? opening_hours_tue;
final String? opening_hours_wed;
final String? opening_hours_thu;
final String? opening_hours_fri;
final String? opening_hours_sat;
final String? opening_hours_sun;
final String? parammeters;
Properties({
required this.location_id,
this.sub_loc_id,
this.cp,
this.location_name,
this.category,
this.subcategory,
this.zip,
this.address,
this.prefecture,
this.area,
this.city,
this.latitude,
this.longitude,
this.photos,
this.videos,
this.webcontents,
this.status,
this.portal,
this.group,
this.phone,
this.fax,
this.email,
this.facility,
this.remark,
this.tags,
this.event_name,
this.event_active,
this.hidden_location,
this.auto_checkin,
this.checkin_radius,
this.checkin_point,
this.buy_point,
this.evaluation_value,
this.shop_closed,
this.shop_shutdown,
this.opening_hours_mon,
this.opening_hours_tue,
this.opening_hours_wed,
this.opening_hours_thu,
this.opening_hours_fri,
this.opening_hours_sat,
this.opening_hours_sun,
this.parammeters,
});
String toJson() => json.encode(toMap());
Properties copyWith({
int? location_id,
String? sub_loc_id,
double? cp,
String? location_name,
String? category,
String? subcategory,
String? zip,
String? address,
String? prefecture,
String? area,
String? city,
double? latitude,
double? longitude,
String? photos,
String? videos,
String? webcontents,
String? status,
String? portal,
String? group,
String? phone,
String? fax,
String? email,
String? facility,
String? remark,
String? tags,
dynamic? event_name,
bool? event_active,
bool? hidden_location,
bool? auto_checkin,
double? checkin_radius,
double? checkin_point,
double? buy_point,
String? evaluation_value,
bool? shop_closed,
bool? shop_shutdown,
String? opening_hours_mon,
String? opening_hours_tue,
String? opening_hours_wed,
String? opening_hours_thu,
String? opening_hours_fri,
String? opening_hours_sat,
String? opening_hours_sun,
String? parammeters,
}) {
return Properties(
location_id: location_id ?? this.location_id,
sub_loc_id: sub_loc_id ?? this.sub_loc_id,
cp: cp ?? this.cp,
location_name: location_name ?? this.location_name,
category: category ?? this.category,
subcategory: subcategory ?? this.subcategory,
zip: zip ?? this.zip,
address: address ?? this.address,
prefecture: prefecture ?? this.prefecture,
area: area ?? this.area,
city: city ?? this.city,
latitude: latitude ?? this.latitude,
longitude: longitude ?? this.longitude,
photos: photos ?? this.photos,
videos: videos ?? this.videos,
webcontents: webcontents ?? this.webcontents,
status: status ?? this.status,
portal: portal ?? this.portal,
group: group ?? this.group,
phone: phone ?? this.phone,
fax: fax ?? this.fax,
email: email ?? this.email,
facility: facility ?? this.facility,
remark: remark ?? this.remark,
tags: tags ?? this.tags,
event_name: event_name ?? this.event_name,
event_active: event_active ?? this.event_active,
hidden_location: hidden_location ?? this.hidden_location,
auto_checkin: auto_checkin ?? this.auto_checkin,
checkin_radius: checkin_radius ?? this.checkin_radius,
checkin_point: checkin_point ?? this.checkin_point,
buy_point: buy_point ?? this.buy_point,
evaluation_value: evaluation_value ?? this.evaluation_value,
shop_closed: shop_closed ?? this.shop_closed,
shop_shutdown: shop_shutdown ?? this.shop_shutdown,
opening_hours_mon: opening_hours_mon ?? this.opening_hours_mon,
opening_hours_tue: opening_hours_tue ?? this.opening_hours_tue,
opening_hours_wed: opening_hours_wed ?? this.opening_hours_wed,
opening_hours_thu: opening_hours_thu ?? this.opening_hours_thu,
opening_hours_fri: opening_hours_fri ?? this.opening_hours_fri,
opening_hours_sat: opening_hours_sat ?? this.opening_hours_sat,
opening_hours_sun: opening_hours_sun ?? this.opening_hours_sun,
parammeters: parammeters ?? this.parammeters,
);
}
Map<String, dynamic> toMap() {
return <String, dynamic>{
'location_id': location_id,
'sub_loc_id': sub_loc_id,
'cp': cp,
'location_name': location_name,
'category': category,
'subcategory': subcategory,
'zip': zip,
'address': address,
'prefecture': prefecture,
'area': area,
'city': city,
'latitude': latitude,
'longitude': longitude,
'photos': photos,
'videos': videos,
'webcontents': webcontents,
'status': status,
'portal': portal,
'group': group,
'phone': phone,
'fax': fax,
'email': email,
'facility': facility,
'remark': remark,
'tags': tags,
'event_name': event_name,
'event_active': event_active,
'hidden_location': hidden_location,
'auto_checkin': auto_checkin,
'checkin_radius': checkin_radius,
'checkin_point': checkin_point,
'buy_point': buy_point,
'evaluation_value': evaluation_value,
'shop_closed': shop_closed,
'shop_shutdown': shop_shutdown,
'opening_hours_mon': opening_hours_mon,
'opening_hours_tue': opening_hours_tue,
'opening_hours_wed': opening_hours_wed,
'opening_hours_thu': opening_hours_thu,
'opening_hours_fri': opening_hours_fri,
'opening_hours_sat': opening_hours_sat,
'opening_hours_sun': opening_hours_sun,
'parammeters': parammeters,
};
}
factory Properties.fromMap(Map<String, dynamic> map) {
return Properties(
location_id: map['location_id'] as int,
sub_loc_id: map['sub_loc_id'] != null ? map['sub_loc_id'] as String : null,
cp: map['cp'] != null ? map['cp'] as double : null,
location_name: map['location_name'] != null ? map['location_name'] as String : null,
category: map['category'] != null ? map['category'] as String : null,
subcategory: map['subcategory'] != null ? map['subcategory'] as String : null,
zip: map['zip'] != null ? map['zip'] as String : null,
address: map['address'] != null ? map['address'] as String : null,
prefecture: map['prefecture'] != null ? map['prefecture'] as String : null,
area: map['area'] != null ? map['area'] as String : null,
city: map['city'] != null ? map['city'] as String : null,
latitude: map['latitude'] != null ? map['latitude'] as double : null,
longitude: map['longitude'] != null ? map['longitude'] as double : null,
photos: map['photos'] != null ? map['photos'] as String : null,
videos: map['videos'] != null ? map['videos'] as String : null,
webcontents: map['webcontents'] != null ? map['webcontents'] as String : null,
status: map['status'] != null ? map['status'] as String : null,
portal: map['portal'] != null ? map['portal'] as String : null,
group: map['group'] != null ? map['group'] as String : null,
phone: map['phone'] != null ? map['phone'] as String : null,
fax: map['fax'] != null ? map['fax'] as String : null,
email: map['email'] != null ? map['email'] as String : null,
facility: map['facility'] != null ? map['facility'] as String : null,
remark: map['remark'] != null ? map['remark'] as String : null,
tags: map['tags'] != null ? map['tags'] as String : null,
event_name: map['event_name'] != null ? map['event_name'] as dynamic : null,
event_active: map['event_active'] != null ? map['event_active'] as bool : null,
hidden_location: map['hidden_location'] != null ? map['hidden_location'] as bool : null,
auto_checkin: map['auto_checkin'] != null ? map['auto_checkin'] as bool : null,
checkin_radius: map['checkin_radius'] != null ? map['checkin_radius'] as double : null,
checkin_point: map['checkin_point'] != null ? map['checkin_point'] as double : null,
buy_point: map['buy_point'] != null ? map['buy_point'] as double : null,
evaluation_value: map['evaluation_value'] != null ? map['evaluation_value'] as String : null,
shop_closed: map['shop_closed'] != null ? map['shop_closed'] as bool : null,
shop_shutdown: map['shop_shutdown'] != null ? map['shop_shutdown'] as bool : null,
opening_hours_mon: map['opening_hours_mon'] != null ? map['opening_hours_mon'] as String : null,
opening_hours_tue: map['opening_hours_tue'] != null ? map['opening_hours_tue'] as String : null,
opening_hours_wed: map['opening_hours_wed'] != null ? map['opening_hours_wed'] as String : null,
opening_hours_thu: map['opening_hours_thu'] != null ? map['opening_hours_thu'] as String : null,
opening_hours_fri: map['opening_hours_fri'] != null ? map['opening_hours_fri'] as String : null,
opening_hours_sat: map['opening_hours_sat'] != null ? map['opening_hours_sat'] as String : null,
opening_hours_sun: map['opening_hours_sun'] != null ? map['opening_hours_sun'] as String : null,
parammeters: map['parammeters'] != null ? map['parammeters'] as String : null,
);
}
factory Properties.fromJson(String source) => Properties.fromMap(json.decode(source) as Map<String, dynamic>);
@override
String toString() {
return 'Properties(location_id: $location_id, sub_loc_id: $sub_loc_id, cp: $cp, location_name: $location_name, category: $category, subcategory: $subcategory, zip: $zip, address: $address, prefecture: $prefecture, area: $area, city: $city, latitude: $latitude, longitude: $longitude, photos: $photos, videos: $videos, webcontents: $webcontents, status: $status, portal: $portal, group: $group, phone: $phone, fax: $fax, email: $email, facility: $facility, remark: $remark, tags: $tags, event_name: $event_name, event_active: $event_active, hidden_location: $hidden_location, auto_checkin: $auto_checkin, checkin_radius: $checkin_radius, checkin_point: $checkin_point, buy_point: $buy_point, evaluation_value: $evaluation_value, shop_closed: $shop_closed, shop_shutdown: $shop_shutdown, opening_hours_mon: $opening_hours_mon, opening_hours_tue: $opening_hours_tue, opening_hours_wed: $opening_hours_wed, opening_hours_thu: $opening_hours_thu, opening_hours_fri: $opening_hours_fri, opening_hours_sat: $opening_hours_sat, opening_hours_sun: $opening_hours_sun, parammeters: $parammeters)';
}
@override
bool operator ==(covariant Properties other) {
if (identical(this, other)) return true;
return
other.location_id == location_id &&
other.sub_loc_id == sub_loc_id &&
other.cp == cp &&
other.location_name == location_name &&
other.category == category &&
other.subcategory == subcategory &&
other.zip == zip &&
other.address == address &&
other.prefecture == prefecture &&
other.area == area &&
other.city == city &&
other.latitude == latitude &&
other.longitude == longitude &&
other.photos == photos &&
other.videos == videos &&
other.webcontents == webcontents &&
other.status == status &&
other.portal == portal &&
other.group == group &&
other.phone == phone &&
other.fax == fax &&
other.email == email &&
other.facility == facility &&
other.remark == remark &&
other.tags == tags &&
other.event_name == event_name &&
other.event_active == event_active &&
other.hidden_location == hidden_location &&
other.auto_checkin == auto_checkin &&
other.checkin_radius == checkin_radius &&
other.checkin_point == checkin_point &&
other.buy_point == buy_point &&
other.evaluation_value == evaluation_value &&
other.shop_closed == shop_closed &&
other.shop_shutdown == shop_shutdown &&
other.opening_hours_mon == opening_hours_mon &&
other.opening_hours_tue == opening_hours_tue &&
other.opening_hours_wed == opening_hours_wed &&
other.opening_hours_thu == opening_hours_thu &&
other.opening_hours_fri == opening_hours_fri &&
other.opening_hours_sat == opening_hours_sat &&
other.opening_hours_sun == opening_hours_sun &&
other.parammeters == parammeters;
}
@override
int get hashCode {
return location_id.hashCode ^
sub_loc_id.hashCode ^
cp.hashCode ^
location_name.hashCode ^
category.hashCode ^
subcategory.hashCode ^
zip.hashCode ^
address.hashCode ^
prefecture.hashCode ^
area.hashCode ^
city.hashCode ^
latitude.hashCode ^
longitude.hashCode ^
photos.hashCode ^
videos.hashCode ^
webcontents.hashCode ^
status.hashCode ^
portal.hashCode ^
group.hashCode ^
phone.hashCode ^
fax.hashCode ^
email.hashCode ^
facility.hashCode ^
remark.hashCode ^
tags.hashCode ^
event_name.hashCode ^
event_active.hashCode ^
hidden_location.hashCode ^
auto_checkin.hashCode ^
checkin_radius.hashCode ^
checkin_point.hashCode ^
buy_point.hashCode ^
evaluation_value.hashCode ^
shop_closed.hashCode ^
shop_shutdown.hashCode ^
opening_hours_mon.hashCode ^
opening_hours_tue.hashCode ^
opening_hours_wed.hashCode ^
opening_hours_thu.hashCode ^
opening_hours_fri.hashCode ^
opening_hours_sat.hashCode ^
opening_hours_sun.hashCode ^
parammeters.hashCode;
}
}

45
lib/model/user.dart Normal file
View File

@ -0,0 +1,45 @@
class AuthResponse {
final User user;
final String token;
AuthResponse({required this.user, required this.token});
factory AuthResponse.fromJson(Map<String, dynamic> json) {
return AuthResponse(
user: User.fromJson(json['user']),
token: json['token'],
);
}
}
class User {
final int id;
final String email;
final bool isRogaining;
final String group;
final String zekkenNumber;
final String eventCode;
final String teamName;
User({
required this.id,
required this.email,
required this.isRogaining,
required this.group,
required this.zekkenNumber,
required this.eventCode,
required this.teamName,
});
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'],
email: json['email'],
isRogaining: json['is_rogaining'],
group: json['group'],
zekkenNumber: json['zekken_number'],
eventCode: json['event_code'],
teamName: json['team_name'],
);
}
}

View File

@ -4,12 +4,13 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:rogapp/model/destination.dart'; import 'package:rogapp/model/destination.dart';
import 'package:rogapp/model/location_response.dart';
import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/destination/destination_controller.dart';
import 'package:rogapp/pages/index/index_controller.dart'; import 'package:rogapp/pages/index/index_controller.dart';
import 'package:rogapp/services/external_service.dart'; import 'package:rogapp/services/external_service.dart';
class CameraPage extends StatelessWidget { class CameraPage extends StatelessWidget {
Destination? destination; Feature? destination;
CameraPage({Key? key, this.destination}) : super(key: key); CameraPage({Key? key, this.destination}) : super(key: key);
DestinationController destinationController = Get.find<DestinationController>(); DestinationController destinationController = Get.find<DestinationController>();
IndexController indexController = Get.find<IndexController>(); IndexController indexController = Get.find<IndexController>();
@ -135,7 +136,7 @@ class CameraPage extends StatelessWidget {
appBar: appBar:
destinationController.is_in_rog.value && destinationController.rogaining_counted.value == true ? destinationController.is_in_rog.value && destinationController.rogaining_counted.value == true ?
AppBar( AppBar(
title: destination!.cp == -1 ? title: destination!.properties!.cp == -1 ?
Text("finishing_rogaining".tr) Text("finishing_rogaining".tr)
: :
Text("cp_pls_take_photo".tr) Text("cp_pls_take_photo".tr)

View File

@ -221,14 +221,14 @@ class DestinationController extends GetxController {
chekcs = 3; chekcs = 3;
is_in_checkin.value = true; is_in_checkin.value = true;
photos.clear(); photos.clear();
showModalBottomSheet(context: Get.context!, isScrollControlled: true, // showModalBottomSheet(context: Get.context!, isScrollControlled: true,
builder:((context) => CameraPage(destination: d,)) // builder:((context) => CameraPage(destination: d,))
).whenComplete((){ // ).whenComplete((){
skip_gps = false; // skip_gps = false;
rogaining_counted.value =true; // rogaining_counted.value =true;
chekcs = 0; // chekcs = 0;
is_in_checkin.value = false; // is_in_checkin.value = false;
}); // });
} }
else if(is_in_rog.value == true && d.cp != -1){ else if(is_in_rog.value == true && d.cp != -1){
chekcs = 4; chekcs = 4;
@ -267,13 +267,13 @@ class DestinationController extends GetxController {
chekcs = 5; chekcs = 5;
is_at_goal.value = true; is_at_goal.value = true;
photos.clear(); photos.clear();
showModalBottomSheet(context: Get.context!, isScrollControlled: true, // showModalBottomSheet(context: Get.context!, isScrollControlled: true,
builder:((context) => CameraPage(destination: d,)) // builder:((context) => CameraPage(destination: d,))
).whenComplete((){ // ).whenComplete((){
skip_gps = false; // skip_gps = false;
chekcs = 0; // chekcs = 0;
is_at_goal.value = false; // is_at_goal.value = false;
}); // });
} }
else if(is_in_rog.value == false && indexController.rog_mode == 1 && DateTime.now().difference(last_goal_at).inHours >= 24){ else if(is_in_rog.value == false && indexController.rog_mode == 1 && DateTime.now().difference(last_goal_at).inHours >= 24){
//start //start

View File

@ -91,7 +91,7 @@ class DestinationMapPage extends StatelessWidget {
), ),
), ),
), ),
Container( color: Colors.yellow, child: Text(TextUtils.getDisplayText(d), style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, overflow: TextOverflow.visible),)), //Container( color: Colors.yellow, child: Text(TextUtils.getDisplayText(d), style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, overflow: TextOverflow.visible),)),
], ],
), ),
); );

View File

@ -6,7 +6,6 @@ import 'package:rogapp/pages/changepassword/change_password_page.dart';
import 'package:rogapp/pages/city/city_page.dart'; import 'package:rogapp/pages/city/city_page.dart';
import 'package:rogapp/pages/destination/destination_binding.dart'; import 'package:rogapp/pages/destination/destination_binding.dart';
import 'package:rogapp/pages/destination/destination_page.dart'; import 'package:rogapp/pages/destination/destination_page.dart';
import 'package:rogapp/pages/home/home_binding.dart';
import 'package:rogapp/pages/home/home_page.dart'; import 'package:rogapp/pages/home/home_page.dart';
import 'package:rogapp/pages/index/index_page.dart'; import 'package:rogapp/pages/index/index_page.dart';
@ -26,6 +25,8 @@ import 'package:rogapp/screens/home/home_screen.dart';
import 'package:rogapp/spa/spa_binding.dart'; import 'package:rogapp/spa/spa_binding.dart';
import 'package:rogapp/spa/spa_page.dart'; import 'package:rogapp/spa/spa_page.dart';
import '../screens/home/home_binding.dart';
part 'app_routes.dart'; part 'app_routes.dart';
@ -70,7 +71,7 @@ class AppPages {
GetPage( GetPage(
name: Routes.S_HOME, name: Routes.S_HOME,
page: () => HomeScreen(), page: () => HomeScreen(),
//binding: IndexBinding(), binding: HomeBinding()
), ),
GetPage( GetPage(
name: Routes.S_LOGIN, name: Routes.S_LOGIN,

View File

@ -0,0 +1,45 @@
import 'dart:convert' as convert;
import 'package:get/get.dart';
import 'package:rogapp/model/user.dart';
import 'package:rogapp/utils/const.dart';
import 'package:http/http.dart' as http;
class AuthController extends GetxController{
var isLoading = false.obs;
var authList = List<AuthResponse>.empty(growable: true).obs;
void signinUser(String email, String password) async {
try{
isLoading(true);
String serverUrl = ConstValues.currentServer();
String url = '$serverUrl/api/login/';
final http.Response response = await http.post(
Uri.parse(url),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: convert.jsonEncode(<String, String>{
'email': email,
'password': password
}),
);
if (response.statusCode == 200) {
print(response.body);
AuthResponse authResponse = AuthResponse.fromJson(convert.jsonDecode(convert.utf8.decode(response.body.codeUnits)));
print(authResponse.user.eventCode.toString());
authList.assign(authResponse);
}
else{
throw("Unable to Login, please check your creadentials");
}
}
catch(e){
Get.snackbar("Error", e.toString(), snackPosition: SnackPosition.BOTTOM);
}
finally{
isLoading(false);
}
}
}

View File

@ -5,6 +5,7 @@ import 'package:rogapp/common/ui/widgets/uis.dart';
import 'package:rogapp/routes/app_pages.dart'; import 'package:rogapp/routes/app_pages.dart';
import 'package:rogapp/screens/auth/common/uis/auth_text_field.dart'; import 'package:rogapp/screens/auth/common/uis/auth_text_field.dart';
import 'package:rogapp/screens/auth/common/uis/rounded_small_button.dart'; import 'package:rogapp/screens/auth/common/uis/rounded_small_button.dart';
import 'package:rogapp/screens/auth/controller/auth_controller.dart';
import 'package:rogapp/theme/theme.dart'; import 'package:rogapp/theme/theme.dart';
class LoginScreen extends StatelessWidget { class LoginScreen extends StatelessWidget {
@ -12,15 +13,17 @@ class LoginScreen extends StatelessWidget {
final passwordController = TextEditingController(); final passwordController = TextEditingController();
LoginScreen({super.key}); LoginScreen({super.key});
void login(){ final AuthController authController = Get.find<AuthController>();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: UIs.appBar(), appBar: UIs.appBar(),
body: Center( body: Obx((){
if(authController.isLoading.value) {
return const Center(child: CircularProgressIndicator(),);
} else {
return Center(
child: SingleChildScrollView( child: SingleChildScrollView(
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
@ -39,7 +42,10 @@ class LoginScreen extends StatelessWidget {
const SizedBox(height: 40,), const SizedBox(height: 40,),
Align( Align(
alignment: Alignment.topRight, alignment: Alignment.topRight,
child: RoundedSmallButton(onTap: login, label: 'Done',), child: RoundedSmallButton(onTap: (){
authController.signinUser(emailController.text, passwordController.text);
},
label: 'Done',),
), ),
const SizedBox(height: 40,), const SizedBox(height: 40,),
RichText( RichText(
@ -61,7 +67,9 @@ class LoginScreen extends StatelessWidget {
), ),
), ),
), ),
) );
}
}),
); );
} }
} }

View File

@ -0,0 +1,12 @@
import 'package:get/get.dart';
import 'package:rogapp/screens/home/home_controller.dart';
import 'package:rogapp/screens/home/location_controller.dart';
class HomeBinding extends Bindings{
@override
void dependencies() {
Get.put(HomeController());
Get.put(LocationController());
}
}

View File

@ -0,0 +1,124 @@
import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:get/get.dart';
import 'package:latlong2/latlong.dart';
import 'package:rogapp/model/location_response.dart';
import 'package:rogapp/screens/auth/controller/auth_controller.dart';
import 'package:rogapp/screens/home/location_controller.dart';
import 'package:rogapp/utils/const.dart';
import 'package:http/http.dart' as http;
import 'dart:convert' as convert;
import 'package:rogapp/utils/db_helper.dart';
class HomeController extends GetxController{
var isLoading = false.obs;
List<LatLngBounds> currentBound = <LatLngBounds>[].obs;
List<Feature> currentFeaturesforBound = <Feature>[].obs;
List<Feature> currentFeature = <Feature>[].obs;
MapController mapController = MapController();
late StreamSubscription<ConnectivityResult> _connectivitySubscription;
ConnectivityResult connectionStatus = ConnectivityResult.none;
var connectionStatusName = "".obs;
final Connectivity _connectivity = Connectivity();
AuthController authController = Get.find<AuthController>();
DatabaseHelper dbaseHelper = DatabaseHelper.instance;
@override
void onInit() {
super.onInit();
_connectivitySubscription = _connectivity.onConnectivityChanged.listen(_updateConnectionStatus);
dbaseHelper.deleteAll().then((value){
fetchBoundForuser(authController.authList[0].token);
loadLocationsForBound().then((_){
fetchLocalLocationForBound(mapController.bounds!);
});
});
}
Future<void> _updateConnectionStatus(ConnectivityResult result) async {
connectionStatus = result;
connectionStatusName.value = result.name;
}
void fetchLocalLocationForBound(LatLngBounds bound) async {
final locations = await dbaseHelper.getFeaturesWithinBounds(bound);
currentFeaturesforBound.assignAll(locations);
print("loading locations ${currentFeaturesforBound.length} ------");
}
Future<void> loadLocationsForBound() async {
LatLngBounds bounds = mapController.bounds!;
String serverUrl = ConstValues.currentServer();
try{
isLoading(true);
if(bounds.southWest != null && bounds.northEast != null){
bool _rog = authController.authList[0].user.isRogaining;
String r = _rog == true ? 'True': 'False';
var grp = authController.authList[0].user.eventCode;
final url = '$serverUrl/api/inbound?rog=${r}&grp=$grp&ln1=${bounds.southWest!.longitude}&la1=${bounds.southWest!.latitude}&ln2=${bounds.northWest.longitude}&la2=${bounds.northWest.latitude}&ln3=${bounds.northEast!.longitude}&la3=${bounds.northEast!.latitude}&ln4=${bounds.southEast.longitude}&la4=${bounds.southEast.latitude}';
final response = await http.get(Uri.parse(url),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
);
if (response.statusCode == 200) {
// Parse JSON response
LocationResponse locationResponse = LocationResponse.fromMap(convert.jsonDecode(convert.utf8.decode(response.body.codeUnits)));
// For each feature in the location response
for (var feature in locationResponse.features!) {
await dbaseHelper.insertFeature(feature.toMap());
}
}
else{
throw("Unable to load locations, please try again ...");
}
}
}
catch(e, st){
Get.snackbar("Error", e.toString(), snackPosition: SnackPosition.BOTTOM);
}
finally{
isLoading(false);
}
}
void fetchBoundForuser(String usertoken) async {
try{
isLoading(true);
String serverUrl = ConstValues.currentServer();
String url = '$serverUrl/api/locsext/';
final http.Response response = await http.post(
Uri.parse(url),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Token $usertoken'
},
body: convert.jsonEncode(<String, String>{
'token': usertoken,
}),
);
if (response.statusCode == 200) {
final ext = convert.json.decode(convert.utf8.decode(response.body.codeUnits));
LatLngBounds bnds = LatLngBounds(LatLng(ext[1], ext[0]), LatLng(ext[3], ext[2]));
currentBound.assign(bnds);
mapController.fitBounds(bnds);
}
else{
throw("Unable to query current bound, please try again ...");
}
}
catch(e){
Get.snackbar("Error", e.toString(), snackPosition: SnackPosition.BOTTOM);
}
finally{
isLoading(false);
}
}
}

View File

@ -1,10 +1,183 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_map_location_marker/flutter_map_location_marker.dart';
import 'package:get/get.dart';
import 'package:latlong2/latlong.dart';
import 'package:rogapp/common/ui/widgets/uis.dart';
import 'package:rogapp/model/location_response.dart';
import 'package:rogapp/screens/home/home_controller.dart';
import 'package:rogapp/screens/home/location_controller.dart';
import 'package:rogapp/theme/theme.dart';
import 'package:rogapp/utils/db_helper.dart';
import 'package:rogapp/utils/text_util.dart';
import 'package:rogapp/widgets/base_layer_widget.dart';
import 'package:rogapp/widgets/bottom_sheet_new.dart';
import 'package:sqflite/sqflite.dart';
class HomeScreen extends StatelessWidget { class HomeScreen extends StatelessWidget {
const HomeScreen({super.key}); HomeScreen({super.key});
StreamSubscription? subscription;
final HomeController homeController = Get.find<HomeController>();
final LocationController locationController = Get.find<LocationController>();
final double zoomThreshold = 0.08;
final double boundsThreshold = 0.0005;
LatLngBounds? lastBounds;
double? lastZoom;
Widget getMarkerShape(Feature i, BuildContext context){
//print("lat is ${p.geoSerie!.geoPoints[0].latitude} and lon is ${p.geoSerie!.geoPoints[0].longitude}");
RegExp regex = RegExp(r'([.]*0)(?!.*\d)');
return Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
InkWell(
onTap: () {
homeController.currentFeature.assign(i);
if(homeController.currentFeature != null) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
isDismissible: true,
builder:((context) => BottomSheetNew())
//builder:((context) => BottomSheetWidget())
).whenComplete((){
locationController.skip_gps = false;
});
}
},
child: Container(
height: 32,
width: 32,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.transparent,
border: Border.all(
color: i.properties!.buy_point! > 0 ? Colors.blue : Colors.red,
width: 3,
style: BorderStyle.solid
)
),
child: Stack(
alignment: Alignment.center,
children: [
Icon(Icons.circle,size: 6.0,),
i.properties!.cp == -1 ?
Transform.rotate(
alignment: Alignment.centerLeft,
origin: Offset.fromDirection(1, 26),
angle: 270 * pi / 180,
child: Icon(Icons.play_arrow_outlined, color: Colors.red, size: 70,)):
Container(color: Colors.transparent,),
],
)
),
),
Container(color: Colors.white, child: Text(TextUtils.getDisplayTextForFeature(i), style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color:Colors.red,))),
],
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Placeholder(); return Scaffold(
appBar: AppBar(
actions: [
TextButton(onPressed: () async {
DatabaseHelper dbaseHelper = DatabaseHelper.instance;
final res = await dbaseHelper.getFeatureByLatLon(35.807369, 137.240684);
print(res[0].toString());
},
child: const Text("Click", style: TextStyle(color: Colors.white),))
],
),
body: Obx(() =>
FlutterMap(
mapController: homeController.mapController,
options: MapOptions(
onMapReady: (){
homeController.mapController!.mapEventStream.listen((MapEvent mapEvent) {
if (mapEvent is MapEventMoveStart) {
}
if (mapEvent is MapEventMoveEnd) {
LatLngBounds bounds = homeController.mapController!.bounds!;
homeController.currentBound.assign(bounds);
final _cz = homeController.mapController.zoom;
}
});
} ,
onPositionChanged: (position, hasGesture){
if (hasGesture) {
LatLngBounds currentBounds = position.bounds!;
if (lastBounds != null && lastZoom != null) {
// Compute difference between last bounds and current bounds
double boundsDifference = lastBounds!.north - currentBounds.north +
lastBounds!.south - currentBounds.south +
lastBounds!.east - currentBounds.east +
lastBounds!.west - currentBounds.west;
// Compute difference between last zoom and current zoom
double zoomDifference = lastZoom! - position.zoom!;
if (boundsDifference.abs() > boundsThreshold || zoomDifference.abs() > zoomThreshold) {
LatLngBounds bounds = homeController.mapController!.bounds!;
homeController.currentBound.assign(bounds);
print('----threshold reached ---');
homeController.fetchLocalLocationForBound(bounds);
//loadData(position.bounds); // Load new data when either threshold is exceeded
}
} else {
LatLngBounds bounds = homeController.mapController!.bounds!;
homeController.currentBound.assign(bounds);
homeController.fetchLocalLocationForBound(bounds);
//loadData(position.bounds); // Load new data if this is the first time
}
lastBounds = currentBounds; // Update the last bounds
lastZoom = position.zoom; // Update the last zoom
}
},
bounds: homeController.currentBound.isNotEmpty ? homeController.currentBound[0]: LatLngBounds.fromPoints([LatLng(35.03999881162295, 136.40587119778962), LatLng(36.642756778706904, 137.95226720406063)]),
zoom: 14,
maxZoom:18.4,
interactiveFlags: InteractiveFlag.pinchZoom | InteractiveFlag.drag,
),
children: [
const BaseLayer(),
CurrentLocationLayer(),
homeController.currentFeaturesforBound.isNotEmpty ?
MarkerLayer(
markers:homeController.currentFeaturesforBound.map((i) {
RegExp regex = RegExp(r'([.]*0)(?!.*\d)');
return Marker(
anchorPos: AnchorPos.exactly(Anchor(108.0, 18.0)),
height: 32.0,
width: 120.0,
point: LatLng(i.latitude!, i.longitude!),
builder: (ctx){
return getMarkerShape(i, context);
},
);
}).toList(),
)
:
Center(child: CircularProgressIndicator()),
],
)
),
);
} }
} }

View File

@ -0,0 +1,318 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:get/get.dart';
import 'package:latlong2/latlong.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
import 'package:rogapp/model/location_response.dart';
import 'package:rogapp/pages/camera/camera_page.dart';
import 'package:rogapp/screens/auth/controller/auth_controller.dart';
import 'package:rogapp/screens/home/home_controller.dart';
import 'package:rogapp/utils/checkin_db_helper.dart';
import 'package:rogapp/widgets/bottom_sheet_new.dart';
class LocationController extends GetxController{
HomeController homeController = Get.find<HomeController>();
AuthController authController = Get.find<AuthController>();
CheckinDBHelper checkinDBHelper = CheckinDBHelper.instance;
late LocationSettings locationSettings;
List<String> locationPermission = <String>[" -- starting -- "].obs;
double current_lat = 0.0;
double current_lon = 0.0;
var is_gps_selected = true.obs;
var is_checkingIn = false.obs;
var moveMapwithGPS = false.obs;
bool skip_gps = false;
var is_photo_shoot = false.obs;
final photos = <File>[].obs;
Timer? _timer;
int _start = 0;
int chekcs = 0;
var rogaining_counted = false.obs;
var is_in_checkin = false.obs;
var is_in_rog = false.obs;
var is_at_start = false.obs;
var is_at_goal = false.obs;
DateTime last_goal_at = DateTime.now().subtract(Duration(days:1));
bool skip_10s = false;
bool checking_in = false;
BuildContext? context;
@override
void onInit() {
initGPS();
super.onInit();
}
void checkPermission() async {
LocationPermission permission = await Geolocator.checkPermission();
if (permission != LocationPermission.whileInUse ||
permission != LocationPermission.always) {
locationPermission.clear();
locationPermission.add(permission.name);
permission = await Geolocator.requestPermission();
}
}
void initGPS(){
checkPermission();
//print("------ in iniit");
if (defaultTargetPlatform == TargetPlatform.android) {
locationSettings = AndroidSettings(
accuracy: LocationAccuracy.bestForNavigation,
distanceFilter: 0,
forceLocationManager: true,
intervalDuration: const Duration(seconds: 1),
foregroundNotificationConfig: const ForegroundNotificationConfig(
notificationText:
"Thi app will continue to receive your location even when you aren't using it",
notificationTitle: "Running in Background",
enableWakeLock: true,
)
);
} else if (defaultTargetPlatform == TargetPlatform.iOS || defaultTargetPlatform == TargetPlatform.macOS) {
locationSettings = AppleSettings(
accuracy: LocationAccuracy.bestForNavigation,
activityType: ActivityType.fitness,
distanceFilter: 0,
pauseLocationUpdatesAutomatically: false,
// Only set to true if our app will be started up in the background.
showBackgroundLocationIndicator: true
);
} else {
locationSettings = const LocationSettings(
accuracy: LocationAccuracy.high,
distanceFilter: 0,
);
}
try {
StreamSubscription<Position> positionStream = Geolocator.getPositionStream(locationSettings: locationSettings).listen(
(Position? position) {
current_lat = position != null ? position.latitude : 0;
current_lon = position != null ? position.longitude : 0;
print('current GPS point is - $current_lat, $current_lon');
if(is_gps_selected.value){
double czoom = homeController.mapController.zoom;
if(moveMapwithGPS.value){
homeController.mapController.move(LatLng(position!.latitude, position!.longitude), czoom);
}
//gps.clear();
//gps.add("-- lat : ${position.latitude}, lon : ${position.longitude} --");
if(is_checkingIn.value ==false || skip_gps == false){
print("--- calling checkFoCheckin ---");
checkFoCheckin();
}
//checkForCheckin(position!.latitude, position.longitude);
}
//print(position == null ? 'Unknown' : 'current position is ${position.latitude.toString()}, ${position.longitude.toString()}');
});
} catch (err){
locationPermission.clear();
locationPermission.add(err.toString());
}
//ever(indexController.connectionStatusName, connectionChanged);
}
void checkFoCheckin(){
for(final f in homeController.currentFeaturesforBound){
if(skip_gps) return;
var distance = Distance();
var dist = distance.as(LengthUnit.Meter, LatLng(f.latitude!, f.longitude!), LatLng(current_lat, current_lon));
if(dist <= 250 && is_checkingIn.value == false){
startTimer(f, dist);
}
}
}
void startTimer(Feature d, double distance) async {
skip_gps = true;
print("---- in startTimer ----");
double checkin_radious = d.properties!.checkin_radius ?? double.infinity;
bool auto_checkin = d.properties!.auto_checkin == 0 ? false : true;
bool location_already_checked_in = await checkinDBHelper.exists(d.location_id!);
bool isUser_logged_in = authController.authList.length > 0 ? true : false;
//make current destination
print("---- locationid : ${d.location_id} checkin radius ---- ${checkin_radious} --- distance : ${distance} ----");
print("---- distance ${distance} ----");
if(checkin_radious >= distance){
//currentSelectedDestinations.add(d);
homeController.currentFeature.assign(d);
}
else {
skip_gps = false;
return;
}
if(is_photo_shoot.value == true){
photos.clear();
showModalBottomSheet(context: Get.context!, isScrollControlled: true,
builder:((context) => CameraPage())
).whenComplete((){
skip_gps = false;
chekcs = 0;
is_in_checkin.value = false;
});
return;
}
List<Feature> ds = homeController.currentFeature;
if(ds.isNotEmpty){
if(d.properties!.cp == -1 && DateTime.now().difference(last_goal_at).inHours >= 24){
chekcs = 1;
//start
print("---- in start -----");
chekcs = 1;
is_in_checkin.value = true;
is_at_start.value = true;
showModalBottomSheet(context: Get.context!, isScrollControlled: true,
builder:((context) => BottomSheetNew())
).whenComplete((){
skip_gps = false;
chekcs = 0;
is_at_start.value = false;
is_in_checkin.value = false;
});
}
else if(is_in_rog.value == true)
{
print("----- in location popup checkin cp - ${d.properties!.cp}----");
chekcs = 2;
is_in_checkin.value = true;
showModalBottomSheet(context: Get.context!, isScrollControlled: true,
builder:((context) => BottomSheetNew())
).whenComplete((){
skip_gps = false;
chekcs =0;
is_in_checkin.value = false;
});
}
}
print("---- location checkin radious ${d.properties!.checkin_radius} ----");
print("---- already checked in ${location_already_checked_in} ----");
if(checkin_radious >= distance && location_already_checked_in == false){
if(auto_checkin){
if(!checking_in){
makeCheckin(d, true,"");
if(d.properties!.cp != -1){
rogaining_counted.value =true;
}
skip_gps = false;
}
}
else{
print("--- hidden loc ${d.properties!.hidden_location} ----");
// ask for checkin
if(d.properties!.hidden_location != null && d.properties!.hidden_location == 0 && d.properties!.cp != -1){
chekcs = 3;
is_in_checkin.value = true;
photos.clear();
showModalBottomSheet(context: Get.context!, isScrollControlled: true,
builder:((context) => CameraPage(destination: d,))
).whenComplete((){
skip_gps = false;
rogaining_counted.value =true;
chekcs = 0;
is_in_checkin.value = false;
});
}
else if(is_in_rog.value == true && d.properties!.cp != -1){
chekcs = 4;
is_in_checkin.value = true;
showMaterialModalBottomSheet(
expand: true,
context: Get.context!,
backgroundColor: Colors.transparent,
builder: (context) => BottomSheetNew()
).whenComplete(() {
skip_gps = false;
chekcs = 0;
is_in_checkin.value = false;
});
// showModalBottomSheet(context: Get.context!, isScrollControlled: true,
// builder:((context) => BottomSheetNew())
// ).whenComplete((){
// skip_gps = false;
// chekcs = 0;
// is_in_checkin.value = false;
// });
}
}
}
if(isUser_logged_in && d.properties!.cp == -1 && location_already_checked_in && skip_10s == false){
//check for rogaining
if(is_at_goal.value == false && rogaining_counted.value){
//goal
print("---- in goal -----");
chekcs = 5;
is_at_goal.value = true;
photos.clear();
showModalBottomSheet(context: Get.context!, isScrollControlled: true,
builder:((context) => CameraPage(destination: d,))
).whenComplete((){
skip_gps = false;
chekcs = 0;
is_at_goal.value = false;
});
}
else if(is_in_rog.value == false && DateTime.now().difference(last_goal_at).inHours >= 24){
//start
print("---- in start -----");
chekcs = 6;
is_at_start.value = true;
showModalBottomSheet(context: Get.context!, isScrollControlled: true,
builder:((context) => BottomSheetNew())
).whenComplete((){
print("----- finished start -------");
skip_gps = false;
chekcs = 0;
is_at_start.value = false;
});
}
}
print("==== _chekcs ${chekcs} ====");
if(chekcs == 0){
skip_gps = false;
}
}
void makeCheckin(Feature destination, bool action, String imageurl) async {
}
void addToRogaining(double lat, double lon, int destination_id) async {
}
void destinationMatrixFromCurrentPoint(List<Feature> ls){
}
}

View File

@ -6,6 +6,8 @@ import 'package:rogapp/model/destination.dart';
import 'package:rogapp/model/rog.dart'; import 'package:rogapp/model/rog.dart';
import 'package:rogapp/pages/destination/destination_controller.dart'; import 'package:rogapp/pages/destination/destination_controller.dart';
import 'package:rogapp/pages/index/index_controller.dart'; import 'package:rogapp/pages/index/index_controller.dart';
import 'package:rogapp/screens/auth/controller/auth_controller.dart';
import 'package:rogapp/screens/home/home_controller.dart';
import 'package:rogapp/utils/database_helper.dart'; import 'package:rogapp/utils/database_helper.dart';
import 'package:sqflite/sqlite_api.dart'; import 'package:sqflite/sqlite_api.dart';
import 'dart:convert'; import 'dart:convert';
@ -31,17 +33,19 @@ class ExternalService {
Future<Map<String, dynamic>> StartRogaining() async { Future<Map<String, dynamic>> StartRogaining() async {
final IndexController indexController = Get.find<IndexController>(); //final IndexController indexController = Get.find<IndexController>();
final homeController = Get.find<HomeController>();
final authController = Get.find<AuthController>();
Map<String, dynamic> _res = {}; Map<String, dynamic> _res = {};
int user_id = indexController.currentUser[0]["user"]["id"]; int user_id = authController.authList[0].user.id;
//print("--- Pressed -----"); //print("--- Pressed -----");
String _team = indexController.currentUser[0]["user"]['team_name']; String _team = authController.authList[0].user.teamName;
//print("--- _team : ${_team}-----"); //print("--- _team : ${_team}-----");
String _event_code = indexController.currentUser[0]["user"]["event_code"]; String _event_code = authController.authList[0].user.eventCode;
if(indexController.connectionStatusName != "wifi" && indexController.connectionStatusName != "mobile"){ if(homeController.connectionStatusName != "wifi" && homeController.connectionStatusName != "mobile"){
DatabaseHelper db = DatabaseHelper.instance; DatabaseHelper db = DatabaseHelper.instance;
Rog _rog = Rog( Rog _rog = Rog(
id:1, id:1,

View File

@ -0,0 +1,82 @@
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class CheckinDBHelper {
static final _databaseName = "EventDatabase.db";
static final _databaseVersion = 1;
static final table = 'event_table';
static final columnLocationId = 'location_id';
static final columnOrderId = 'order_id';
static final columnCheckinTime = 'checkin_time';
static final columnEventName = 'event_name';
// make this a singleton class
CheckinDBHelper._privateConstructor();
static final CheckinDBHelper instance = CheckinDBHelper._privateConstructor();
// only have a single app-wide reference to the database
static Database? _database;
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDatabase();
return _database!;
}
// this opens the database (and creates it if it doesn't exist)
_initDatabase() async {
String path = join(await getDatabasesPath(), _databaseName);
return await openDatabase(path,
version: _databaseVersion,
onCreate: _onCreate);
}
// SQL code to create the database table
Future _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE $table (
$columnLocationId INTEGER PRIMARY KEY,
$columnOrderId INTEGER NOT NULL,
$columnCheckinTime TEXT NOT NULL,
$columnEventName TEXT NOT NULL
)
''');
}
// Helper methods
Future<int> insert(Map<String, dynamic> row) async {
Database db = await instance.database;
return await db.insert(table, row);
}
Future<bool> exists(int locationId) async {
Database db = await instance.database;
List<Map<String, dynamic>> rows = await db.query(
table,
where: '$columnLocationId = ?',
whereArgs: [locationId],
);
return rows.isNotEmpty;
}
Future<List<Map<String, dynamic>>> queryAllRows() async {
Database db = await instance.database;
return await db.query(table);
}
Future<List<Map<String, dynamic>>> queryRowsByLocation(int locationId) async {
Database db = await instance.database;
return await db.query(table,
where: '$columnLocationId = ?',
whereArgs: [locationId],
);
}
Future<int> update(Map<String, dynamic> row) async {
Database db = await instance.database;
int id = row[columnLocationId];
return await db.update(table, row, where: '$columnLocationId = ?', whereArgs: [id]);
}
}

170
lib/utils/db_helper.dart Normal file
View File

@ -0,0 +1,170 @@
import 'package:flutter_map/flutter_map.dart';
import 'package:rogapp/model/location_response.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'dart:convert'; // for jsonEncode
class DatabaseHelper {
static const _databaseName = "FeatureDatabase.db";
static const _databaseVersion = 1;
// Singleton class
DatabaseHelper._();
static final DatabaseHelper instance = DatabaseHelper._();
Database? _database;
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDatabase();
return _database!;
}
Future<Database> _initDatabase() async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, _databaseName);
return await openDatabase(
path,
version: _databaseVersion,
onCreate: _onCreate,
);
}
Future<void> _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE features (
id INTEGER PRIMARY KEY,
geometry TEXT NOT NULL,
properties TEXT NOT NULL,
type TEXT NOT NULL,
location_id,
latitude REAL NOT NULL,
longitude REAL NOT NULL
)
''');
}
// Database insert operation
Future<void> insertFeature(Map<String, dynamic> feature) async {
// Get a reference to the database.
final db = await database;
// Insert the feature into the correct table.
await db.insert(
'features',
feature,
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
// Database get operation
Future<List<Feature>> getFeatures() async {
Database db = await database;
final List<Map<String, dynamic>> maps = await db.query('features');
return List.generate(maps.length, (i) {
return Feature(
id: maps[i]['id'],
geometry: Geometry.fromMap(jsonDecode(maps[i]['geometry'])),
properties: Properties.fromMap(jsonDecode(maps[i]['properties'])),
type: maps[i]['type'],
location_id: Properties.fromMap(jsonDecode(maps[i]['properties'])).location_id,
latitude: Geometry.fromMap(jsonDecode(maps[i]['geometry'])).coordinates![0][1],
longitude: Geometry.fromMap(jsonDecode(maps[i]['geometry'])).coordinates![0][0]
);
});
}
// Database delete operation
Future<void> deleteFeature(int id) async {
Database db = await database;
await db.delete(
'features',
where: "id = ?",
whereArgs: [id],
);
}
Future<void> deleteAll() async {
// Get a reference to the database.
final db = await database;
// Delete all rows.
await db.rawDelete('DELETE FROM features');
}
// Database search by location_id
Future<List<Feature>> getFeatureByLocationId(int locationId) async {
Database db = await database;
final List<Map<String, dynamic>> maps = await db.query(
'features',
where: "location_id = ?",
whereArgs: [locationId],
);
return List.generate(maps.length, (i) {
return Feature(
id: maps[i]['id'],
geometry: Geometry.fromMap(jsonDecode(maps[i]['geometry'])),
properties: Properties.fromMap(jsonDecode(maps[i]['properties'])),
type: maps[i]['type'],
location_id: Properties.fromMap(jsonDecode(maps[i]['properties'])).location_id,
latitude: Geometry.fromMap(jsonDecode(maps[i]['geometry'])).coordinates![0][1],
longitude: Geometry.fromMap(jsonDecode(maps[i]['geometry'])).coordinates![0][0]
);
});
}
// Database search by latitude and longitude
Future<List<Feature>> getFeatureByLatLon(double latitude, double longitude) async {
Database db = await database;
final List<Map<String, dynamic>> maps = await db.query(
'features',
where: "latitude = ? AND longitude = ?",
whereArgs: [latitude, longitude],
);
return List.generate(maps.length, (i) {
return Feature(
id: maps[i]['id'],
geometry: Geometry.fromMap(jsonDecode(maps[i]['geometry'])),
properties: Properties.fromMap(jsonDecode(maps[i]['properties'])),
type: maps[i]['type'],
location_id: Properties.fromMap(jsonDecode(maps[i]['properties'])).location_id,
latitude: Geometry.fromMap(jsonDecode(maps[i]['geometry'])).coordinates![0][1],
longitude: Geometry.fromMap(jsonDecode(maps[i]['geometry'])).coordinates![0][0]
);
});
}
Future<List<Feature>> getFeaturesWithinBounds(LatLngBounds bounds) async {
final db = await database;
final List<Map<String, dynamic>> maps = await db.query(
'features',
where: 'latitude BETWEEN ? AND ? AND longitude BETWEEN ? AND ?',
whereArgs: [
bounds.southWest!.latitude,
bounds.northEast!.latitude,
bounds.southWest!.longitude,
bounds.northEast!.longitude,
],
);
return List.generate(maps.length, (i) {
return Feature(
id: maps[i]['id'],
geometry: Geometry.fromMap(jsonDecode(maps[i]['geometry'])),
properties: Properties.fromMap(jsonDecode(maps[i]['properties'])),
type: maps[i]['type'],
location_id: Properties.fromMap(jsonDecode(maps[i]['properties'])).location_id,
latitude: Geometry.fromMap(jsonDecode(maps[i]['geometry'])).coordinates![0][1],
longitude: Geometry.fromMap(jsonDecode(maps[i]['geometry'])).coordinates![0][0]
);
});
}
}

View File

@ -1,6 +1,7 @@
import 'package:geojson/geojson.dart'; import 'package:geojson/geojson.dart';
import 'package:rogapp/model/destination.dart'; import 'package:rogapp/model/destination.dart';
import 'package:rogapp/model/location_response.dart';
class TextUtils{ class TextUtils{
@ -18,22 +19,25 @@ class TextUtils{
} }
static String getDisplayText(Destination dp){ static String getDisplayText(Feature dp){
RegExp regex = RegExp(r'([.]*0)(?!.*\d)'); RegExp regex = RegExp(r'([.]*0)(?!.*\d)');
String txt = ""; String txt = "";
if(dp.cp! > 0){ if(dp.properties!.cp! > 0){
txt = "${dp.cp.toString().replaceAll(regex, '')}"; txt = "${dp.properties!.cp.toString().replaceAll(regex, '')}";
if(dp.checkin_point != null && dp.checkin_point! > 0){ if(dp.properties!.checkin_point != null && dp.properties!.checkin_point! > 0){
txt = txt + "{${dp.checkin_point.toString().replaceAll(regex, '')}}"; txt = txt + "{${dp.properties!.checkin_point.toString().replaceAll(regex, '')}}";
} }
if(dp.buy_point != null && dp.buy_point! > 0){ if(dp.properties!.buy_point != null && dp.properties!.buy_point! > 0){
print("^^^^^^^^^ ${dp.sub_loc_id}^^^^^^^^^^"); txt = "#${dp.properties!.cp.toString().replaceAll(regex, '')}(${dp.properties!.checkin_point.toString().replaceAll(regex, '')}+${dp.properties!.buy_point.toString().replaceAll(regex, '')})";
txt = "#${dp.cp.toString().replaceAll(regex, '')}(${dp.checkin_point.toString().replaceAll(regex, '')}+${dp.buy_point.toString().replaceAll(regex, '')})";
} }
} }
return txt; return txt;
} }
static String getDisplayTextForFeature(Feature f){
return "${f.properties!.sub_loc_id}";
}
// static String getDisplayText(String num){ // static String getDisplayText(String num){
// RegExp regex = RegExp(r'([.]*0)(?!.*\d)'); // RegExp regex = RegExp(r'([.]*0)(?!.*\d)');
// return "${num.replaceAll(regex, '')}"; // return "${num.replaceAll(regex, '')}";

View File

@ -1,6 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_map/plugin_api.dart';
import 'package:geojson/geojson.dart'; import 'package:geojson/geojson.dart';
import 'package:geolocator/geolocator.dart'; import 'package:geolocator/geolocator.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -9,11 +7,13 @@ import 'package:image_picker/image_picker.dart';
import 'package:latlong2/latlong.dart'; import 'package:latlong2/latlong.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
import 'package:rogapp/model/destination.dart'; import 'package:rogapp/model/destination.dart';
import 'package:rogapp/pages/camera/camera_page.dart'; import 'package:rogapp/model/location_response.dart';
import 'package:rogapp/pages/destination/destination_controller.dart';
import 'package:rogapp/pages/index/index_controller.dart';
import 'package:rogapp/routes/app_pages.dart'; import 'package:rogapp/routes/app_pages.dart';
import 'package:rogapp/screens/auth/controller/auth_controller.dart';
import 'package:rogapp/screens/home/home_controller.dart';
import 'package:rogapp/screens/home/location_controller.dart';
import 'package:rogapp/services/external_service.dart'; import 'package:rogapp/services/external_service.dart';
import 'package:rogapp/utils/checkin_db_helper.dart';
import 'package:rogapp/utils/const.dart'; import 'package:rogapp/utils/const.dart';
import 'package:rogapp/utils/database_helper.dart'; import 'package:rogapp/utils/database_helper.dart';
import 'package:rogapp/utils/text_util.dart'; import 'package:rogapp/utils/text_util.dart';
@ -23,23 +23,26 @@ import 'package:url_launcher/url_launcher.dart';
class BottomSheetNew extends GetView<BottomSheetController> { class BottomSheetNew extends GetView<BottomSheetController> {
BottomSheetNew({ Key? key }) : super(key: key); BottomSheetNew({ Key? key }) : super(key: key);
final IndexController indexController = Get.find<IndexController>(); //final IndexController indexController = Get.find<IndexController>();
final DestinationController destinationController = Get.find<DestinationController>(); //final DestinationController destinationController = Get.find<DestinationController>();
HomeController homeController = Get.find<HomeController>();
LocationController locationController = Get.find<LocationController>();
AuthController authController = Get.find<AuthController>();
CheckinDBHelper checkinDBHelper = CheckinDBHelper.instance;
Image getImage(){ Image getImage(){
String server_url = ConstValues.currentServer(); String server_url = ConstValues.currentServer();
if(indexController.rog_mode == 1){
//print("----- rogaining mode 1"); //print("----- rogaining mode 1");
if(indexController.currentDestinationFeature.length <= 0 || indexController.currentDestinationFeature[0].photos! == ""){ if(homeController.currentFeature.isEmpty || homeController.currentFeature[0].properties!.photos == ""){
return Image(image: AssetImage('assets/images/empty_image.png')); return Image(image: AssetImage('assets/images/empty_image.png'));
} }
else{ else{
//print("@@@@@@@@@@@@@ rog mode -------------------- ${indexController.currentDestinationFeature[0].photos} @@@@@@@@@@@"); //print("@@@@@@@@@@@@@ rog mode -------------------- ${indexController.currentDestinationFeature[0].photos} @@@@@@@@@@@");
String _photo = indexController.currentDestinationFeature[0].photos!; String _photo = homeController.currentFeature[0].properties!.photos!;
if(_photo.contains('http')){ if(_photo.contains('http')){
return Image(image: NetworkImage( return Image(image: NetworkImage(
indexController.currentDestinationFeature[0].photos!, homeController.currentFeature[0].properties!.photos!,
), ),
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
return Image.asset("assets/images/empty_image.png"); return Image.asset("assets/images/empty_image.png");
@ -48,7 +51,7 @@ class BottomSheetNew extends GetView<BottomSheetController> {
} }
else { else {
return Image(image: NetworkImage( return Image(image: NetworkImage(
'${server_url}/media/compressed/' + indexController.currentDestinationFeature[0].photos!, '${server_url}/media/compressed/' + homeController.currentFeature[0].properties!.photos!,
), ),
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
return Image.asset("assets/images/empty_image.png"); return Image.asset("assets/images/empty_image.png");
@ -56,64 +59,31 @@ class BottomSheetNew extends GetView<BottomSheetController> {
); );
} }
} }
}
else{
GeoJsonFeature<dynamic> gf = indexController.currentFeature[0];
if(gf!.properties!["photos"] == null || gf.properties!["photos"] == ""){
return Image(image: AssetImage('assets/images/empty_image.png'));
}
else{
String _photo = gf!.properties!["photos"];
if(_photo.contains('http')){
return Image(image: NetworkImage(
gf.properties!["photos"],
),
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
return Image.asset("assets/images/empty_image.png");
},
);
}
else {
return Image(image: NetworkImage(
'${server_url}/media/compressed/' + gf.properties!["photos"],
),
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
return Image.asset("assets/images/empty_image.png");
},
);
}
}
}
} }
void _launchURL(url) async { void _launchURL(url) async {
if (!await launch(url)) throw 'Could not launch $url'; if (!await launch(url)) throw 'Could not launch $url';
} }
bool isInDestination(String locationid){ // bool isInDestination(String locationid){
int lid = int.parse(locationid); // int lid = int.parse(locationid);
if(destinationController.destinations.where((element) => element.location_id == lid).length > 0){ // if(destinationController.destinations.where((element) => element.location_id == lid).length > 0){
return true; // return true;
} // }
else{ // else{
return false; // return false;
} // }
} // }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
destinationController.skip_gps = true; locationController.skip_gps = true;
print('---- rog_mode ----- ${indexController.rog_mode} -----'); return destinationSheet(context);
return indexController.rog_mode == 0 ? detailsSheet(context) : destinationSheet(context);
} }
// Show destination detais // Show destination detais
SingleChildScrollView destinationSheet(BuildContext context) { SingleChildScrollView destinationSheet(BuildContext context) {
print('---- currentDestinationFeature ----- ${indexController.currentDestinationFeature[0].name} -----');
return SingleChildScrollView( return SingleChildScrollView(
child: Column( child: Column(
@ -141,14 +111,14 @@ class BottomSheetNew extends GetView<BottomSheetController> {
child: Container( child: Container(
alignment: Alignment.center, alignment: Alignment.center,
child: Obx(() => child: Obx(() =>
indexController.currentUser.length > 0 ? authController.authList.isNotEmpty ?
Text("${TextUtils.getDisplayText(indexController.currentDestinationFeature[0])} : ${TextUtils.getDisplayText(indexController.currentDestinationFeature[0])} : ${indexController.currentDestinationFeature[0].name!}", style: TextStyle( Text("${TextUtils.getDisplayText(homeController.currentFeature[0])} : ${TextUtils.getDisplayText(homeController.currentFeature[0])} : ${homeController.currentFeature[0].properties!.location_name}", style: TextStyle(
fontSize: 15.0, fontSize: 15.0,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
) )
: :
Text("${indexController.currentDestinationFeature[0].name!}", style: TextStyle( Text("${homeController.currentFeature[0].properties!.location_name}", style: TextStyle(
fontSize: 15.0, fontSize: 15.0,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
@ -174,38 +144,48 @@ class BottomSheetNew extends GetView<BottomSheetController> {
mainAxisAlignment: MainAxisAlignment.spaceAround, mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [ children: [
Obx(() => Obx(() =>
indexController.currentDestinationFeature.isNotEmpty && destinationController.is_in_checkin.value == true && destinationController.is_at_start.value == false ? homeController.currentBound.isNotEmpty && locationController.is_in_checkin.value == true && locationController.is_at_start.value == false ?
Row( Row(
children: [ children: [
ElevatedButton( ElevatedButton(
onPressed: (){ onPressed: () async {
if(indexController.currentDestinationFeature[0].checkedin == null || indexController.currentDestinationFeature[0].checkedin == false){ final _locId = homeController.currentFeature[0].location_id;
if(indexController.currentDestinationFeature[0].hidden_location == 0){ final _exist = await checkinDBHelper.exists(_locId!);
destinationController.skip_gps = false; if(_exist){
destinationController.is_photo_shoot.value = true; if(homeController.currentFeature[0].properties!.hidden_location == 0){
locationController.skip_gps = false;
locationController.is_photo_shoot.value = true;
Get.back(); Get.back();
} }
else{ else{
destinationController.makeCheckin(indexController.currentDestinationFeature[0], true, ""); locationController.makeCheckin(homeController.currentFeature[0], true, "");
if(indexController.currentDestinationFeature[0].cp != -1){ if(homeController.currentFeature[0].properties!.cp != -1){
destinationController.rogaining_counted.value =true; locationController.rogaining_counted.value =true;
} }
} }
} }
else{ else{
destinationController.makeCheckin(indexController.currentDestinationFeature[0], false, ""); locationController.makeCheckin(homeController.currentFeature[0], false, "");
} }
//Get.back(); //Get.back();
}, },
child: Text( child: FutureBuilder<bool>(
//Checkin future: checkinDBHelper.exists(homeController.currentFeature[0].location_id!),
indexController.currentDestinationFeature[0].checkedin == null || indexController.currentDestinationFeature[0].checkedin == false ? builder: (BuildContext context, AsyncSnapshot<bool> snapshot){
"チェックイン" if (snapshot.connectionState == ConnectionState.waiting) {
: return CircularProgressIndicator(); // return a circular progress indicator while waiting
"チェックアウト" } else {
) if (snapshot.hasError)
return Text('Error: ${snapshot.error}'); // return error text if something went wrong
else
return snapshot.data! ?
const Text("チェックイン") : // Widget to show if locationId exists
const Text("チェックアウト");
}
},
),
), ),
], ],
) )
@ -213,19 +193,28 @@ class BottomSheetNew extends GetView<BottomSheetController> {
Container(), Container(),
), ),
Obx(() => Obx(() =>
destinationController.is_at_start.value == true ? locationController.is_at_start.value == true ?
ElevatedButton( ElevatedButton(
onPressed: (){ onPressed: (){
destinationController.is_in_rog.value = true; locationController.is_in_rog.value = true;
destinationController.addToRogaining(destinationController.current_lat, destinationController.current_lon, indexController.currentDestinationFeature[0].location_id!); locationController.addToRogaining(locationController.current_lat, locationController.current_lon, homeController.currentFeature[0].location_id!);
ExternalService().StartRogaining().then((value) => Get.back()); ExternalService().StartRogaining().then((value) => Get.back());
}, },
child: Text( child:
// start FutureBuilder<bool>(
indexController.currentDestinationFeature[0].checkedin != null || indexController.currentDestinationFeature[0].checkedin == true ? future: checkinDBHelper.exists(homeController.currentFeature[0].location_id!),
"ロゲイニングを開始" builder: (context, snapshot){
: if (snapshot.connectionState == ConnectionState.waiting) {
"間違った目的地..." return CircularProgressIndicator(); // return a circular progress indicator while waiting
} else {
if (snapshot.hasError)
return Text('Error: ${snapshot.error}'); // return error text if something went wrong
else
return snapshot.data! ?
const Text("ロゲイニングを開始") : // Widget to show if locationId exists
const Text("間違った目的地...");
}
},
) )
) )
: :
@ -233,18 +222,27 @@ class BottomSheetNew extends GetView<BottomSheetController> {
), ),
Obx(() => Obx(() =>
destinationController.is_at_goal.value == true && destinationController.rogaining_counted ==true ? locationController.is_at_goal.value == true && locationController.rogaining_counted ==true ?
ElevatedButton( ElevatedButton(
onPressed: (){ onPressed: (){
Get.toNamed(AppPages.CAMERA_PAGE); Get.toNamed(AppPages.CAMERA_PAGE);
Get.back(); Get.back();
}, },
child: Text( child:
//goal FutureBuilder<bool>(
indexController.currentDestinationFeature[0].checkedin != null || indexController.currentDestinationFeature[0].checkedin == true ? future: checkinDBHelper.exists(homeController.currentFeature[0].location_id!),
"ロゲイニングを終える" builder: (context, snapshot){
: if (snapshot.connectionState == ConnectionState.waiting) {
"間違った目的地 ..." return CircularProgressIndicator(); // return a circular progress indicator while waiting
} else {
if (snapshot.hasError)
return Text('Error: ${snapshot.error}'); // return error text if something went wrong
else
return snapshot.data! ?
const Text("ロゲイニングを終える") : // Widget to show if locationId exists
const Text("間違った目的地 ...");
}
},
) )
) )
: :
@ -254,32 +252,32 @@ class BottomSheetNew extends GetView<BottomSheetController> {
], ],
), ),
Obx(() => Obx(() =>
indexController.currentDestinationFeature[0].address != null && indexController.currentDestinationFeature[0].address!.isNotEmpty ? homeController.currentFeature[0].properties!.address != null ?
getDetails(context, "address".tr, indexController.currentDestinationFeature[0].address! ?? '') getDetails(context, "address".tr, homeController.currentFeature[0].properties!.address! ?? '')
: :
Container(width: 0.0, height: 0,), Container(width: 0.0, height: 0,),
), ),
Obx(() => Obx(() =>
indexController.currentDestinationFeature[0].phone != null && indexController.currentDestinationFeature[0].phone!.isNotEmpty ? homeController.currentFeature[0].properties!.phone != null ?
getDetails(context, "telephone".tr, indexController.currentDestinationFeature[0].phone! ?? '') getDetails(context, "telephone".tr, homeController.currentFeature[0].properties!.phone! ?? '')
: :
Container(width: 0.0, height: 0,), Container(width: 0.0, height: 0,),
), ),
Obx(() => Obx(() =>
indexController.currentDestinationFeature[0].email != null && indexController.currentDestinationFeature[0].email!.isNotEmpty ? homeController.currentFeature[0].properties!.email != null ?
getDetails(context, "email".tr, indexController.currentDestinationFeature[0].email! ?? '') getDetails(context, "email".tr, homeController.currentFeature[0].properties!.email! ?? '')
: :
Container(width: 0.0, height: 0,), Container(width: 0.0, height: 0,),
), ),
Obx(() => Obx(() =>
indexController.currentDestinationFeature[0].webcontents != null && indexController.currentDestinationFeature[0].webcontents!.isNotEmpty ? homeController.currentFeature[0].properties!.webcontents != null ?
getDetails(context, "web".tr, indexController.currentDestinationFeature[0].webcontents! ?? '', isurl: true) getDetails(context, "web".tr, homeController.currentFeature[0].properties!.webcontents! ?? '', isurl: true)
: :
Container(width: 0.0, height: 0,), Container(width: 0.0, height: 0,),
), ),
Obx(() => Obx(() =>
indexController.currentDestinationFeature[0].videos != null && indexController.currentDestinationFeature[0].videos!.isNotEmpty ? homeController.currentFeature[0].properties!.videos != null ?
getDetails(context, "video".tr, indexController.currentDestinationFeature[0].videos! ?? '', isurl: true) getDetails(context, "video".tr, homeController.currentFeature[0].properties!.videos! ?? '', isurl: true)
: :
Container(width: 0.0, height: 0,), Container(width: 0.0, height: 0,),
), ),
@ -333,7 +331,7 @@ class BottomSheetNew extends GetView<BottomSheetController> {
child: Container( child: Container(
alignment: Alignment.center, alignment: Alignment.center,
child: Obx(() => child: Obx(() =>
Text(indexController.currentFeature[0].properties!["location_name"], style: TextStyle( Text(homeController.currentFeature[0].properties!.location_name!, style: TextStyle(
fontSize: 15.0, fontSize: 15.0,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
@ -364,38 +362,60 @@ class BottomSheetNew extends GetView<BottomSheetController> {
mainAxisAlignment: MainAxisAlignment.spaceAround, mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [ children: [
Obx(() => Obx(() =>
indexController.currentDestinationFeature.isNotEmpty && indexController.currentDestinationFeature[0].cp == -1 && indexController.currentDestinationFeature[0].checkedin == false && destinationController.is_at_start.value == true ? FutureBuilder<bool>(
ElevatedButton( future: checkinDBHelper.exists(homeController.currentFeature[0].location_id!),
onPressed: (){ builder: (context, snapshot){
destinationController.is_in_rog.value = true; if (snapshot.connectionState == ConnectionState.waiting) {
destinationController.addToRogaining(destinationController.current_lat, destinationController.current_lon, indexController.currentDestinationFeature[0].location_id!); return CircularProgressIndicator(); // return a circular progress indicator while waiting
ExternalService().StartRogaining().then((value) => Get.back()); } else {
}, if (snapshot.hasError)
child: Text( return Text('Error: ${snapshot.error}'); // return error text if something went wrong
// start else
indexController.currentDestinationFeature[0].checkedin != null || indexController.currentDestinationFeature[0].checkedin == true ? if(homeController.currentFeature[0].properties!.cp == -1 && locationController.is_at_start.value ==true){
"ロゲイニングを開始" return ElevatedButton(
: onPressed: (){
"間違った目的地..." locationController.is_in_rog.value = true;
) locationController.addToRogaining(locationController.current_lat, locationController.current_lon, homeController.currentFeature[0].location_id!);
) ExternalService().StartRogaining().then((value) => Get.back());
: },
Container(), child: Text(
// start
snapshot.data! == true ?
"ロゲイニングを開始"
:
"間違った目的地..."
)
);
}
else {
return Container();
}
}
},
)
), ),
Obx(() => Obx(() =>
destinationController.is_at_goal.value == true && destinationController.rogaining_counted ==true ? locationController.is_at_goal.value == true && locationController.rogaining_counted ==true ?
ElevatedButton( ElevatedButton(
onPressed: (){ onPressed: (){
Get.toNamed(AppPages.CAMERA_PAGE); Get.toNamed(AppPages.CAMERA_PAGE);
Get.back(); Get.back();
}, },
child: Text( child:
//goal FutureBuilder<bool>(
indexController.currentDestinationFeature[0].checkedin != null || indexController.currentDestinationFeature[0].checkedin == true ? future: checkinDBHelper.exists(homeController.currentFeature[0].location_id!),
"ロゲイニングを終える" builder: (context, snapshot){
: if (snapshot.connectionState == ConnectionState.waiting) {
"間違った目的地 ..." return CircularProgressIndicator(); // return a circular progress indicator while waiting
} else {
if (snapshot.hasError)
return Text('Error: ${snapshot.error}'); // return error text if something went wrong
else
return snapshot.data! ?
const Text("ロゲイニングを終える") : // Widget to show if locationId exists
const Text("間違った目的地 ...");
}
},
) )
) )
: :
@ -409,41 +429,56 @@ class BottomSheetNew extends GetView<BottomSheetController> {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
indexController.currentDestinationFeature.isNotEmpty && destinationController.is_in_checkin.value == true ? FutureBuilder<bool>(
Container() future: checkinDBHelper.exists(homeController.currentFeature[0].location_id!),
: builder: (context, snapshot){
FutureBuilder<Widget>( if (snapshot.connectionState == ConnectionState.waiting) {
future: wantToGo(context), return CircularProgressIndicator(); // return a circular progress indicator while waiting
builder: (context, snapshot) { } else {
return Container( if (snapshot.hasError)
child: snapshot.data, return Text('Error: ${snapshot.error}'); // return error text if something went wrong
); else{
}, if(snapshot.data == true){
), return Container();
indexController.currentFeature[0].properties!["location_name"] != null && (indexController.currentFeature[0].properties!["location_name"] as String).isNotEmpty ? }
Flexible(child: Text(indexController.currentFeature[0].properties!["location_name"])) else{
: return FutureBuilder<Widget>(
Container(width: 0.0, height: 0,), future: wantToGo(context),
builder: (context, snapshot) {
return Container(
child: snapshot.data,
);
},
);
}
}
}
},
)
// indexController.currentFeature[0].properties!["location_name"] != null && (indexController.currentFeature[0].properties!["location_name"] as String).isNotEmpty ?
// Flexible(child: Text(indexController.currentFeature[0].properties!["location_name"]))
// :
// Container(width: 0.0, height: 0,),
], ],
), ),
), ),
ElevatedButton( ElevatedButton(
onPressed:() async { onPressed:() async {
GeoJsonFeature<GeoJsonMultiPoint> mp = indexController.currentFeature[0] as GeoJsonFeature<GeoJsonMultiPoint>; Feature mp = homeController.currentFeature[0];
Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
Destination ds = Destination( Feature ds = Feature(
lat: position.latitude, latitude: position.latitude,
lon: position.longitude longitude: position.longitude
); );
Destination tp = Destination( Feature tp = Feature(
lat: mp.geometry!.geoSerie!.geoPoints[0].latitude, latitude: mp.latitude,
lon: mp.geometry!.geoSerie!.geoPoints[0].longitude longitude: mp.longitude
); );
Get.back(); Get.back();
destinationController.destinationMatrixFromCurrentPoint([ds, tp]); locationController.destinationMatrixFromCurrentPoint([ds, tp]);
}, },
child:Text("ここへ行く")), child:Text("ここへ行く")),
], ],
@ -455,8 +490,8 @@ class BottomSheetNew extends GetView<BottomSheetController> {
children: [ children: [
Icon(Icons.roundabout_left), Icon(Icons.roundabout_left),
SizedBox(width: 8.0,), SizedBox(width: 8.0,),
indexController.currentFeature[0].properties!["address"] != null && (indexController.currentFeature[0].properties!["address"] as String).isNotEmpty ? homeController.currentFeature[0].properties!.address != null && homeController.currentFeature[0].properties!.address!.isNotEmpty ?
getDetails(context, "address".tr, indexController.currentFeature[0].properties!["address"] ?? '') getDetails(context, "address".tr, homeController.currentFeature[0].properties!.address ?? '')
: :
Container(width: 0.0, height: 0,), Container(width: 0.0, height: 0,),
], ],
@ -468,8 +503,8 @@ class BottomSheetNew extends GetView<BottomSheetController> {
children: [ children: [
Icon(Icons.phone), Icon(Icons.phone),
SizedBox(width: 8.0,), SizedBox(width: 8.0,),
indexController.currentFeature[0].properties!["phone"] != null && (indexController.currentFeature[0].properties!["phone"] as String).isNotEmpty ? homeController.currentFeature[0].properties!.phone != null && homeController.currentFeature[0].properties!.phone!.isNotEmpty ?
getDetails(context, "telephone".tr, indexController.currentFeature[0].properties!["phone"] ?? '') getDetails(context, "telephone".tr, homeController.currentFeature[0].properties!.phone ?? '')
: :
Container(width: 0.0, height: 0,), Container(width: 0.0, height: 0,),
], ],
@ -481,8 +516,8 @@ class BottomSheetNew extends GetView<BottomSheetController> {
children: [ children: [
Icon(Icons.email), Icon(Icons.email),
SizedBox(width: 8.0,), SizedBox(width: 8.0,),
indexController.currentFeature[0].properties!["email"] != null && (indexController.currentFeature[0].properties!["email"] as String).isNotEmpty ? homeController.currentFeature[0].properties!.email != null && homeController.currentFeature[0].properties!.email!.isNotEmpty ?
getDetails(context, "email".tr, indexController.currentFeature[0].properties!["email"] ?? '') getDetails(context, "email".tr, homeController.currentFeature[0].properties!.email ?? '')
: :
Container(width: 0.0, height: 0,), Container(width: 0.0, height: 0,),
], ],
@ -494,8 +529,8 @@ class BottomSheetNew extends GetView<BottomSheetController> {
children: [ children: [
Icon(Icons.language), Icon(Icons.language),
SizedBox(width: 8.0,), SizedBox(width: 8.0,),
indexController.currentFeature[0].properties!["webcontents"] != null && (indexController.currentFeature[0].properties!["webcontents"] as String).isNotEmpty ? homeController.currentFeature[0].properties!.webcontents != null && homeController.currentFeature[0].properties!.webcontents!.isNotEmpty ?
getDetails(context, "web".tr, indexController.currentFeature[0].properties!["webcontents"] ?? '', isurl: true) getDetails(context, "web".tr, homeController.currentFeature[0].properties!.webcontents ?? '', isurl: true)
: :
Container(width: 0.0, height: 0,), Container(width: 0.0, height: 0,),
], ],
@ -506,8 +541,8 @@ class BottomSheetNew extends GetView<BottomSheetController> {
child: Row( child: Row(
children: [ children: [
SizedBox(width: 8.0,), SizedBox(width: 8.0,),
indexController.currentFeature[0].properties!["remark"] != null && (indexController.currentFeature[0].properties!["remark"] as String).isNotEmpty ? homeController.currentFeature[0].properties!.remark != null && homeController.currentFeature[0].properties!.remark!.isNotEmpty ?
getDetails(context, "remarks".tr, indexController.currentFeature[0].properties!["remark"] ?? '', isurl: false) getDetails(context, "remarks".tr, homeController.currentFeature[0].properties!.remark ?? '', isurl: false)
: :
Container(width: 0.0, height: 0,), Container(width: 0.0, height: 0,),
], ],
@ -528,16 +563,10 @@ class BottomSheetNew extends GetView<BottomSheetController> {
Future<Widget> wantToGo(BuildContext context)async { Future<Widget> wantToGo(BuildContext context)async {
bool _selected = false; bool _selected = await checkinDBHelper.exists(homeController.currentFeature[0].location_id!);
print('---target-- ${indexController.currentFeature[0].properties!["location_id"]}----');
for(Destination d in destinationController.destinations){
print('---- ${d.location_id.toString()} ----');
if(d.location_id == indexController.currentFeature[0].properties!["location_id"]){
_selected = true;
break;
}
}
DatabaseHelper db = DatabaseHelper.instance; DatabaseHelper db = DatabaseHelper.instance;
return return
@ -547,196 +576,108 @@ class BottomSheetNew extends GetView<BottomSheetController> {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
indexController.rog_mode == 0 ? ElevatedButton(
IconButton(
icon: Icon(Icons.pin_drop_sharp, size: 32, color: _selected == true ? Colors.amber : Colors.blue,),
onPressed: (){
if(_selected){
// show remove from destination
Get.defaultDialog(
title: "本当にこのポイントを通過順から外しますか?",
middleText: "場所は目的地リストから削除されます",
backgroundColor: Colors.blue.shade300,
titleStyle: TextStyle(color: Colors.white),
middleTextStyle: TextStyle(color: Colors.white),
textConfirm: "はい",
textCancel: "いいえ",
cancelTextColor: Colors.white,
confirmTextColor: Colors.blue,
buttonColor: Colors.white,
barrierDismissible: false,
radius: 10,
content: Column(
children: [
],
),
onConfirm: (){
int _id = indexController.currentFeature[0].properties!["location_id"];
Destination? d = destinationController.destinationById(_id);
print('--- des id is : ${d} -----');
if(d != null) {
//print('--- des id is : ${d.location_id} -----');
destinationController.deleteDestination(d);
Get.back();
Get.back();
Get.snackbar("追加した", "場所が削除されました");
}
}
);
return;
}
// show add to destination
Get.defaultDialog(
title: "この場所を登録してもよろしいですか",
middleText: "ロケーションがロガニング リストに追加されます",
backgroundColor: Colors.blue.shade300,
titleStyle: TextStyle(color: Colors.white),
middleTextStyle: TextStyle(color: Colors.white),
textConfirm: "はい",
textCancel: "いいえ",
cancelTextColor: Colors.white,
confirmTextColor: Colors.blue,
buttonColor: Colors.white,
barrierDismissible: false,
radius: 10,
content: Column(
children: [
],
),
onConfirm: (){
GeoJsonMultiPoint mp = indexController.currentFeature[0].geometry as GeoJsonMultiPoint;
LatLng pt = LatLng(mp.geoSerie!.geoPoints[0].latitude, mp.geoSerie!.geoPoints[0].longitude);
print("----- want to go sub location is ---- ${indexController.currentFeature[0].properties!["sub_loc_id"]} -----");
Destination dest = Destination(
name: indexController.currentFeature[0].properties!["location_name"],
address: indexController.currentFeature[0].properties!["address"],
phone: indexController.currentFeature[0].properties!["phone"],
email: indexController.currentFeature[0].properties!["email"],
webcontents: indexController.currentFeature[0].properties!["webcontents"],
videos: indexController.currentFeature[0].properties!["videos"],
category: indexController.currentFeature[0].properties!["category"],
series: 1,
lat: pt.latitude,
lon: pt.longitude,
sub_loc_id: indexController.currentFeature[0].properties!["sub_loc_id"],
location_id: indexController.currentFeature[0].properties!["location_id"],
list_order: 1,
photos: indexController.currentFeature[0].properties!["photos"],
checkin_radious: indexController.currentFeature[0].properties!["checkin_radius"],
auto_checkin: indexController.currentFeature[0].properties!["auto_checkin"] == true ? 1 : 0,
cp: indexController.currentFeature[0].properties!["cp"],
checkin_point: indexController.currentFeature[0].properties!["checkin_point"],
buy_point: indexController.currentFeature[0].properties!["buy_point"],
selected: false,
checkedin: false,
hidden_location: indexController.currentFeature[0].properties!["hidden_location"] == true ?1 : 0
);
destinationController.addDestinations(dest);
Get.back();
Get.back();
Get.snackbar("追加した", "場所が追加されました");
}
);
},
):
Container(),
SizedBox(width: 8.0,) ,
Obx((() =>
indexController.rog_mode == 1 ?
ElevatedButton(
onPressed: () async { onPressed: () async {
Destination dest = indexController.currentDestinationFeature[0]!; Feature dest = homeController.currentFeature[0];
//print("------ curent destination is ${dest!.checkedIn}-------"); //print("------ curent destination is ${dest!.checkedIn}-------");
if(dest != null){ if(dest != null){
//print("------ curent destination is ${dest!.checkedin}-------::::::::::"); //print("------ curent destination is ${dest!.checkedin}-------::::::::::");
destinationController.makeCheckin(dest, !dest.checkedin!, ""); bool checkin = await checkinDBHelper.exists(homeController.currentFeature[0].location_id!);
locationController.makeCheckin(dest, checkin, "");
} }
}, },
child: indexController.currentDestinationFeature[0].checkedin == false ? child:
Text("チェックイン") FutureBuilder<bool>(
: future: checkinDBHelper.exists(homeController.currentFeature[0].location_id!),
Text("チェックアウト") builder: (context, snapshot){
): if (snapshot.connectionState == ConnectionState.waiting) {
Container() return CircularProgressIndicator();
) }else {
), if (snapshot.hasError)
return Text('Error: ${snapshot.error}'); // return error text if something went wrong
else
return snapshot.data! ?
const Text("チェックイン") : // Widget to show if locationId exists
const Text("チェックアウト");
}
},
)
)
], ],
), ),
], ],
); );
} }
Widget getCheckin(BuildContext context){ // Widget getCheckin(BuildContext context){
//print("------ currentAction ----- ${indexController.currentAction}-----"); // //print("------ currentAction ----- ${indexController.currentAction}-----");
return Row( // return Row(
mainAxisAlignment: MainAxisAlignment.center, // mainAxisAlignment: MainAxisAlignment.center,
children: [ // children: [
Row( // Row(
mainAxisAlignment: MainAxisAlignment.center, // mainAxisAlignment: MainAxisAlignment.center,
children: [ // children: [
indexController.currentAction[0][0]["checkin"] == false ? // indexController.currentAction[0][0]["checkin"] == false ?
Column( // Column(
children: [ // children: [
Row( // Row(
mainAxisSize: MainAxisSize.max, // mainAxisSize: MainAxisSize.max,
children: [ // children: [
ElevatedButton( // ElevatedButton(
child: Text("Image"), onPressed: (){ // child: Text("Image"), onPressed: (){
final ImagePicker _picker = ImagePicker(); // final ImagePicker _picker = ImagePicker();
_picker.pickImage(source: ImageSource.camera).then((value){ // _picker.pickImage(source: ImageSource.camera).then((value){
//print("----- image---- ${value!.path}"); // //print("----- image---- ${value!.path}");
}); // });
}, // },
) // )
], // ],
), // ),
ElevatedButton( // ElevatedButton(
onPressed: (){ // onPressed: (){},
if(indexController.currentAction.isNotEmpty){ // //onPressed: (){
//print(indexController.currentAction[0]); // // if(indexController.currentAction.isNotEmpty){
indexController.currentAction[0][0]["checkin"] = true; // // //print(indexController.currentAction[0]);
Map<String,dynamic> temp = Map<String,dynamic>.from(indexController.currentAction[0][0]); // // indexController.currentAction[0][0]["checkin"] = true;
indexController.currentAction.clear(); // // Map<String,dynamic> temp = Map<String,dynamic>.from(indexController.currentAction[0][0]);
//print("---temp---${temp}"); // // indexController.currentAction.clear();
indexController.currentAction.add([temp]); // // //print("---temp---${temp}");
} // // indexController.currentAction.add([temp]);
indexController.makeAction(context); // // }
}, // // indexController.makeAction(context);
child: Text("checkin".tr) // // },
) // child: Text("checkin".tr)
], // )
) // ],
: // )
ElevatedButton( // :
onPressed: (){ // ElevatedButton(
if(indexController.currentAction.isNotEmpty){ // onPressed: (){},
//print(indexController.currentAction[0]); // // onPressed: (){
indexController.currentAction[0][0]["checkin"] = false; // // if(indexController.currentAction.isNotEmpty){
Map<String,dynamic> temp = Map<String,dynamic>.from(indexController.currentAction[0][0]); // // //print(indexController.currentAction[0]);
indexController.currentAction.clear(); // // indexController.currentAction[0][0]["checkin"] = false;
//print("---temp---${temp}"); // // Map<String,dynamic> temp = Map<String,dynamic>.from(indexController.currentAction[0][0]);
indexController.currentAction.add([temp]); // // indexController.currentAction.clear();
} // // //print("---temp---${temp}");
indexController.makeAction(context); // // indexController.currentAction.add([temp]);
}, // // }
// // indexController.makeAction(context);
// // },
child: Icon( // child: Icon(
Icons.favorite, color: Colors.red) // Icons.favorite, color: Colors.red)
, // ,
) // )
], // ],
) // )
], // ],
); // );
} // }
@ -749,13 +690,7 @@ class BottomSheetNew extends GetView<BottomSheetController> {
InkWell( InkWell(
onTap: (){ onTap: (){
if(isurl){ if(isurl){
if(indexController.rog_mode == 0){ _launchURL(homeController.currentFeature[0].properties!.webcontents);
_launchURL(indexController.currentFeature[0].properties!["webcontents"]);
}
else {
indexController.currentDestinationFeature[0].webcontents;
}
} }
}, },
child: Container( child: Container(

View File

@ -652,10 +652,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: json_annotation name: json_annotation
sha256: cb314f00b2488de7bc575207e54402cd2f92363f333a7933fd1b0631af226baa sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.6.0" version: "4.8.1"
latlong2: latlong2:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1182,7 +1182,7 @@ packages:
source: hosted source: hosted
version: "1.3.1" version: "1.3.1"
unicode: unicode:
dependency: transitive dependency: "direct main"
description: description:
name: unicode name: unicode
sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1"
@ -1318,5 +1318,5 @@ packages:
source: hosted source: hosted
version: "3.1.1" version: "3.1.1"
sdks: sdks:
dart: ">=2.18.0 <3.0.0" dart: ">=2.19.0 <3.0.0"
flutter: ">=3.7.0" flutter: ">=3.7.0"

View File

@ -75,6 +75,7 @@ dependencies:
connectivity_plus: ^3.0.2 connectivity_plus: ^3.0.2
flutter_map_tile_caching: ^6.2.0 flutter_map_tile_caching: ^6.2.0
shared_preferences: ^2.0.15 shared_preferences: ^2.0.15
unicode: ^0.3.0
flutter_icons: flutter_icons:
android: true android: true