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.
 
 
 
 
 
 

161 righe
5.5 KiB

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:http/http.dart' as http;
import 'package:idrocap/private/model/userList.dart';
import 'package:idrocap/utility/utility.dart';
import 'constant/globals.dart' as globals;
import 'profile_users.dart';
import 'widget/menu.dart';
class Users extends StatefulWidget {
const Users({Key? key}) : super(key: key);
@override
State<Users> createState() => _UsersState();
}
class _UsersState extends State<Users> {
late Future<List<UserList>> shows;
String searchString = "";
@override
void initState() {
super.initState();
shows = fetchShows();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
iconTheme: IconThemeData(color: Colors.white),
backgroundColor: HexColor(globals.colorAppbar),
title: Center(child: Text("Utenti", style: TextStyle(color: Colors.white))),
actions: [
IconButton(
onPressed: () {},
icon: Icon(Icons.notifications),
)
],
),
drawer: Menu(),
floatingActionButtonLocation: FloatingActionButtonLocation.miniEndFloat,
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
shows = fetchShows();
});
},
tooltip: 'refresh',
child: Icon(Icons.refresh, color: HexColor(globals.colorAppbar)),
backgroundColor: Colors.white,
),
body: SingleChildScrollView(
child: Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
child: TextField(
onChanged: (value) {
setState(() {
searchString = value.toLowerCase();
});
},
decoration: InputDecoration(labelText: 'Cerca Utente ', suffixIcon: Icon(Icons.search)),
),
),
FutureBuilder<List<UserList>>(
future: shows,
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return Center(child: CircularProgressIndicator());
}
if (snapshot.hasData) {
final filteredUsers = snapshot.data!.where((user) {
final lowerName = user.name.toLowerCase();
final lowerSurname = user.surname.toLowerCase();
final lowerSearchString = searchString.toLowerCase();
return lowerName.contains(lowerSearchString) || lowerSurname.contains(lowerSearchString);
}).toList();
if (filteredUsers.isEmpty) {
return Center(
child: Text('Nessun utente trovato'),
);
}
return ListView.separated(
physics: NeverScrollableScrollPhysics(),
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: filteredUsers.length,
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ProfileUser(
userList: filteredUsers[index],
),
),
);
},
child: ListTile(
leading: Icon(
Icons.account_circle_outlined,
size: 40,
color: Colors.blue,
),
title: Text('${filteredUsers[index].name} ${filteredUsers[index].surname}'),
),
);
},
separatorBuilder: (BuildContext context, int index) {
return Divider();
},
);
}
if (snapshot.hasError) {
return Center(
child: Text('Errore: ${snapshot.error}'),
);
}
return Center(child: CircularProgressIndicator());
},
),
],
),
),
);
}
Future<List<UserList>> fetchShows() async {
try {
var url = Uri.parse(globals.url_endpoint + globals.listaUtenti);
var response = await http.get(url, headers: globals.headers);
var data = json.decode(utf8.decode(response.bodyBytes));
if (response.statusCode == 200) {
var usersJson = (data['users'] as List).cast<Map<String, dynamic>>();
return usersJson.map((user) => UserList.fromJson(user)).toList();
} else if (response.statusCode == 401) {
Utility().dialogAlert(context);
return []; // Restituire una lista vuota per gestire l'errore
} else {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(data['result'].toString())));
return []; // Restituire una lista vuota per gestire l'errore
}
} catch (e) {
EasyLoading.dismiss();
throw Exception('Problemi nel caricare i dati: $e');
}
}
}