226 lines
7.4 KiB
Dart
226 lines
7.4 KiB
Dart
// ignore_for_file: prefer_const_constructors, prefer_const_literals_to_create_immutables, file_names, use_build_context_synchronously, library_private_types_in_public_api
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'dart:async';
|
|
import 'dart:convert';
|
|
import 'package:http/http.dart' as http;
|
|
|
|
class LBwithoutMeny extends StatefulWidget {
|
|
const LBwithoutMeny({super.key});
|
|
|
|
@override
|
|
_LBwithoutMenyState createState() => _LBwithoutMenyState();
|
|
}
|
|
|
|
class _LBwithoutMenyState extends State<LBwithoutMeny> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
var futureBuilder = FutureBuilder(
|
|
future: _getLeaderboard(),
|
|
builder: (BuildContext context, AsyncSnapshot snapshot) {
|
|
switch (snapshot.connectionState) {
|
|
case ConnectionState.none:
|
|
return Text('connectionstate none');
|
|
case ConnectionState.waiting:
|
|
return _emptyCreateTab(context, snapshot);
|
|
default:
|
|
if (snapshot.hasError) {
|
|
return Text('snapshot error ${snapshot.error.toString()}');
|
|
} else if (snapshot.hasData) {
|
|
return _createTab(context, snapshot);
|
|
} else {
|
|
return Text('snapshot null');
|
|
}
|
|
}
|
|
},
|
|
);
|
|
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
centerTitle: true,
|
|
title: Image.asset(
|
|
'assets/images/ml_logo.png',
|
|
height: 40,
|
|
),
|
|
),
|
|
body: futureBuilder);
|
|
}
|
|
|
|
Widget _createTab(BuildContext context, AsyncSnapshot snapshot) {
|
|
List<dynamic> items = snapshot.data;
|
|
return ListView.separated(
|
|
padding: const EdgeInsets.all(8),
|
|
itemCount: items.length + 1,
|
|
itemBuilder: (BuildContext context, int index) {
|
|
if (index == 0) {
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
color: Colors.blueGrey,
|
|
borderRadius: BorderRadius.all(Radius.circular(10))),
|
|
padding: const EdgeInsets.all(8),
|
|
height: 40,
|
|
child: Row(
|
|
textDirection: TextDirection.ltr,
|
|
children: <Widget>[
|
|
Padding(
|
|
padding: const EdgeInsets.only(left: 8),
|
|
child: Text(
|
|
'Plats',
|
|
style: TextStyle(
|
|
fontSize: 15,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.amber),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Text(
|
|
'Lag',
|
|
textAlign: TextAlign.center,
|
|
style: TextStyle(
|
|
fontSize: 15,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.amber),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.only(right: 10),
|
|
child: Text(
|
|
'Poäng',
|
|
style: TextStyle(
|
|
fontSize: 15,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.amber),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
} else {
|
|
String str = items[index - 1].toString();
|
|
int schoolIndex = str.indexOf('school: ');
|
|
int instIndex = str.indexOf('institution: ');
|
|
int instIndexEnd = str.indexOf('activities: [');
|
|
int pointsIndex = str.indexOf('points: ');
|
|
int pointsEndIndex = str.length - 1;
|
|
String skola =
|
|
'${str.substring(schoolIndex + 8, instIndex - 2).toUpperCase()}: ';
|
|
skola += str.substring(instIndex + 13, instIndexEnd - 2);
|
|
String points = str.substring(pointsIndex + 8, pointsEndIndex);
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
color: Colors.blue,
|
|
borderRadius: BorderRadius.all(Radius.circular(10))),
|
|
padding: const EdgeInsets.all(8),
|
|
height: 60,
|
|
child: Row(
|
|
textDirection: TextDirection.ltr,
|
|
children: <Widget>[
|
|
Padding(
|
|
padding: const EdgeInsets.only(right: 20.0, left: 10.0),
|
|
child: Text(
|
|
'$index',
|
|
textAlign: TextAlign.right,
|
|
style: TextStyle(
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.amber),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Text(
|
|
skola,
|
|
textAlign: TextAlign.center,
|
|
style: TextStyle(
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.white),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.only(left: 15.0, right: 12.0),
|
|
child: Text(
|
|
points,
|
|
textAlign: TextAlign.left,
|
|
style: TextStyle(
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.amber),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
},
|
|
separatorBuilder: (BuildContext context, int index) => const Divider(),
|
|
);
|
|
}
|
|
|
|
Widget _emptyCreateTab(BuildContext context, AsyncSnapshot snapshot) {
|
|
return Column(
|
|
children: [
|
|
Container(
|
|
decoration: BoxDecoration(
|
|
color: Colors.blueGrey,
|
|
borderRadius: BorderRadius.all(Radius.circular(10))),
|
|
padding: const EdgeInsets.all(8),
|
|
height: 40,
|
|
child: Row(
|
|
textDirection: TextDirection.ltr,
|
|
children: <Widget>[
|
|
Padding(
|
|
padding: const EdgeInsets.only(left: 8),
|
|
child: Text(
|
|
'Plats',
|
|
style: TextStyle(
|
|
fontSize: 15,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.amber),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Text(
|
|
'Lag',
|
|
textAlign: TextAlign.center,
|
|
style: TextStyle(
|
|
fontSize: 15,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.amber),
|
|
),
|
|
),
|
|
Padding(
|
|
padding: const EdgeInsets.only(right: 10),
|
|
child: Text(
|
|
'Poäng',
|
|
style: TextStyle(
|
|
fontSize: 15,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.amber),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: 220,
|
|
),
|
|
CircularProgressIndicator()
|
|
],
|
|
);
|
|
}
|
|
|
|
Future<List> _getLeaderboard() async {
|
|
var response = await http
|
|
.get(Uri.parse('https://group-15-3.pvt.dsv.su.se/leaderboard'));
|
|
if (response.statusCode == 200) {
|
|
// If the server did return a 200 OK response,
|
|
// then parse the JSON.
|
|
return jsonDecode(utf8.decode(response.bodyBytes)) as List<dynamic>;
|
|
} else {
|
|
// If the server did not return a 200 OK response,
|
|
// then throw an exception.
|
|
throw Exception();
|
|
}
|
|
}
|
|
}
|