session crud #5

Merged
jshbrmn merged 22 commits from session-crud into main 2025-01-05 19:02:13 -08:00
12 changed files with 293 additions and 212 deletions
Showing only changes of commit 32826abcea - Show all commits

View File

@ -8,6 +8,7 @@ class SessionsDao extends DatabaseAccessor<AppDatabase> with _$SessionsDaoMixin
SessionsDao(super.db); SessionsDao(super.db);
Future<Session> find(int id) => (select(sessions)..where((session) => session.id.equals(id) )).getSingle(); Future<Session> find(int id) => (select(sessions)..where((session) => session.id.equals(id) )).getSingle();
Stream<Session> watchSession(int id) => (select(sessions)..where((session) => session.id.equals(id) )).watchSingle();
Future<List<Session>> all() => select(sessions).get(); Future<List<Session>> all() => select(sessions).get();
Stream<List<Session>> watch() => select(sessions).watch(); Stream<List<Session>> watch() => select(sessions).watch();
Future createOrUpdate(SessionsCompanion session) => into(sessions).insertOnConflictUpdate(session); Future createOrUpdate(SessionsCompanion session) => into(sessions).insertOnConflictUpdate(session);

View File

@ -9,7 +9,7 @@ showMediaDetailWidget(BuildContext context, MediaItem media) {
showEditorSheet(BuildContext context, Widget widget) { showEditorSheet(BuildContext context, Widget widget) {
showModalBottomSheet<void>( showModalBottomSheet<void>(
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(10.0)), borderRadius: BorderRadius.only(topLeft: Radius.circular(10.0), topRight: Radius.circular(10.0)),
), ),
context: context, context: context,
showDragHandle: true, showDragHandle: true,

View File

@ -1,18 +1,74 @@
import 'dart:convert';
import 'package:drift/drift.dart' hide Column;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:sendtrain/daos/sessions_dao.dart';
import 'package:sendtrain/database/database.dart';
import 'package:sendtrain/widgets/generic/elements/form_text_input.dart';
class AchievementEditor extends StatefulWidget { // class AchievementEditor extends StatefulWidget {
const AchievementEditor({super.key, this.achievements, this.callback}); // const AchievementEditor({super.key, required this.session, this.callback});
final List? achievements; // final Session session;
// final Function? callback;
// @override
// State<AchievementEditor> createState() => _AchievementEditorState();
// }
// class _AchievementEditorState extends State<AchievementEditor> {
class AchievementEditor extends StatelessWidget {
AchievementEditor({super.key, required this.session, this.callback});
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final TextEditingController tec = TextEditingController();
final Session session;
final Function? callback; final Function? callback;
@override @override
State<AchievementEditor> createState() => _AchievementEditorState(); Widget build(
} BuildContext context,
) {
return Padding(
padding: EdgeInsets.fromLTRB(15, 0, 15, 15),
child: Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 10, bottom: 10),
child: Text('Create Achievement',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleLarge)),
FormTextInput(controller: tec, title: 'Achievement'),
Row(mainAxisAlignment: MainAxisAlignment.end, children: [
Padding(
padding: EdgeInsets.only(top: 10),
child: FilledButton(
child: Text('Submit'),
onPressed: () async {
session.achievements;
List achievements =
json.decode(session.achievements!);
achievements.add(tec.text);
Session updatedSession = session.copyWith(
achievements:
Value<String>(json.encode(achievements)));
class _AchievementEditorState extends State<AchievementEditor> { SessionsDao(Provider.of<AppDatabase>(context,
@override listen: false))
Widget build(BuildContext context, ) { .replace(updatedSession);
return Text('this is a test');
Navigator.pop(_formKey.currentContext!, 'Submit');
if (callback != null) {
await callback!();
}
}))
])
])));
} }
} }

View File

