Skip to content

Commit aa62c27

Browse files
committed
Add refresh indicators to the entry lists
This allows the user to manually trigger an update if desired See wger-project/wger/issues/1253
1 parent aae6632 commit aa62c27

File tree

9 files changed

+322
-307
lines changed

9 files changed

+322
-307
lines changed

lib/providers/gallery.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class GalleryProvider extends WgerBaseProvider with ChangeNotifier {
4747
Future<void> fetchAndSetGallery() async {
4848
final data = await fetch(makeUrl(_galleryUrlPath));
4949

50+
images = [];
5051
data['results'].forEach((e) {
5152
final gallery.Image image = gallery.Image.fromJson(e);
5253
images.add(image);

lib/providers/nutrition.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class NutritionPlansProvider extends WgerBaseProvider with ChangeNotifier {
8989
/// object itself and no child attributes
9090
Future<void> fetchAndSetAllPlansSparse() async {
9191
final data = await fetch(makeUrl(_nutritionalPlansPath, query: {'limit': '1000'}));
92+
_plans = [];
9293
for (final planData in data['results']) {
9394
final plan = NutritionalPlan.fromJson(planData);
9495
_plans.add(plan);

lib/providers/workout_plans.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ class WorkoutPlansProvider extends WgerBaseProvider with ChangeNotifier {
148148
/// object itself and no child attributes
149149
Future<void> fetchAndSetAllPlansSparse() async {
150150
final data = await fetch(makeUrl(_workoutPlansUrlPath, query: {'limit': '1000'}));
151+
_workoutPlans = [];
151152
for (final workoutPlanData in data['results']) {
152153
final plan = WorkoutPlan.fromJson(workoutPlanData);
153154
_workoutPlans.add(plan);

lib/screens/home_tabs_screen.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,9 @@ class _HomeTabsScreenState extends State<HomeTabsScreen> with SingleTickerProvid
7272

7373
/// Load initial data from the server
7474
Future<void> _loadEntries() async {
75-
if (!Provider.of<AuthProvider>(context, listen: false).dataInit) {
76-
final authProvider = context.read<AuthProvider>();
75+
final authProvider = context.read<AuthProvider>();
76+
77+
if (!authProvider.dataInit) {
7778
final workoutPlansProvider = context.read<WorkoutPlansProvider>();
7879
final nutritionPlansProvider = context.read<NutritionPlansProvider>();
7980
final exercisesProvider = context.read<ExercisesProvider>();
@@ -118,7 +119,7 @@ class _HomeTabsScreenState extends State<HomeTabsScreen> with SingleTickerProvid
118119
}
119120
}
120121

121-
context.read<AuthProvider>().dataInit = true;
122+
authProvider.dataInit = true;
122123
}
123124

124125
@override

lib/widgets/gallery/overview.dart

Lines changed: 70 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
*/
1818

1919
import 'package:flutter/material.dart';
20-
import 'package:flutter/widgets.dart';
2120
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
2221
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
2322
import 'package:intl/intl.dart';
@@ -36,76 +35,79 @@ class Gallery extends StatelessWidget {
3635

3736
return Padding(
3837
padding: const EdgeInsets.all(5),
39-
child: MasonryGridView.count(
40-
crossAxisCount: 2,
41-
mainAxisSpacing: 5,
42-
crossAxisSpacing: 5,
43-
itemCount: provider.images.length,
44-
itemBuilder: (context, index) {
45-
final currentImage = provider.images[index];
38+
child: RefreshIndicator(
39+
onRefresh: () => provider.fetchAndSetGallery(),
40+
child: MasonryGridView.count(
41+
crossAxisCount: 2,
42+
mainAxisSpacing: 5,
43+
crossAxisSpacing: 5,
44+
itemCount: provider.images.length,
45+
itemBuilder: (context, index) {
46+
final currentImage = provider.images[index];
4647

47-
return GestureDetector(
48-
onTap: () {
49-
showModalBottomSheet(
50-
builder: (context) => Material(
51-
child: Container(
52-
key: Key('image-${currentImage.id}-detail'),
53-
padding: const EdgeInsets.all(10),
54-
color: Colors.white,
55-
child: Column(
56-
children: [
57-
Text(
58-
DateFormat.yMd(Localizations.localeOf(context).languageCode)
59-
.format(currentImage.date),
60-
style: Theme.of(context).textTheme.headline5,
61-
),
62-
Expanded(
63-
child: Image.network(currentImage.url!),
64-
),
65-
Padding(
66-
padding: const EdgeInsets.symmetric(vertical: 8),
67-
child: Text(currentImage.description),
68-
),
69-
Row(
70-
mainAxisAlignment: MainAxisAlignment.center,
71-
children: [
72-
IconButton(
73-
icon: const Icon(Icons.delete),
74-
onPressed: () {
75-
Provider.of<GalleryProvider>(context, listen: false)
76-
.deleteImage(currentImage);
77-
Navigator.of(context).pop();
78-
}),
79-
IconButton(
80-
icon: const Icon(Icons.edit),
81-
onPressed: () {
82-
Navigator.pushNamed(
83-
context,
84-
FormScreen.routeName,
85-
arguments: FormScreenArguments(
86-
AppLocalizations.of(context).edit,
87-
ImageForm(currentImage),
88-
hasListView: true,
89-
),
90-
);
91-
}),
92-
],
93-
)
94-
],
48+
return GestureDetector(
49+
onTap: () {
50+
showModalBottomSheet(
51+
builder: (context) => Material(
52+
child: Container(
53+
key: Key('image-${currentImage.id}-detail'),
54+
padding: const EdgeInsets.all(10),
55+
color: Colors.white,
56+
child: Column(
57+
children: [
58+
Text(
59+
DateFormat.yMd(Localizations.localeOf(context).languageCode)
60+
.format(currentImage.date),
61+
style: Theme.of(context).textTheme.headline5,
62+
),
63+
Expanded(
64+
child: Image.network(currentImage.url!),
65+
),
66+
Padding(
67+
padding: const EdgeInsets.symmetric(vertical: 8),
68+
child: Text(currentImage.description),
69+
),
70+
Row(
71+
mainAxisAlignment: MainAxisAlignment.center,
72+
children: [
73+
IconButton(
74+
icon: const Icon(Icons.delete),
75+
onPressed: () {
76+
Provider.of<GalleryProvider>(context, listen: false)
77+
.deleteImage(currentImage);
78+
Navigator.of(context).pop();
79+
}),
80+
IconButton(
81+
icon: const Icon(Icons.edit),
82+
onPressed: () {
83+
Navigator.pushNamed(
84+
context,
85+
FormScreen.routeName,
86+
arguments: FormScreenArguments(
87+
AppLocalizations.of(context).edit,
88+
ImageForm(currentImage),
89+
hasListView: true,
90+
),
91+
);
92+
}),
93+
],
94+
)
95+
],
96+
),
9597
),
9698
),
97-
),
98-
context: context,
99-
);
100-
},
101-
child: FadeInImage(
102-
key: Key('image-${currentImage.id}'),
103-
placeholder: const AssetImage('assets/images/placeholder.png'),
104-
image: NetworkImage(currentImage.url!),
105-
fit: BoxFit.cover,
106-
),
107-
);
108-
}),
99+
context: context,
100+
);
101+
},
102+
child: FadeInImage(
103+
key: Key('image-${currentImage.id}'),
104+
placeholder: const AssetImage('assets/images/placeholder.png'),
105+
image: NetworkImage(currentImage.url!),
106+
fit: BoxFit.cover,
107+
),
108+
);
109+
}),
110+
),
109111
);
110112
}
111113
}

lib/widgets/measurements/categories.dart

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,27 @@
1717
*/
1818

1919
import 'package:flutter/material.dart';
20-
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
2120
import 'package:provider/provider.dart';
2221
import 'package:wger/providers/measurement.dart';
23-
import 'package:wger/screens/form_screen.dart';
24-
import 'package:wger/screens/measurement_entries_screen.dart';
25-
import 'package:wger/widgets/core/charts.dart';
2622

2723
import 'categories_card.dart';
28-
import 'forms.dart';
2924

3025
class CategoriesList extends StatelessWidget {
3126
@override
3227
Widget build(BuildContext context) {
3328
final _provider = Provider.of<MeasurementProvider>(context, listen: false);
3429

35-
return ListView.builder(
36-
padding: const EdgeInsets.all(10.0),
37-
itemCount: _provider.categories.length,
38-
itemBuilder: (context, index) {
39-
final currentCategory = _provider.categories[index];
30+
return RefreshIndicator(
31+
onRefresh: () => _provider.fetchAndSetAllCategoriesAndEntries(),
32+
child: ListView.builder(
33+
padding: const EdgeInsets.all(10.0),
34+
itemCount: _provider.categories.length,
35+
itemBuilder: (context, index) {
36+
final currentCategory = _provider.categories[index];
4037

41-
return CategoriesCard(currentCategory);
42-
},
38+
return CategoriesCard(currentCategory);
39+
},
40+
),
4341
);
4442
}
4543
}

0 commit comments

Comments
 (0)