Skip to content

Instantly share code, notes, and snippets.

@riccardopirani
Created March 24, 2020 08:25
Show Gist options
  • Save riccardopirani/0abf4c7cb2f5cf46a4abfbac17e6bddb to your computer and use it in GitHub Desktop.
Save riccardopirani/0abf4c7cb2f5cf46a4abfbac17e6bddb to your computer and use it in GitHub Desktop.
Model-View-Controller Flutter
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
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);
}
}
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