This commit is contained in:
Mohamed Nouffer
2022-04-17 11:45:21 +05:30
parent ee3845681d
commit e6cf730ae2
30 changed files with 1260 additions and 534 deletions

View File

@ -8,11 +8,4 @@ class BottomSheetController extends GetxController{
List<GeoJsonFeature>? currentFeature = <GeoJsonFeature>[];
BottomSheetController({this.currentFeature});
@override
void onInit() {
super.onInit();
}
}

View File

@ -1,13 +1,13 @@
import 'package:flutter/material.dart';
import 'package:geojson/geojson.dart';
import 'package:get/get.dart';
import 'package:rogapp/pages/home/home_controller.dart';
import 'package:rogapp/index/index_controller.dart';
import 'package:url_launcher/url_launcher.dart';
class BottomSheetWidget extends StatelessWidget {
//const BottomSheetWidget({ Key? key }, GeoJsonFeature? pt) : super(key: key);
final HomeController homeController = Get.find<HomeController>();
final IndexController indexController = Get.find<IndexController>();
Image getImage(GeoJsonFeature? gf){
if(gf!.properties!["photos"] == null || gf.properties!["photos"] == ""){
@ -47,7 +47,7 @@ class BottomSheetWidget extends StatelessWidget {
children: [
MaterialButton(
onPressed: () {
homeController.makePrevious(homeController.currentFeature[0]);
indexController.makePrevious(indexController.currentFeature[0]);
},
color: Colors.blue,
textColor: Colors.white,
@ -62,7 +62,7 @@ class BottomSheetWidget extends StatelessWidget {
child: Container(
alignment: Alignment.center,
child: Obx(() =>
Text(homeController.currentFeature[0].properties!["location_name"], style: TextStyle(
Text(indexController.currentFeature[0].properties!["location_name"], style: TextStyle(
fontSize: 15.0,
fontWeight: FontWeight.bold,
),
@ -72,7 +72,7 @@ class BottomSheetWidget extends StatelessWidget {
),
MaterialButton(
onPressed: () {
homeController.makeNext(homeController.currentFeature[0]);
indexController.makeNext(indexController.currentFeature[0]);
},
color: Colors.blue,
textColor: Colors.white,
@ -90,7 +90,7 @@ class BottomSheetWidget extends StatelessWidget {
Expanded(
child: SizedBox(
height: 360.0,
child: Obx(() => getImage(homeController.currentFeature[0])),
child: Obx(() => getImage(indexController.currentFeature[0])),
)
),
],
@ -102,7 +102,7 @@ class BottomSheetWidget extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 24.0),
child: Column(
children: [
homeController.currentFeature[0].properties!["address"] != null ?
indexController.currentFeature[0].properties!["address"] != null ?
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@ -115,7 +115,7 @@ class BottomSheetWidget extends StatelessWidget {
Expanded(
child: Container(
alignment: Alignment.topLeft,
child: Obx(() => Text(homeController.currentFeature[0].properties!["address"] ?? '',
child: Obx(() => Text(indexController.currentFeature[0].properties!["address"] ?? '',
style: TextStyle(color: Colors.blue,),
softWrap: true,
overflow: TextOverflow.ellipsis,)
@ -124,7 +124,7 @@ class BottomSheetWidget extends StatelessWidget {
)
],
): Container(width: 0.0, height: 0,),
homeController.currentFeature[0].properties!["phone"] != null ?
indexController.currentFeature[0].properties!["phone"] != null ?
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@ -135,7 +135,7 @@ class BottomSheetWidget extends StatelessWidget {
Expanded(
child: Container(
alignment: Alignment.topLeft,
child: Obx(() => Text(homeController.currentFeature[0].properties!["phone"] ?? '',
child: Obx(() => Text(indexController.currentFeature[0].properties!["phone"] ?? '',
style: TextStyle(color: Colors.blue,),
overflow: TextOverflow.ellipsis,)
),
@ -143,7 +143,7 @@ class BottomSheetWidget extends StatelessWidget {
)
],
): Container(width: 0, height: 0,),
homeController.currentFeature[0].properties!["email"] != null ?
indexController.currentFeature[0].properties!["email"] != null ?
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@ -154,7 +154,7 @@ class BottomSheetWidget extends StatelessWidget {
Expanded(
child: Container(
alignment: Alignment.topLeft,
child: Obx(() => Text(homeController.currentFeature[0].properties!["email"] ?? '',
child: Obx(() => Text(indexController.currentFeature[0].properties!["email"] ?? '',
style: TextStyle(color: Colors.blue,),
overflow: TextOverflow.ellipsis,)
),
@ -162,7 +162,7 @@ class BottomSheetWidget extends StatelessWidget {
)
],
): Container(width: 0, height: 0,),
homeController.currentFeature[0].properties!["webcontents"] != null ?
indexController.currentFeature[0].properties!["webcontents"] != null ?
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@ -176,9 +176,9 @@ class BottomSheetWidget extends StatelessWidget {
alignment: Alignment.topLeft,
child: Obx(() => InkWell(
onTap: (){
_launchURL(homeController.currentFeature[0].properties!["webcontents"]);
_launchURL(indexController.currentFeature[0].properties!["webcontents"]);
},
child: Text(homeController.currentFeature[0].properties!["webcontents"] ?? '',
child: Text(indexController.currentFeature[0].properties!["webcontents"] ?? '',
style: TextStyle(color: Colors.blue,),
softWrap: false,
overflow: TextOverflow.fade,),
@ -187,7 +187,7 @@ class BottomSheetWidget extends StatelessWidget {
)
],
): Container(width: 0.0, height: 0.0,),
homeController.currentFeature[0].properties!["videos"] != null ?
indexController.currentFeature[0].properties!["videos"] != null ?
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@ -198,7 +198,7 @@ class BottomSheetWidget extends StatelessWidget {
Expanded(
child: Container(
alignment: Alignment.topLeft,
child: Obx(() => Text(homeController.currentFeature[0].properties!["videos"] ?? '',
child: Obx(() => Text(indexController.currentFeature[0].properties!["videos"] ?? '',
style: TextStyle(color: Colors.blue,),
overflow: TextOverflow.ellipsis,)
),

View File

@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:get/get.dart';
import 'package:flutter_breadcrumb/flutter_breadcrumb.dart';
import 'package:rogapp/index/index_controller.dart';
import 'package:rogapp/widgets/perfecture_widget.dart';
class BreadCrumbWidget extends StatelessWidget {
BreadCrumbWidget({Key? key}) : super(key: key);
final IndexController indexController = Get.find<IndexController>();
@override
Widget build(BuildContext context) {
return Obx(()=> indexController.perfectures.isNotEmpty ?
BreadCrumb.builder(
itemCount: indexController.perfectures.length,
builder: (index){
return BreadCrumbItem(
content: PerfectureWidget(indexController: indexController, mapController: indexController.mapController!) //Text('Item$index')
);
}
):
const Text("Empty"));
}
}

View File

@ -0,0 +1,56 @@
import 'package:flutter/material.dart';
import 'package:geojson/geojson.dart';
import 'package:get/get.dart';
import 'package:rogapp/index/index_controller.dart';
import 'package:rogapp/widgets/bottom_sheet_widget.dart';
class ListWidget extends StatelessWidget {
ListWidget({ Key? key }) : super(key: key);
final IndexController indexController = Get.find<IndexController>();
Image getImage(int index){
if(indexController.locations[0].collection[index].properties!["photos"] == null || indexController.locations[0].collection[index].properties!["photos"] == ""){
return Image(image: AssetImage('assets/images/empty_image.png'));
}
else{
return Image(image: NetworkImage(indexController.locations[0].collection[index].properties!["photos"]));
}
}
void changeCurrentFeature(GeoJsonFeature fs){
if(indexController.currentFeature.length > 0){
indexController.currentFeature.clear();
}
indexController.currentFeature.add(fs);
}
@override
Widget build(BuildContext context) {
return Obx(() =>
indexController.locations.length > 0 ?
ListView.builder(
itemCount: indexController.locations[0].collection.length,
shrinkWrap: true,
itemBuilder: (_, index){
return Card(
child: ListTile(
onTap: (){
GeoJsonFeature gf = indexController.locations[0].collection[index];
changeCurrentFeature(gf);
showModalBottomSheet(
isScrollControlled: true,
context: context,
builder: (context) => BottomSheetWidget(),
);
},
leading: getImage(index),
title: Text(indexController.locations[0].collection[index].properties!['location_name'].toString()),
subtitle: Text(indexController.locations[0].collection[index].properties!['category']),
),
);
},
) : Container(width: 0, height: 0,),
);
}
}

104
lib/widgets/map_widget.dart Normal file
View File

@ -0,0 +1,104 @@
import 'package:flutter/material.dart';
import 'package:flutter_map/plugin_api.dart';
import 'package:flutter_map_location_marker/flutter_map_location_marker.dart';
import 'package:flutter_map_marker_cluster/flutter_map_marker_cluster.dart';
import 'package:geojson/geojson.dart';
import 'package:get/get.dart';
import 'package:get/get_state_manager/get_state_manager.dart';
import 'package:latlong2/latlong.dart';
import 'package:rogapp/index/index_controller.dart';
import 'package:rogapp/widgets/base_layer_widget.dart';
import 'package:rogapp/widgets/bottom_sheet_widget.dart';
class MapWidget extends StatelessWidget {
final IndexController indexController = Get.find<IndexController>();
MapWidget({ Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final PopupController _popupController = PopupController();
return Stack(
children: [
Obx(() =>
FlutterMap(
//mapController: mapController,
options: MapOptions(
onMapCreated: (c){indexController.mapController = c;},
//center: LatLng(37.15319600454702, 139.58765950528198),
bounds: indexController.currentBound.length > 0 ? indexController.currentBound[0]: LatLngBounds.fromPoints([LatLng(35.03999881162295, 136.40587119778962), LatLng(36.642756778706904, 137.95226720406063)]),
zoom: 1,
maxZoom: 20,
plugins: [
MarkerClusterPlugin(),
],
onTap: (_, __) =>
_popupController
.hideAllPopups(), // Hide popup when the map is tapped.
),
children: [
BaseLayer(),
LocationMarkerLayerWidget(),
indexController.locations.length > 0 ?
MarkerClusterLayerWidget(
options: MarkerClusterLayerOptions(
spiderfyCircleRadius: 80,
spiderfySpiralDistanceMultiplier: 2,
circleSpiralSwitchover: 12,
maxClusterRadius: 20,
rotate: true,
onMarkerTap: (marker){
GeoJsonFeature? fs = indexController.getFeatureForLatLong(marker.point.latitude, marker.point.longitude);
print(fs);
if(fs != null){
if(indexController.currentFeature.length > 0) {
indexController.currentFeature.clear();
}
indexController.currentFeature.add(fs);
showModalBottomSheet(context: context, isScrollControlled: true,
builder:((context) => BottomSheetWidget())
);
}
},
size: Size(40, 40),
anchor: AnchorPos.align(AnchorAlign.center),
fitBoundsOptions: const FitBoundsOptions(
padding: EdgeInsets.all(50),
maxZoom: 265,
),
markers:indexController.locations[0].collection.map((i) {
GeoJsonMultiPoint p = i.geometry as GeoJsonMultiPoint;
return Marker(
anchorPos: AnchorPos.align(AnchorAlign.center),
height: 70.0,
width: 70.0,
point: LatLng(p.geoSerie!.geoPoints[0].latitude, p.geoSerie!.geoPoints[0].longitude),
builder: (ctx) => Icon(Icons.pin_drop),
);
}).toList(),
builder: (context, markers) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20.0),
color: Colors.blue),
child: Center(
child: Text(
markers.length.toString(),
style: TextStyle(color: Colors.white),
),
),
);
},
),
): Container(height:0,width: 0),
],
)
)
],
);
}
}

View File

@ -1,27 +1,29 @@
import 'package:flutter/material.dart';
import 'package:geojson/geojson.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:get/get.dart';
import 'package:rogapp/pages/home/home_controller.dart';
import 'package:rogapp/index/index_controller.dart';
class PerfectureWidget extends StatefulWidget {
class PerfectureWidget extends StatefulWidget {
IndexController indexController;
MapController mapController;
HomeController homeController;
PerfectureWidget({required this.homeController});
PerfectureWidget({Key? key, required this.indexController, required this.mapController}) : super(key: key){
//indexController.zoomtoMainPerf("9", mapController);
}
@override
State<PerfectureWidget> createState() => _PerfectureWidgetState();
}
class _PerfectureWidgetState extends State<PerfectureWidget> {
String dropdownValue = "1";
String dropdownValue = "9";
List<DropdownMenuItem<String>> getDropdownItems() {
List<DropdownMenuItem<String>> dropDownItems = [];
for (Map<String, dynamic> currency in widget.homeController.perfectures[0]) {
for (Map<String, dynamic> currency in widget.indexController.perfectures[0]) {
//print(currency["id"].toString());
var newDropdown = DropdownMenuItem(
child: Text(currency["adm1_ja"].toString()),
@ -35,22 +37,21 @@ class _PerfectureWidgetState extends State<PerfectureWidget> {
List<DropdownMenuItem<String>> getSubDropdownItems() {
List<DropdownMenuItem<String>> dropDownItems = [];
if(widget.homeController.subPerfs.length > 0){
for (Map<String, dynamic> currency in widget.homeController.subPerfs[0]) {
//print(currency["id"].toString());
var newDropdown = DropdownMenuItem(
child: Text(currency["adm2_l"].toString()),
value: currency["id"].toString(),
);
dropDownItems.add(newDropdown);
}
if(widget.indexController.subPerfs.isNotEmpty){
for (Map<String, dynamic> currency in widget.indexController.subPerfs[0]) {
var newDropdown = DropdownMenuItem(
child: Text(currency["adm2_ja"].toString()),
value: currency["id"].toString(),
);
dropDownItems.add(newDropdown);
}
}
return dropDownItems;
}
@override
Widget build(BuildContext context) {
return Obx(() =>
@ -66,39 +67,164 @@ class _PerfectureWidgetState extends State<PerfectureWidget> {
color: Colors.deepPurpleAccent,
),
onChanged: (String? newValue) {
setState(() {
dropdownValue = newValue!;
print(newValue);
widget.homeController.loadLocationforPerf(newValue);
widget.homeController.loadSubPerfFor(newValue);
});
//setState(() {
if(newValue != null){
dropdownValue = newValue;
widget.indexController.populateForPerf(newValue, widget.mapController);
}
//});
},
items:getDropdownItems()),
items: getDropdownItems()
),
widget.homeController.subPerfs.length > 0 ?
widget.indexController.subPerfs.isNotEmpty ?
DropdownButton<String>(
value: widget.homeController.getSubInitialVal(),
value: widget.indexController.subDropdownValue,
icon: const Icon(Icons.arrow_downward),
elevation: 16,
style: const TextStyle(color: Colors.deepPurple),
hint: const Text("select"),
underline: Container(
height: 2,
color: Colors.deepPurpleAccent,
),
onChanged: (String? newValue) {
setState(() {
dropdownValue = newValue!;
print(newValue);
//widget.homeController.loadLocationforPerf(newValue);
if(newValue != null){
widget.indexController.populateForSubPerf(newValue, widget.mapController);
//widget.indexController.loadLocationforSubPerf(newValue, widget.mapController);
//widget.indexController.subDropdownValue = newValue;
}
});
},
items:getSubDropdownItems()) :
Text("--")
items:
getSubDropdownItems()
) :
const Text("")
],
)
),
);
}
}
// class PerfectureWidget extends StatefulWidget {
// HomeController homeController;
// MapController mapController;
// PerfectureWidget({required this.homeController, required this.mapController});
// @override
// State<PerfectureWidget> createState() => _PerfectureWidgetState();
// }
// class _PerfectureWidgetState extends State<PerfectureWidget> {
// String dropdownValue = "9";
// List<DropdownMenuItem<String>> getDropdownItems() {
// List<DropdownMenuItem<String>> dropDownItems = [];
// for (Map<String, dynamic> currency in widget.homeController.perfectures[0]) {
// //print(currency["id"].toString());
// var newDropdown = DropdownMenuItem(
// child: Text(currency["adm1_ja"].toString()),
// value: currency["id"].toString(),
// );
// dropDownItems.add(newDropdown);
// }
// return dropDownItems;
// }
// List<DropdownMenuItem<String>> getSubDropdownItems() {
// List<DropdownMenuItem<String>> dropDownItems = [];
// if(widget.homeController.subPerfs.length > 0){
// for (Map<String, dynamic> currency in widget.homeController.subPerfs[0]) {
// var newDropdown = DropdownMenuItem(
// child: Text(currency["adm2_ja"].toString()),
// value: currency["id"].toString(),
// );
// dropDownItems.add(newDropdown);
// }
// }
// return dropDownItems;
// }
// @override
// void initState() {
// super.initState();
// widget.homeController.loadSubPerfFor("9");
// widget.homeController.zoomtoMainPerf("9", widget.mapController);
// }
// @override
// Widget build(BuildContext context) {
// return Obx(() =>
// Row(
// children: [
// DropdownButton<String>(
// value: dropdownValue,
// icon: const Icon(Icons.arrow_downward),
// elevation: 16,
// style: const TextStyle(color: Colors.deepPurple),
// underline: Container(
// height: 2,
// color: Colors.deepPurpleAccent,
// ),
// onChanged: (String? newValue) {
// //setState(() {
// if(newValue != null){
// dropdownValue = newValue;
// widget.homeController.loadLocationforPerf(newValue, widget.mapController);
// widget.homeController.loadSubPerfFor(newValue);
// //SubDropdownValue = widget.homeController.getSubInitialVal();
// //widget.mapController.fitBounds(widget.homeController.currentBound[0]);
// widget.homeController.zoomtoMainPerf(newValue, widget.mapController);
// }
// //});
// },
// items: getDropdownItems()
// ),
// widget.homeController.subPerfs.length > 0 ?
// DropdownButton<String>(
// value: widget.homeController.SubDropdownValue,
// icon: const Icon(Icons.arrow_downward),
// elevation: 16,
// style: const TextStyle(color: Colors.deepPurple),
// hint: Container(
// child: Text("select"),
// ),
// underline: Container(
// height: 2,
// color: Colors.deepPurpleAccent,
// ),
// onChanged: (String? newValue) {
// //setState(() {
// if(newValue != null){
// widget.homeController.loadLocationforSubPerf(newValue, widget.mapController);
// widget.homeController.SubDropdownValue = newValue;
// widget.homeController.zoomtoSubPerf(newValue, widget.mapController);
// }
// //});
// },
// items:
// getSubDropdownItems()
// ) :
// Text("")
// ],
// ),
// );
// }
// }