rsflutterapp

Bahnhofsfoto-App for Android and iOS using Flutter
git clone git://archive.git.mtrnord.blog/MTRNord/rsflutterapp.git
Log | Files | Refs | README

commit 08dfeb9c7f5e16ac26212ae93e6de55a3de7c972
parent 92ec6c1c8b9750f0c8641176abc4e740669f17a8
Author: Marcel <mtrnord1@gmail.com>
Date:   Sun, 23 Feb 2020 18:39:45 +0100

Add Rankings

Took 44 minutes

Diffstat:
Mlib/repos/RailwayStationsApiClient.dart | 12++++++++++++
Mlib/repos/RailwayStationsRepository.dart | 12++++++++----
Mlib/views/HomePage.dart | 8+++++++-
Alib/views/tabs/rankingsTab.dart | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpubspec.lock | 9++++++++-
Mpubspec.yaml | 3+++
6 files changed, 98 insertions(+), 6 deletions(-)

diff --git a/lib/repos/RailwayStationsApiClient.dart b/lib/repos/RailwayStationsApiClient.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; +import 'package:grizzly_io/grizzly_io.dart'; import 'package:http/http.dart' as http; import 'package:meta/meta.dart'; @@ -43,4 +44,15 @@ class RailwayStationsApiClient { }); return stations; } + + Future<List<List<String>>> getScores() async { + final scoresUrl = '$baseUrl/photographers.txt'; + final scoresResponse = await this.httpClient.get(scoresUrl); + if (scoresResponse.statusCode != 200) { + throw Exception('error getting stations'); + } + + List<List<String>> scores = parseTsv(scoresResponse.body); + return scores; + } } diff --git a/lib/repos/RailwayStationsRepository.dart b/lib/repos/RailwayStationsRepository.dart @@ -9,11 +9,15 @@ class RailwayStationsRepository { RailwayStationsRepository({@required this.railwayStationsApiClient}) : assert(railwayStationsApiClient != null); - Future<List<Country>> getCountries() async { - return await railwayStationsApiClient.getCountries(); + Future<List<Country>> getCountries() { + return railwayStationsApiClient.getCountries(); } - Future<List<Station>> getStations() async { - return await railwayStationsApiClient.getStations(); + Future<List<Station>> getStations() { + return railwayStationsApiClient.getStations(); + } + + Future<List<List<String>>> getScores() { + return railwayStationsApiClient.getScores(); } } diff --git a/lib/views/HomePage.dart b/lib/views/HomePage.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:http/http.dart' as http; +import 'package:rs_flutter_app/views/tabs/rankingsTab.dart'; import '../blocs/MapBloc.dart'; import '../repos/RailwayStationsApiClient.dart'; @@ -60,7 +61,12 @@ class HomePage extends StatelessWidget { ), ), Scaffold( - body: Container(), + appBar: AppBar( + title: Text("Rangliste"), + ), + body: RankingsTab( + railwayStationsRepository: railwayStationsRepository, + ), ), Scaffold( appBar: AppBar( diff --git a/lib/views/tabs/rankingsTab.dart b/lib/views/tabs/rankingsTab.dart @@ -0,0 +1,60 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import '../../repos/repositories.dart'; + +class RankingsTab extends StatelessWidget { + final RailwayStationsRepository railwayStationsRepository; + + RankingsTab({@required this.railwayStationsRepository}) + : assert(railwayStationsRepository != null); + + Future<List<List<String>>> getScores() { + return this.railwayStationsRepository.getScores(); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: getScores(), + builder: + (BuildContext context, AsyncSnapshot<List<List<String>>> snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.done: + if (snapshot.hasError) { + // TODO handle error + debugPrint(snapshot.error.toString()); + } + if (snapshot.hasData) { + List<List<String>> scores = snapshot.data; + scores.removeAt(0); + scores.sort( + (a, b) => (int.parse(b.first)).compareTo(int.parse(a.first)), + ); + + return ListView.separated( + itemCount: scores.length, + separatorBuilder: (BuildContext context, int index) { + return Divider(); + }, + itemBuilder: (BuildContext context, int index) { + return ListTile( + leading: Text( + "${(index + 1)}.", + style: TextStyle( + fontWeight: FontWeight.bold, + ), + ), + title: Text(scores[index][1]), + ); + }, + ); + } + // TODO handle missing date + return Container(); + default: + return CircularProgressIndicator(); + } + }, + ); + } +} diff --git a/pubspec.lock b/pubspec.lock @@ -147,7 +147,7 @@ packages: source: hosted version: "3.2.0" flutter_cache_manager: - dependency: transitive + dependency: "direct main" description: name: flutter_cache_manager url: "https://pub.dartlang.org" @@ -201,6 +201,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + grizzly_io: + dependency: "direct main" + description: + name: grizzly_io + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" html: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml @@ -36,6 +36,9 @@ dependencies: settings_ui: ^0.2.0 + flutter_cache_manager: ^1.1.3 + grizzly_io: ^2.2.0 + dev_dependencies: flutter_test: sdk: flutter