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

Improve title bar, add "refresh" button

parent 5fee6728
No related branches found
No related tags found
1 merge request!12Resolve "Add refresh button"
Pipeline #4463 passed
This commit is part of merge request !12. Comments created here will be created in the context of that merge request.
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), tr(text),
child: Text( textAlign: TextAlign.start,
tr(text), style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
textAlign: TextAlign.start,
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