@ -24,8 +24,7 @@ class ActivityCard extends StatefulWidget {
class ActivityCardState extends State<ActivityCard> { class ActivityCardState extends State<ActivityCard> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final ActivityTimerModel atm = final ActivityTimerModel atm = Provider.of<ActivityTimerModel>(context);
Provider.of<ActivityTimerModel>(context);
return FutureBuilder<List<MediaItem>>( return FutureBuilder<List<MediaItem>>(
future: MediaItemsDao(Provider.of<AppDatabase>(context)) future: MediaItemsDao(Provider.of<AppDatabase>(context))
@ -48,7 +47,8 @@ class ActivityCardState extends State<ActivityCard> {
ListTile( ListTile(
// visualDensity: VisualDensity(horizontal: VisualDensity.maximumDensity), // visualDensity: VisualDensity(horizontal: VisualDensity.maximumDensity),
leading: CardImage( leading: CardImage(
image: findMediaByType(mediaItems, MediaType.image)), image:
findMediaByType(mediaItems, MediaType.image)),
title: Consumer<ActivityTimerModel>( title: Consumer<ActivityTimerModel>(
builder: (context, atm, child) { builder: (context, atm, child) {
if (atm.activity?.id == widget.activity.id) { if (atm.activity?.id == widget.activity.id) {
@ -78,13 +78,12 @@ class ActivityCardState extends State<ActivityCard> {
showRemovalDialog( showRemovalDialog(
'Activity Removal', 'Activity Removal',
'Would you like to permanently remove this activity from the current session?', 'Would you like to permanently remove this activity from the current session?',
context, () {
ActivitiesDao(Provider.of<AppDatabase>(
context, context,
ActivitiesDao( listen: false))
Provider.of<AppDatabase>( .remove(widget.activity);
context, }).then((result) {
listen: false)),
widget.activity)
.then((result) {
setState(() {}); setState(() {});
}); });
}, },

View File

@ -21,7 +21,7 @@ Future showGenericDialog(dynamic object, BuildContext parentContext) {
} }
Future showCrudDialog(String title, String content, BuildContext context, Future showCrudDialog(String title, String content, BuildContext context,
dynamic daoCall, dynamic object) { [Function? callback]) {
return showAdaptiveDialog( return showAdaptiveDialog(
context: context, context: context,
builder: (BuildContext context) => AlertDialog( builder: (BuildContext context) => AlertDialog(
@ -35,7 +35,10 @@ Future showCrudDialog(String title, String content, BuildContext context,
child: const Text('Cancel'), child: const Text('Cancel'),
), ),
TextButton( TextButton(
onPressed: () => {daoCall(object), Navigator.pop(context, 'OK')}, onPressed: () => {
if (callback != null) {callback()},
Navigator.pop(context, 'OK')
},
child: const Text('OK'), child: const Text('OK'),
), ),
], ],
@ -44,11 +47,11 @@ Future showCrudDialog(String title, String content, BuildContext context,
} }
Future showRemovalDialog(String title, String content, BuildContext context, Future showRemovalDialog(String title, String content, BuildContext context,
dynamic dao, dynamic object) { [Function? callback]) {
return showCrudDialog(title, content, context, dao.remove, object); return showCrudDialog(title, content, context, callback);
} }
Future showUpdateDialog(String title, String content, BuildContext context, Future showUpdateDialog(String title, String content, BuildContext context,
dynamic dao, dynamic object) { [Function? callback]) {
return showCrudDialog(title, content, context, dao.replace, object); return showCrudDialog(title, content, context, callback);
} }

View File

@ -16,41 +16,6 @@ class MediaCard extends StatelessWidget {
final MediaItem media; final MediaItem media;
final Function? callback; final Function? callback;
// @override
// State<MediaCard> createState() => _MediaCardState();
// }
// class _MediaCardState extends State<MediaCard> {
// // late VideoPlayerController _controller;
// late MediaItem media;
// late Function? callback;
// @override
// void initState() {
// super.initState();
// media = widget.media;
// callback = widget.callback;
// _controller = VideoPlayerController.asset(dataSource)
// ..initialize().then((_) {
// setState(() {}); //when your thumbnail will show.
// });
// }
// @override
// void dispose() {
// super.dispose();
// _controller.dispose();
// }
// Future<VideoPlayerController> createVideoPlayer() async {
// final File file =
// await ImgB64Decoder.fileFromB64String(widget.encodedBytes);
// final VideoPlayerController controller = VideoPlayerController.file(file);
// await controller.initialize();
// await controller.setLooping(true);
// return controller;
// }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
DecorationImage mediaImage(MediaItem media) { DecorationImage mediaImage(MediaItem media) {
@ -63,9 +28,7 @@ class MediaCard extends StatelessWidget {
} else if (media.type == MediaType.youtube) { } else if (media.type == MediaType.youtube) {
image = image =
NetworkImage('https://img.youtube.com/vi/${media.reference}/0.jpg'); NetworkImage('https://img.youtube.com/vi/${media.reference}/0.jpg');
} else if (media.type == MediaType.localVideo) { } else if (media.type == MediaType.localVideo) {}
}
return DecorationImage(image: image, fit: BoxFit.cover); return DecorationImage(image: image, fit: BoxFit.cover);
} }
@ -84,11 +47,11 @@ class MediaCard extends StatelessWidget {
onLongPress: () => showRemovalDialog( onLongPress: () => showRemovalDialog(
'Media Removal', 'Media Removal',
'Would you like to permanently remove this media from the current session?', 'Would you like to permanently remove this media from the current session?',
context, context, () {
MediaItemsDao(Provider.of<AppDatabase>(context, MediaItemsDao(
listen: false)), Provider.of<AppDatabase>(context, listen: false))
media) .remove(media);
.then((result) { }).then((result) {
if (callback != null) { if (callback != null) {
callback!(); callback!();
} }

View File

@ -82,11 +82,11 @@ class _SessionCardFullState extends State<SessionCardFull> {
showRemovalDialog( showRemovalDialog(
'Session Removal', 'Session Removal',
'Would you like to permanently remove this session?', 'Would you like to permanently remove this session?',
context, context, () {
SessionsDao(Provider.of<AppDatabase>(context, SessionsDao(
listen: false)), Provider.of<AppDatabase>(context, listen: false))
session) .remove(session);
.then((result) { }).then((result) {
setState(() {}); setState(() {});
}); });
}, },

View File

@ -281,7 +281,7 @@ class _SessionEditorState extends State<SessionEditor> {
if (widget.callback != null) { if (widget.callback != null) {
await widget await widget
.callback!(widget.session!.id); .callback!();
} }
}) })
} }

View File

@ -9,6 +9,7 @@ import 'package:sendtrain/daos/sessions_dao.dart';
import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/database/database.dart';
import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/extensions/string_extensions.dart';
import 'package:sendtrain/helpers/widget_helpers.dart'; import 'package:sendtrain/helpers/widget_helpers.dart';
import 'package:sendtrain/widgets/achievements/achievement_editor.dart';
import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.dart'; import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.dart';
import 'package:sendtrain/widgets/sessions/session_editor.dart'; import 'package:sendtrain/widgets/sessions/session_editor.dart';
import 'package:sendtrain/widgets/sessions/session_view_achievements.dart'; import 'package:sendtrain/widgets/sessions/session_view_achievements.dart';
@ -39,13 +40,13 @@ class _SessionViewState extends State<SessionView> {
return title; return title;
} }
void resetState(int sessionId) async { void resetState() async {
Session updatedSession = Session updatedSession =
await SessionsDao(Provider.of<AppDatabase>(context, listen: false)) await SessionsDao(Provider.of<AppDatabase>(context, listen: false))
.find(sessionId); .find(session.id);
final state = _fabKey.currentState; final state = _fabKey.currentState;
if (state != null) { if (state != null && state.isOpen) {
state.toggle(); state.toggle();
} }
@ -64,13 +65,16 @@ class _SessionViewState extends State<SessionView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StreamBuilder<List<Activity>>( return StreamBuilder<Session>(
stream: ActivitiesDao(Provider.of<AppDatabase>(context)) initialData: session,
.watchSessionActivities(session.id), stream: SessionsDao(Provider.of<AppDatabase>(context))
.watchSession(session.id),
builder: (context, snapshot) { builder: (context, snapshot) {
// return StreamBuilder<List<Activity>>(
// stream: ActivitiesDao(Provider.of<AppDatabase>(context))
// .watchSessionActivities(session.id),
// builder: (context, snapshot) {
if (snapshot.hasData) { if (snapshot.hasData) {
final activities = snapshot.data!;
return Scaffold( return Scaffold(
floatingActionButtonLocation: ExpandableFab.location, floatingActionButtonLocation: ExpandableFab.location,
floatingActionButton: ExpandableFab( floatingActionButton: ExpandableFab(
@ -82,6 +86,26 @@ class _SessionViewState extends State<SessionView> {
blur: 10, blur: 10,
), ),
children: [ children: [
FloatingActionButton.extended(
icon: const Icon(Icons.edit_outlined),
label: Text('Add Achievement'),
onPressed: () {
showEditorSheet(
context,
AchievementEditor(
session: session, callback: resetState));
},
),
FloatingActionButton.extended(
icon: const Icon(Icons.edit_outlined),
label: Text('Edit'),
onPressed: () {
showEditorSheet(
context,
SessionEditor(
session: session, callback: resetState));
},
),
FloatingActionButton.extended( FloatingActionButton.extended(
icon: const Icon(Icons.history_outlined), icon: const Icon(Icons.history_outlined),
label: Text('Restart'), label: Text('Restart'),
@ -116,16 +140,6 @@ class _SessionViewState extends State<SessionView> {
} }
}, },
), ),
FloatingActionButton.extended(
icon: const Icon(Icons.edit_outlined),
label: Text('Edit'),
onPressed: () {
showEditorSheet(
context,
SessionEditor(
session: session, callback: resetState));
},
),
]), ]),
body: Column( body: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -144,7 +158,7 @@ class _SessionViewState extends State<SessionView> {
style: const TextStyle( style: const TextStyle(
fontSize: 25, fontWeight: FontWeight.bold), fontSize: 25, fontWeight: FontWeight.bold),
title())), title())),
SessionViewAchievements(session: session), SessionViewAchievements(session: session, callback: resetState),
Padding( Padding(
padding: const EdgeInsets.only(left: 15, right: 15), padding: const EdgeInsets.only(left: 15, right: 15),
child: Text( child: Text(
@ -163,7 +177,7 @@ class _SessionViewState extends State<SessionView> {
style: TextStyle( style: TextStyle(
fontSize: 20, fontWeight: FontWeight.bold), fontSize: 20, fontWeight: FontWeight.bold),
'Activites:')), 'Activites:')),
SessionViewActivities(activities: activities), SessionViewActivities(session: session),
], ],
)); ));
} else { } else {

View File

@ -1,8 +1,8 @@
import 'dart:convert'; import 'dart:convert';
import 'package:drift/drift.dart' hide Column;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:sendtrain/daos/session_activities_dao.dart';
import 'package:sendtrain/daos/sessions_dao.dart'; import 'package:sendtrain/daos/sessions_dao.dart';
import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/database/database.dart';
import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/extensions/string_extensions.dart';
@ -11,33 +11,25 @@ import 'package:sendtrain/widgets/achievements/achievement_editor.dart';
import 'package:sendtrain/widgets/builders/dialogs.dart'; import 'package:sendtrain/widgets/builders/dialogs.dart';
class SessionViewAchievements extends StatelessWidget { class SessionViewAchievements extends StatelessWidget {
const SessionViewAchievements({super.key, required this.session}); const SessionViewAchievements(
{super.key, required this.session, this.callback});
final Session session; final Session session;
final Function? callback;
// List<String> getAchievements(List<SessionActivity> sessionActivities) { Session updateAchievements(int index, List achievements) {
// List<String> achievements = []; achievements.removeAt(index);
return session.copyWith(
// for (int i = 0; i < sessionActivities.length; i++) { achievements: Value<String>(json.encode(achievements)));
// final SessionActivity sessionActivity = sessionActivities[i];
// final List? saAchievments = sessionActivity.achievements?.split(',');
// if (saAchievments != null) {
// saAchievments.forEach((achievement) => achievements.add(achievement));
// }
// }
// return achievements;
// }
void resetState() {
// setState(() {});
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Widget content; Widget content;
if (session.achievements == null) { final AppDatabase db = Provider.of<AppDatabase>(context, listen: false);
List achievements = json.decode(session.achievements ?? "[]");
if (achievements.isEmpty) {
content = Padding( content = Padding(
padding: const EdgeInsets.only(left: 10, right: 5), padding: const EdgeInsets.only(left: 10, right: 5),
child: ActionChip( child: ActionChip(
@ -45,11 +37,11 @@ class SessionViewAchievements extends StatelessWidget {
avatar: const Icon(Icons.check_circle_outline), avatar: const Icon(Icons.check_circle_outline),
label: Text(maxLines: 1, 'Add Achievements!'), label: Text(maxLines: 1, 'Add Achievements!'),
onPressed: () { onPressed: () {
showEditorSheet(context, AchievementEditor(callback: resetState)); showEditorSheet(context,
AchievementEditor(session: session, callback: callback));
}, },
)); ));
} else { } else {
final achievements = json.decode(session.achievements!);
content = ListView.builder( content = ListView.builder(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
@ -60,15 +52,23 @@ class SessionViewAchievements extends StatelessWidget {
child: ActionChip( child: ActionChip(
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
avatar: const Icon(Icons.check_circle_outline), avatar: const Icon(Icons.check_circle_outline),
label: Text(maxLines: 1, achievements[index].toString().toTitleCase()), label: Text(
onPressed: () { maxLines: 1,
showUpdateDialog( achievements[index].toString().toTitleCase()),
onPressed: () async {
// remove the achievement at index
// then update session
Session newSession =
updateAchievements(index, achievements);
await showUpdateDialog(
'Achievement Removal', 'Achievement Removal',
'Would you like to remove this achievement?', 'Would you like to remove this achievement?',
context, context, () {
SessionsDao( SessionsDao(db).replace(newSession);
Provider.of<AppDatabase>(context, listen: false)), if (callback != null) {
session); callback!();
}
});
})); }));
}, },
); );
@ -81,14 +81,52 @@ class SessionViewAchievements extends StatelessWidget {
child: SizedBox(height: 40, child: content)), child: SizedBox(height: 40, child: content)),
], ],
); );
// return StreamBuilder<List<SessionActivity>>( }
// stream: SessionActivitiesDao(Provider.of<AppDatabase>(context)) }
// .fromSessionId(session.id).asStream(),
// builder: (context, snapshot) {
// if (snapshot.hasData) {
// final sessionActivities = snapshot.data!;
// final achievements = getAchievements(sessionActivities);
// class SessionViewAchievements extends StatefulWidget {
// const SessionViewAchievements({super.key, required this.session});
// final Session session;
// @override
// State<SessionViewAchievements> createState() =>
// _SessionViewAchievementsState();
// }
// class _SessionViewAchievementsState extends State<SessionViewAchievements> {
// late final AppDatabase db;
// late Session session;
// late List achievements;
// @override
// void initState() {
// super.initState();
// db = Provider.of<AppDatabase>(context, listen: false);
// session = widget.session;
// achievements = json.decode(session.achievements!);
// }
// void resetState(int sessionId) async {
// Session updatedSession =
// await SessionsDao(Provider.of<AppDatabase>(context, listen: false))
// .find(sessionId);
// setState(() {
// session = updatedSession;
// achievements = json.decode(session.achievements!);
// });
// }
// Session updateAchievements(int index) {
// achievements.removeAt(index);
// return session.copyWith(
// achievements: Value<String>(json.encode(achievements)));
// }
// @override
// Widget build(BuildContext context) {
// Widget content; // Widget content;
// if (achievements.isEmpty) { // if (achievements.isEmpty) {
// content = Padding( // content = Padding(
@ -98,7 +136,8 @@ class SessionViewAchievements extends StatelessWidget {
// avatar: const Icon(Icons.check_circle_outline), // avatar: const Icon(Icons.check_circle_outline),
// label: Text(maxLines: 1, 'Add Achievements!'), // label: Text(maxLines: 1, 'Add Achievements!'),
// onPressed: () { // onPressed: () {
// showEditorSheet(context, AchievementEditor(achievements: achievements, callback: resetState)); // showEditorSheet(context,
// AchievementEditor(session: session, callback: resetState));
// }, // },
// )); // ));
// } else { // } else {
@ -113,11 +152,20 @@ class SessionViewAchievements extends StatelessWidget {
// visualDensity: VisualDensity.compact, // visualDensity: VisualDensity.compact,
// avatar: const Icon(Icons.check_circle_outline), // avatar: const Icon(Icons.check_circle_outline),
// label: Text( // label: Text(
// maxLines: 1, achievements[index].toTitleCase()), // maxLines: 1,
// onPressed: () { // achievements[index].toString().toTitleCase()),
// // remove achievements // onPressed: () async {
// }, // // remove the achievement at index
// )); // // then update session
// Session newSession = updateAchievements(index);
// await showUpdateDialog(
// 'Achievement Removal',
// 'Would you like to remove this achievement?',
// context,
// SessionsDao(db),
// newSession,
// resetState);
// }));
// }, // },
// ); // );
// } // }
@ -129,11 +177,5 @@ class SessionViewAchievements extends StatelessWidget {
// child: SizedBox(height: 40, child: content)), // child: SizedBox(height: 40, child: content)),
// ], // ],
// ); // );
// } else {
// return Padding(
// padding: EdgeInsets.all(15),
// child: CircularProgressIndicator());
// } // }
// }); // }
}
}

View File

@ -1,29 +1,40 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:sendtrain/daos/activities_dao.dart';
import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/database/database.dart';
import 'package:sendtrain/widgets/activities/activity_card.dart'; import 'package:sendtrain/widgets/activities/activity_card.dart';
import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.dart';
class SessionViewActivities extends StatefulWidget { class SessionViewActivities extends StatefulWidget {
const SessionViewActivities({super.key, required this.activities }); const SessionViewActivities({super.key, required this.session});
final List<Activity> activities; final Session session;
@override @override
State<SessionViewActivities> createState() => _SessionViewActivitiesState(); State<SessionViewActivities> createState() => _SessionViewActivitiesState();
} }
class _SessionViewActivitiesState extends State<SessionViewActivities> { class _SessionViewActivitiesState extends State<SessionViewActivities> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StreamBuilder<List<Activity>>(
stream: ActivitiesDao(Provider.of<AppDatabase>(context))
.watchSessionActivities(widget.session.id),
builder: (context, snapshot) {
if (snapshot.hasData) {
final activities = snapshot.data!;
return Expanded( return Expanded(
child: ListView.builder( child: ListView.builder(
// shrinkWrap: true, // shrinkWrap: true,
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
itemCount: widget.activities.length, itemCount: activities.length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return ActivityCard( return ActivityCard(activity: activities[index]);
activity: widget.activities[index]);
}, },
)); ));
} else {
return GenericProgressIndicator();
}
});
} }
} }

View File

@ -14,18 +14,10 @@ class SessionViewMedia extends StatefulWidget {
} }
class _SessionViewMediaState extends State<SessionViewMedia> { class _SessionViewMediaState extends State<SessionViewMedia> {
// late final Session session;
void resetState() { void resetState() {
setState(() {}); setState(() {});
} }
// @override
// initState() async {
// super.initState();
// }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return FutureBuilder<List<MediaItem>>( return FutureBuilder<List<MediaItem>>(
@ -35,8 +27,8 @@ class _SessionViewMediaState extends State<SessionViewMedia> {
if (snapshot.hasData) { if (snapshot.hasData) {
final mediaItems = snapshot.data!; final mediaItems = snapshot.data!;
List<Widget> mediaCards = List.generate( List<Widget> mediaCards = List.generate(mediaItems.length,
mediaItems.length, (i) => MediaCard(media: mediaItems[i], callback: resetState)); (i) => MediaCard(media: mediaItems[i], callback: resetState));
return Column( return Column(
children: [ children: [