Non puoi selezionare più di 25 argomenti
Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
441 righe
19 KiB
441 righe
19 KiB
import 'package:flutter/material.dart'; |
|
import 'package:flutter_map/flutter_map.dart'; |
|
import 'package:flutter_map_marker_cluster/flutter_map_marker_cluster.dart'; |
|
import 'package:hexcolor/hexcolor.dart'; |
|
import 'package:idrocap/private/model/organizzazioni.dart'; |
|
import 'package:idrocap/private/notifiche.dart'; |
|
import 'package:latlong2/latlong.dart'; |
|
|
|
import '../utility/utility.dart'; |
|
import 'constant/globals.dart' as globals; |
|
import 'widget/menu.dart'; |
|
|
|
class ProfileOrganisations extends StatefulWidget { |
|
final Organizzazioni organizzazioni; |
|
|
|
ProfileOrganisations({super.key, required this.organizzazioni}); |
|
|
|
@override |
|
State<ProfileOrganisations> createState() => _ProfileOrganisationsState(); |
|
} |
|
|
|
class _ProfileOrganisationsState extends State<ProfileOrganisations> { |
|
String searchString = ""; |
|
List<Marker> _markers = []; |
|
String split = ""; |
|
late String latitude; |
|
late String longitude; |
|
|
|
@override |
|
void initState() { |
|
var split; |
|
split = widget.organizzazioni.coordinates.split(" "); |
|
|
|
this.latitude = split[1]; |
|
this.longitude = split[0]; |
|
|
|
_markers = [ |
|
Marker( |
|
point: LatLng(double.parse(latitude), double.parse(longitude)), |
|
width: 100, |
|
height: 100, |
|
child: Wrap( |
|
children: [ |
|
Icon( |
|
Icons.pin_drop, |
|
size: 60, |
|
color: Colors.blueAccent, |
|
), |
|
Text(""), |
|
], |
|
), |
|
), |
|
]; |
|
|
|
super.initState(); |
|
} |
|
|
|
@override |
|
Widget build(BuildContext context) { |
|
return PopScope( |
|
canPop: true, |
|
child: Scaffold( |
|
appBar: AppBar( |
|
leading: InkWell( |
|
onTap: () { |
|
Navigator.pop(context); |
|
}, |
|
child: Icon( |
|
Icons.arrow_back_ios, |
|
color: Colors.white, |
|
), |
|
), |
|
iconTheme: IconThemeData(color: Colors.white), |
|
backgroundColor: HexColor(globals.colorAppbar), |
|
title: Center( |
|
child: Text( |
|
"Organizzazioni", |
|
style: TextStyle(color: Colors.white), |
|
), |
|
), |
|
actions: [ |
|
IconButton( |
|
onPressed: () { |
|
Navigator.push(context, |
|
MaterialPageRoute(builder: (context) => Notifiche())); |
|
}, |
|
icon: Icon(Icons.notifications), |
|
) |
|
], |
|
), |
|
drawer: Menu(), |
|
body: ListView( |
|
children: [ |
|
Padding( |
|
padding: EdgeInsets.all(5), |
|
child: Container( |
|
color: HexColor(globals.coloreCardProfili), |
|
child: Wrap(children: [ |
|
ListTile( |
|
leading: Icon( |
|
Icons.account_circle_outlined, |
|
size: 50, |
|
color: Colors.white, |
|
), |
|
title: Wrap( |
|
children: [ |
|
Text(widget.organizzazioni.actor.description, |
|
style: TextStyle(color: Colors.white)), |
|
], |
|
), |
|
subtitle: Wrap( |
|
children: [ |
|
Text( |
|
widget.organizzazioni.acronym + |
|
" - " + |
|
widget.organizzazioni.organisation_type |
|
.description, |
|
style: TextStyle(color: Colors.white), |
|
), |
|
], |
|
), |
|
), |
|
])), |
|
), |
|
Padding( |
|
padding: EdgeInsets.all(5), |
|
child: Card( |
|
elevation: 20, |
|
child: Column( |
|
children: [ |
|
Container( |
|
decoration: BoxDecoration( |
|
borderRadius: BorderRadius.only( |
|
topRight: Radius.circular(10), |
|
topLeft: Radius.circular(10)), |
|
color: HexColor(globals.colorAppbar), |
|
), |
|
child: ListTile( |
|
title: Wrap( |
|
children: [ |
|
Text( |
|
"Contatti disponibili", |
|
style: TextStyle( |
|
color: Colors.white, fontSize: 20), |
|
) |
|
], |
|
), |
|
), |
|
), |
|
Container( |
|
decoration: BoxDecoration( |
|
color: Colors.white, |
|
borderRadius: BorderRadius.only( |
|
bottomLeft: Radius.circular(10), |
|
bottomRight: Radius.circular(10)), |
|
), |
|
child: Padding( |
|
padding: EdgeInsets.all(15), |
|
child: Column( |
|
children: [ |
|
if (widget.organizzazioni.district.isNotEmpty) |
|
Align( |
|
alignment: Alignment.topLeft, |
|
child: Wrap( |
|
alignment: WrapAlignment.start, |
|
children: [ |
|
Text( |
|
"Comune: ", |
|
style: TextStyle( |
|
fontWeight: FontWeight.bold), |
|
), |
|
Text(widget.organizzazioni.district), |
|
], |
|
), |
|
), |
|
if (widget.organizzazioni.province.isNotEmpty) |
|
Align( |
|
alignment: Alignment.topLeft, |
|
child: Wrap( |
|
children: [ |
|
Text( |
|
"Provincia: ", |
|
style: TextStyle( |
|
fontWeight: FontWeight.bold), |
|
), |
|
Text( |
|
widget.organizzazioni.province, |
|
), |
|
], |
|
), |
|
), |
|
if (widget.organizzazioni.address.isNotEmpty) |
|
Align( |
|
alignment: Alignment.topLeft, |
|
child: Wrap( |
|
alignment: WrapAlignment.start, |
|
children: [ |
|
Text( |
|
"Indirizzo: ", |
|
style: TextStyle( |
|
fontWeight: FontWeight.bold), |
|
), |
|
Text(widget.organizzazioni.address), |
|
], |
|
), |
|
), |
|
if (widget.organizzazioni.cap.isNotEmpty) |
|
Align( |
|
alignment: Alignment.topLeft, |
|
child: Wrap( |
|
alignment: WrapAlignment.start, |
|
children: [ |
|
Text( |
|
"Cap: ", |
|
style: TextStyle( |
|
fontWeight: FontWeight.bold), |
|
), |
|
Text(widget.organizzazioni.cap), |
|
], |
|
), |
|
), |
|
/* if (widget.organizzazioni.coordinates.isNotEmpty) |
|
Align( |
|
alignment: Alignment.center, |
|
child: Wrap( |
|
children: [ |
|
TextButton.icon( |
|
icon: Icon(Icons.pin_drop_outlined), |
|
onPressed: () { |
|
var test = widget |
|
.organizzazioni.coordinates |
|
.split(" "); |
|
|
|
Utility.viewToMaps(test[0], test[1]); |
|
}, |
|
label: Text("Guarda su mappa"), |
|
) |
|
], |
|
), |
|
), */ |
|
Divider(), |
|
if (widget.organizzazioni.phones.length > 0 || |
|
widget.organizzazioni.mobile_phones.length > |
|
0) |
|
Row( |
|
children: [ |
|
Text( |
|
"Numeri di telefono", |
|
style: TextStyle( |
|
fontWeight: FontWeight.bold, |
|
fontSize: 18), |
|
), |
|
], |
|
), |
|
if (widget.organizzazioni.phones.length > 0 || |
|
widget.organizzazioni.mobile_phones.length > |
|
0) |
|
SizedBox( |
|
height: 20, |
|
), |
|
for (int i = 0; |
|
i < widget.organizzazioni.phones.length; |
|
i++) |
|
Container( |
|
child: Column( |
|
children: [ |
|
Row( |
|
children: [ |
|
Text(widget.organizzazioni.phones[i] |
|
['type']), |
|
], |
|
), |
|
Row( |
|
mainAxisAlignment: |
|
MainAxisAlignment.spaceBetween, |
|
children: [ |
|
Text(widget.organizzazioni.phones[i] |
|
['value']), |
|
IconButton( |
|
icon: Icon(Icons.phone), |
|
color: Colors.green, |
|
onPressed: () async { |
|
await Utility.makePhoneCall(widget |
|
.organizzazioni |
|
.phones[i]['value']); |
|
}, |
|
) |
|
], |
|
), |
|
Divider(), |
|
], |
|
), |
|
), |
|
for (int i = 0; |
|
i < |
|
widget |
|
.organizzazioni.mobile_phones.length; |
|
i++) |
|
Container( |
|
child: Column( |
|
children: [ |
|
Row( |
|
children: [ |
|
Text(widget.organizzazioni |
|
.mobile_phones[i]['type']), |
|
], |
|
), |
|
Row( |
|
mainAxisAlignment: |
|
MainAxisAlignment.spaceBetween, |
|
children: [ |
|
Text(widget.organizzazioni |
|
.mobile_phones[i]['value']), |
|
IconButton( |
|
icon: Icon(Icons.phone), |
|
color: Colors.green, |
|
onPressed: () async { |
|
await Utility.makePhoneCall(widget |
|
.organizzazioni |
|
.mobile_phones[i]['value']); |
|
}, |
|
) |
|
], |
|
), |
|
Divider(), |
|
], |
|
), |
|
), |
|
if (widget.organizzazioni.phones.length > 0 || |
|
widget.organizzazioni.mobile_phones.length > |
|
0) |
|
SizedBox( |
|
height: 20, |
|
), |
|
if (widget.organizzazioni.emails.length > 0) |
|
Row( |
|
children: [ |
|
Text( |
|
"E-mail", |
|
style: TextStyle( |
|
fontWeight: FontWeight.bold, |
|
fontSize: 18), |
|
), |
|
], |
|
), |
|
if (widget.organizzazioni.emails.length > 0) |
|
SizedBox( |
|
height: 20, |
|
), |
|
for (int i = 0; |
|
i < widget.organizzazioni.emails.length; |
|
i++) |
|
Container( |
|
child: Column( |
|
children: [ |
|
Row( |
|
children: [ |
|
Text(widget.organizzazioni.emails[i] |
|
['type']), |
|
], |
|
), |
|
Row( |
|
mainAxisAlignment: |
|
MainAxisAlignment.spaceBetween, |
|
children: [ |
|
Text(widget.organizzazioni.emails[i] |
|
['value']), |
|
IconButton( |
|
icon: Icon(Icons.email), |
|
color: Colors.red, |
|
onPressed: () async { |
|
await Utility.makeEmail(widget |
|
.organizzazioni |
|
.emails[i]['value']); |
|
}, |
|
) |
|
], |
|
), |
|
Divider(), |
|
], |
|
), |
|
), |
|
], |
|
), |
|
), |
|
), |
|
], |
|
)), |
|
), |
|
if (widget.organizzazioni.coordinates.isNotEmpty) |
|
Container( |
|
height: 250.0, |
|
padding: EdgeInsets.all(5), |
|
child: FlutterMap( |
|
options: MapOptions( |
|
initialCenter: |
|
LatLng(double.parse(latitude), double.parse(longitude)), |
|
minZoom: 11, |
|
maxZoom: 16, |
|
interactionOptions: InteractionOptions( |
|
flags: InteractiveFlag.pinchZoom | InteractiveFlag.drag, |
|
), |
|
backgroundColor: Colors.black, |
|
), |
|
children: [ |
|
TileLayer( |
|
urlTemplate: |
|
'https://tile.openstreetmap.org/{z}/{x}/{y}.png', |
|
minZoom: 11, |
|
maxZoom: 16, |
|
subdomains: ['a', 'b', 'c'], |
|
), |
|
MarkerClusterLayerWidget( |
|
options: MarkerClusterLayerOptions( |
|
maxClusterRadius: 45, |
|
// size: Size(40, 40), |
|
markers: _markers, |
|
builder: (context, markers) { |
|
return Container( |
|
decoration: BoxDecoration( |
|
borderRadius: BorderRadius.circular(20), |
|
color: Colors.blue), |
|
child: Center( |
|
child: Text( |
|
markers.length.toString(), |
|
style: TextStyle(color: Colors.white), |
|
), |
|
), |
|
); |
|
}, |
|
), |
|
), |
|
], |
|
), |
|
), |
|
], |
|
), |
|
), |
|
); |
|
} |
|
}
|
|
|