Created
March 24, 2020 08:25
-
-
Save riccardopirani/0abf4c7cb2f5cf46a4abfbac17e6bddb to your computer and use it in GitHub Desktop.
Model-View-Controller Flutter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:MyApp/Model/Cantiere.dart'; | |
import 'package:MyApp/Model/Ristorante.dart'; | |
import 'package:MyApp/Model/Utente.dart'; | |
import 'Api.dart'; | |
import 'dart:convert'; | |
//Classe che rapprresenta il controller del Ristorante | |
class RistoranteController { | |
//Costruttore | |
RistoranteController(); | |
//Funzione che carica i ristoranti presenti in un cantiere | |
static Future<List<Ristorante>> carica(Cantiere c) async { | |
print("Sono nella funzione che carica i ristoranti per il cantiere: " +c.getIdCantiere().toString()); | |
var ret; | |
Map map = {'IdCantiere': c.getIdCantiere()}; | |
String value = await apiRequest("/ristoranti/carica", map); | |
ret = json.decode(value); | |
print("Json letto"); | |
return (ret as Iterable<dynamic> ?? const <dynamic>[]) | |
.map((dynamic jsonObject) => Ristorante( | |
c, | |
jsonObject["IdRistorante"] as String, | |
jsonObject["Costo"] as double, | |
jsonObject["DataInserimento"] as String, | |
jsonObject["ExtraPreventivo"] as int, | |
jsonObject["RagioneSociale"] as String, | |
new Utente.setIdUtente(jsonObject["IdUtenteInserimento"] as int), | |
jsonObject["Data"] as String, | |
jsonObject["InseritoDA"] as String | |
)) | |
.toList(); | |
} | |
//Funzione che si occupa di inserire un ristorante all'interno di un cantiere | |
static Future<bool> inserisci(Cantiere c, Utente u, String ragioneSociale, | |
double costo, String data, int extraPreventivo) async { | |
var ret; | |
Map map = { | |
'IdCantiere': c.getIdCantiere(), | |
'ExtraPreventivo': extraPreventivo, | |
'Data': data, | |
'RagioneSociale': ragioneSociale, | |
'Costo': costo, | |
'IdUtenteInserimento': u.GetIdUtente(), | |
}; | |
print(map); | |
String value = await apiRequest("/ristoranti/inserimento", map); | |
ret = json.decode(value); | |
return ret; | |
} | |
} | |
MyApp |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:async'; | |
import 'dart:ffi'; | |
import 'package:MyApp/Controller/RistoranteController.dart'; | |
import 'Cantiere.dart'; | |
import 'Utente.dart'; | |
//Classe che rappresenta il cantiere | |
class Ristorante { | |
//Costruttore principale | |
Ristorante( | |
this._c, | |
this._idRistorante, | |
this._costo, | |
this._dataInserimento, | |
this._extraPreventivo, | |
this._ragioneSociale, | |
this._u, | |
this._data, | |
this._inseritoDa); | |
//Costruttore per inserimento di un nuovo ristorante | |
Ristorante.perInserimento( | |
this._c, | |
this._idRistorante, | |
this._costo, | |
this._dataInserimento, | |
this._extraPreventivo, | |
this._ragioneSociale, | |
this._u, | |
); | |
//Costruttore | |
Ristorante.setCantiere(this._c); | |
//Classe che rappresenta il Cantiere | |
Cantiere _c; | |
//Costo del cantiere | |
double _costo; | |
int _extraPreventivo; | |
//Variabili del cantiere | |
String _idRistorante, | |
_descrizioneEstesa, | |
_dataInserimento, | |
_data, | |
_ragioneSociale, | |
_inseritoDa; | |
//Classe che rappresenta l'utente | |
Utente _u; | |
//Funzione per la ricerca dei ristoranti | |
static Future<List<Ristorante>> ricerca(Cantiere c) async { | |
return await RistoranteController.carica(c); | |
} | |
//Recupero la ragione sociale del ristorante | |
String getRagioneSociale() { | |
return this._ragioneSociale; | |
} | |
//Recupero la descrizione | |
String getDescrizione() { | |
return this._descrizioneEstesa; | |
} | |
//Recupero il costo del ristorante | |
double getCosto() { | |
return this._costo; | |
} | |
//Inserimento del ristorante all'interno del cantiere | |
Future<bool> inserimento() { | |
return RistoranteController.inserisci( | |
_c, _u, _ragioneSociale, _costo, _dataInserimento, _extraPreventivo); | |
} | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:intl/intl.dart'; | |
import 'package:nice_button/NiceButton.dart'; | |
import 'package:MyApp/Model/Cantiere.dart'; | |
import 'package:MyApp/Model/RistoranteModel.dart'; | |
import 'package:MyApp/Model/Utente.dart'; | |
import 'package:MyApp/View/Home_theme.dart'; | |
import 'package:MyApp/utils/support.dart'; | |
import 'package:rflutter_alert/rflutter_alert.dart'; | |
//Variabile che rappresenta il cantiere | |
Cantiere c; | |
//Lista dei ristoranti presenti all'interno del cantiere che si sta visualizzando | |
List<Ristorante> listaRistoranti; | |
//Valori salvati corrispondenti al ristorante | |
String ragioneSociale; | |
double costo = 0; | |
int extraPreventivo = 0; | |
String data = DateFormat('dd-MM-yyyy').format(DateTime.now()); | |
var firstColor = Color(0xff5b86e5), secondColor = Color(0xff36d1dc); | |
final dateFormat = DateFormat("EEEE, MMMM d, yyyy 'at' h:mma"); | |
final timeFormat = DateFormat("h:mm a"); | |
final format = DateFormat("dd-MM-yyyy"); | |
DateTime date; | |
TimeOfDay time; | |
//Funzione che si occupa dell'inserimento del ristorante all'interno del cantiere | |
Future<bool> inserimento(BuildContext context) async { | |
//Estrapolo i valori per inizializzare l'utente | |
var email = await Storage.leggi("Email"); | |
var password = await Storage.leggi("Password"); | |
var idutente = int.parse(await Storage.leggi("IdUtente")); | |
//Inizializzo l'utente | |
Utente utemp = new Utente.init(idutente, email, password); | |
//Vara data temporanea | |
//Inizalizzo la variabile del ristorante | |
Ristorante rp = new Ristorante.perInserimento( | |
c, "0", costo, data, extraPreventivo, ragioneSociale, utemp); | |
//Procedo con l'inserimento del ristorante | |
bool ris = await rp.inserimento(); | |
//Se il valore di ris è false visualizzo un messaggio di errore | |
if (ris == false) { | |
Alert(context: context, title: "Errore", desc: "Inserimento non riuscito") | |
.show(); | |
} | |
} | |
//Implementazione dell HexColor | |
Color hexToColor(String code) { | |
return new Color(int.parse(code.substring(1, 7), radix: 16) + 0xFF000000); | |
} | |
//Funzione che permette di salvare il valore tempaneo della data | |
DateTime setData(String datapassing) { | |
print("Sono in setData con valore: " + datapassing); | |
data = datapassing; | |
return DateTime.now(); | |
} | |
//Classe che rappresenta la view del ristorante | |
class RistorantePage extends StatelessWidget { | |
//Costruttore | |
RistorantePage(this.ctemp); | |
//Oggetto che rappresenta il cantiere | |
final Cantiere ctemp; | |
//Creazione della lista dei ristoranti | |
Widget setUi(BuildContext context) { | |
return Padding( | |
padding: EdgeInsets.all(40.0), | |
child: new Container( | |
child: new Center( | |
child: new Column(children: [ | |
new Padding(padding: EdgeInsets.only(top: 40.0)), | |
new Text( | |
'Ristoranti', | |
style: new TextStyle(color: hexToColor("#000000"), fontSize: 25.0), | |
), | |
//Inserimento del textfield della ragione sociale | |
new Padding(padding: EdgeInsets.only(top: 30.0)), | |
new TextFormField( | |
decoration: new InputDecoration( | |
labelText: "Inserisci Ragione Sociale", | |
fillColor: Colors.white, | |
border: new OutlineInputBorder( | |
borderRadius: new BorderRadius.circular(25.0), | |
borderSide: new BorderSide(), | |
), | |
//fillColor: Colors.green | |
), | |
validator: (val) { | |
if (val.length == 0) { | |
print("La ragione sociale non può essere vuota"); | |
} else { | |
ragioneSociale = val; | |
} | |
}, | |
onChanged: (val) { | |
ragioneSociale = val; | |
}, | |
keyboardType: TextInputType.emailAddress, | |
style: new TextStyle( | |
fontFamily: "Poppins", | |
), | |
), | |
//Inserimento del Costo | |
new Padding(padding: EdgeInsets.only(top: 30.0)), | |
new TextFormField( | |
decoration: new InputDecoration( | |
labelText: "Inserisci il costo", | |
fillColor: Colors.white, | |
border: new OutlineInputBorder( | |
borderRadius: new BorderRadius.circular(25.0), | |
borderSide: new BorderSide(), | |
), | |
), | |
validator: (val) { | |
if (val.length == 0 && Verifica.verificaDouble(val.toString())) { | |
print("Attenzione campo costo non corretto"); | |
} | |
}, | |
onChanged: (val) { | |
costo = double.parse(val); | |
}, | |
keyboardType: TextInputType.emailAddress, | |
style: new TextStyle( | |
fontFamily: "Poppins", | |
), | |
), | |
new Padding(padding: EdgeInsets.only(top: 30.0)), | |
//inserimento della data | |
new DateTimeField( | |
decoration: new InputDecoration(labelText: data), | |
format: format, | |
onShowPicker: (context, currentValue) { | |
return showDatePicker( | |
context: context, | |
firstDate: DateTime(1900), | |
initialDate: currentValue, | |
lastDate: DateTime(2100)); | |
}, | |
), | |
new Padding(padding: EdgeInsets.only(top: 40.0)), | |
//Bottone per l'inserimento | |
new NiceButton( | |
radius: 40, | |
padding: const EdgeInsets.all(15), | |
text: "Inserisci", | |
icon: Icons.account_box, | |
gradientColors: [secondColor, firstColor], | |
onPressed: () { | |
if (data != null && | |
ragioneSociale != null && | |
ragioneSociale.length > 0 && | |
costo != null) { | |
print("Procedo con l'inserimento"); | |
inserimento(context); | |
} else { | |
Alert( | |
context: context, | |
title: "Errore", | |
desc: "Compila tutti i campi") | |
.show(); | |
} | |
}), | |
new Padding(padding: EdgeInsets.only(top: 40.0)), | |
])))); | |
} | |
//Widget che inserisce dello spazio fra altri widget | |
Widget getSpace() { | |
return SizedBox(height: 10); | |
} | |
//Questa funzione si occupa di caricare i ristornati presenti nel cantiere | |
Future<List<Ristorante>> caricamentoRistoranti() async { | |
c = ctemp; | |
print("Sono nella fuzione che si occupa di caricare i ristoranti"); | |
listaRistoranti = await Ristorante.ricerca(ctemp); | |
print("Ristoranti caricati: " + listaRistoranti.length.toString()); | |
return listaRistoranti; | |
} | |
//Il Widget recupera la lista dei ristoranti | |
Widget getListaRistoranti() { | |
return Scaffold( | |
body: ListView( | |
children: <Widget>[ | |
Text(listaRistoranti[0].getRagioneSociale()), | |
Text(listaRistoranti[0].getDescrizione()) | |
], | |
)); | |
} | |
/*RistorantesList(<RistoranteModal>[ | |
//Clica di for che stampa di i valori | |
for (int i = 0; i < listaRistoranti.length; i++) | |
{ | |
new RistoranteListItem( | |
new RistoranteModal( | |
ragioneSociale: listaRistoranti[i].getRagioneSociale(), | |
descrizione: listaRistoranti[i].getDescrizione() | |
), | |
), | |
} | |
]),*/ | |
//Widget che eseguo il build dello schermo | |
@override | |
Widget build(BuildContext context) { | |
return FutureBuilder<List<Ristorante>>( | |
future: caricamentoRistoranti(), | |
builder: | |
(BuildContext context, AsyncSnapshot<List<Ristorante>> snapshot) { | |
if (snapshot.data == null) { | |
print("Errore valori non caricati"); | |
return Container( | |
color: TemaApp.background, | |
child: Scaffold( | |
backgroundColor: Colors.transparent, | |
body: Stack( | |
children: <Widget>[ | |
getSpace(), | |
getSpace(), | |
setUi(context), | |
SizedBox( | |
height: MediaQuery.of(context).padding.bottom, | |
), | |
], | |
), | |
), | |
); | |
} else { | |
return Container( | |
color: TemaApp.background, | |
child: Scaffold( | |
backgroundColor: Colors.transparent, | |
body: Stack( | |
children: <Widget>[ | |
getSpace(), | |
getSpace(), | |
setUi(context), | |
SizedBox( | |
height: MediaQuery.of(context).padding.bottom, | |
), | |
getListaRistoranti(), | |
], | |
), | |
), | |
); | |
} | |
}, | |
); | |
} | |
} | |
MyApp |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment