Skip to content
Snippets Groups Projects
Commit 686b8d10 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Merge branch '12-add-refresh-button' into 'master'

Resolve "Add refresh button"

Closes #12

See merge request !12
parents 5fee6728 55e91013
Branches
Tags Release_0.0.11_11
1 merge request!12Resolve "Add refresh button"
Pipeline #4466 passed
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=0.0.10 app.versionName=0.0.11
app.versionCode=10 app.versionCode=11
Improve title bar, add refresh button.
Amélioration de la barre de titre, ajout d'un bouton de mise à jour.
...@@ -10,7 +10,9 @@ class ScrobblesApi { ...@@ -10,7 +10,9 @@ class ScrobblesApi {
static String baseUrl = 'https://scrobble.harrault.fr'; static String baseUrl = 'https://scrobble.harrault.fr';
static Future<StatisticsData> fetchStatistics() async { static Future<StatisticsData> fetchStatistics() async {
final response = await http.get(Uri.parse(baseUrl + '/stats')); final String url = baseUrl + '/stats';
print('fetching ' + url);
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
return StatisticsData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); return StatisticsData.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
...@@ -21,6 +23,7 @@ class ScrobblesApi { ...@@ -21,6 +23,7 @@ class ScrobblesApi {
static Future<TimelineData> fetchTimeline(int daysCount) async { static Future<TimelineData> fetchTimeline(int daysCount) async {
final String url = baseUrl + '/data/' + daysCount.toString() + '/timeline'; final String url = baseUrl + '/data/' + daysCount.toString() + '/timeline';
print('fetching ' + url);
final response = await http.get(Uri.parse(url)); final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
...@@ -32,6 +35,7 @@ class ScrobblesApi { ...@@ -32,6 +35,7 @@ class ScrobblesApi {
static Future<CountsByDayData> fetchCountsByDay(int daysCount) async { static Future<CountsByDayData> fetchCountsByDay(int daysCount) async {
final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-day'; final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-day';
print('fetching ' + url);
final response = await http.get(Uri.parse(url)); final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
...@@ -43,6 +47,7 @@ class ScrobblesApi { ...@@ -43,6 +47,7 @@ class ScrobblesApi {
static Future<CountsByHourData> fetchCountsByHour(int daysCount) async { static Future<CountsByHourData> fetchCountsByHour(int daysCount) async {
final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-hour'; final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-hour';
print('fetching ' + url);
final response = await http.get(Uri.parse(url)); final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../widgets/header.dart';
import '../widgets/main_screen/counts_by_day_card.dart'; import '../widgets/main_screen/counts_by_day_card.dart';
import '../widgets/main_screen/counts_by_hour_card.dart'; import '../widgets/main_screen/counts_by_hour_card.dart';
import '../widgets/main_screen/statistics_card.dart'; import '../widgets/main_screen/statistics_card.dart';
...@@ -17,7 +16,7 @@ class MainScreen extends StatelessWidget { ...@@ -17,7 +16,7 @@ class MainScreen extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
children: <Widget>[ children: <Widget>[
const Header(text: 'app_name'), const SizedBox(height: 90),
const StatisticsCard(), const StatisticsCard(),
const SizedBox(height: 8), const SizedBox(height: 8),
const ChartTimelineCard(), const ChartTimelineCard(),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'main_screen.dart'; import 'main_screen.dart';
import '../widgets/app_bar.dart';
class SkeletonScreen extends StatelessWidget { class SkeletonScreen extends StatefulWidget {
const SkeletonScreen({super.key}); const SkeletonScreen({super.key});
@override
State<SkeletonScreen> createState() => _SkeletonScreenState();
}
class _SkeletonScreenState extends State<SkeletonScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: StandardAppBar(notifyParent: refresh),
extendBodyBehindAppBar: true, extendBodyBehindAppBar: true,
body: MainScreen(), body: const MainScreen(),
backgroundColor: Theme.of(context).colorScheme.background, backgroundColor: Theme.of(context).colorScheme.background,
); );
} }
refresh() {
void rebuild(Element el) {
el.markNeedsBuild();
el.visitChildren(rebuild);
}
(context as Element).visitChildren(rebuild);
}
} }
import 'package:flutter/material.dart';
import 'package:unicons/unicons.dart';
import '../widgets/header.dart';
class StandardAppBar extends StatelessWidget implements PreferredSizeWidget {
final Function() notifyParent;
const StandardAppBar({super.key, required this.notifyParent});
@override
Widget build(BuildContext context) {
return AppBar(
title: const Header(text: 'app_name'),
actions: [
IconButton(
onPressed: () {
this.notifyParent();
},
icon: const Icon(UniconsSolid.refresh),
),
],
);
}
@override
Size get preferredSize => const Size.fromHeight(50);
}
...@@ -8,13 +8,10 @@ class Header extends StatelessWidget { ...@@ -8,13 +8,10 @@ class Header extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Text(
padding: const EdgeInsets.only(left: 2, right: 2, top: 48, bottom: 24),
child: Text(
tr(text), tr(text),
textAlign: TextAlign.start, textAlign: TextAlign.start,
style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2), style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
),
); );
} }
} }
...@@ -12,10 +12,10 @@ class StatisticsCard extends StatelessWidget { ...@@ -12,10 +12,10 @@ class StatisticsCard extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
late Future<StatisticsData> futureAlbum = ScrobblesApi.fetchStatistics(); late Future<StatisticsData> futureStatistics = ScrobblesApi.fetchStatistics();
return FutureBuilder<StatisticsData>( return FutureBuilder<StatisticsData>(
future: futureAlbum, future: futureStatistics,
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.hasError) { if (snapshot.hasError) {
return ShowErrorWidget(message: '${snapshot.error}'); return ShowErrorWidget(message: '${snapshot.error}');
......
...@@ -285,6 +285,14 @@ packages: ...@@ -285,6 +285,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.2" version: "1.3.2"
unicons:
dependency: "direct main"
description:
name: unicons
sha256: dbfcf93ff4d4ea19b324113857e358e4882115ab85db04417a4ba1c72b17a670
url: "https://pub.dev"
source: hosted
version: "2.1.1"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
......
...@@ -3,7 +3,7 @@ description: Display scrobbles data and charts ...@@ -3,7 +3,7 @@ description: Display scrobbles data and charts
publish_to: 'none' publish_to: 'none'
version: 0.0.10+10 version: 0.0.11+11
environment: environment:
sdk: '^3.0.0' sdk: '^3.0.0'
...@@ -15,6 +15,7 @@ dependencies: ...@@ -15,6 +15,7 @@ dependencies:
easy_localization: ^3.0.1 easy_localization: ^3.0.1
http: ^1.1.0 http: ^1.1.0
fl_chart: ^0.64.0 fl_chart: ^0.64.0
unicons: ^2.1.1
flutter: flutter:
uses-material-design: false uses-material-design: false
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment