Skip to content

Commit

Permalink
refactor: replace StreamBuilder with ConsumerWidget
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiasn committed Jun 5, 2024
1 parent 1ea8d4e commit 04c80e9
Show file tree
Hide file tree
Showing 6 changed files with 279 additions and 60 deletions.
2 changes: 1 addition & 1 deletion lib/features/journal/state/entry_controller.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

45 changes: 45 additions & 0 deletions lib/features/journal/state/journal_card_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import 'dart:async';

import 'package:lotti/classes/journal_entities.dart';
import 'package:lotti/database/database.dart';
import 'package:lotti/get_it.dart';
import 'package:lotti/services/db_notification.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'journal_card_controller.g.dart';

@riverpod
class JournalCardController extends _$JournalCardController {
JournalCardController() {
listen();
}

late final String entryId;
StreamSubscription<({DatabaseType type, String id})>? _updateSubscription;
final JournalDb _journalDb = getIt<JournalDb>();
final UpdateNotifications _updateNotifications = getIt<UpdateNotifications>();

void listen() {
_updateSubscription =
_updateNotifications.updateStream.listen((event) async {
if (event.id == entryId) {
final latest = await _fetch();
if (latest != state.value) {
state = AsyncData(latest);
}
}
});
}

@override
Future<JournalEntity?> build({required String id}) async {
entryId = id;
ref.onDispose(() => _updateSubscription?.cancel());
final entry = await _fetch();
return entry;
}

Future<JournalEntity?> _fetch() async {
return _journalDb.journalEntityById(entryId);
}
}
177 changes: 177 additions & 0 deletions lib/features/journal/state/journal_card_controller.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

97 changes: 47 additions & 50 deletions lib/widgets/journal/journal_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_rating/flutter_rating.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:lotti/classes/journal_entities.dart';
import 'package:lotti/database/database.dart';
import 'package:lotti/features/journal/state/journal_card_controller.dart';
import 'package:lotti/get_it.dart';
import 'package:lotti/services/nav_service.dart';
import 'package:lotti/themes/colors.dart';
Expand Down Expand Up @@ -187,7 +189,7 @@ class JournalCardTitle extends StatelessWidget {
}
}

class JournalCard extends StatefulWidget {
class JournalCard extends ConsumerStatefulWidget {
const JournalCard({
required this.item,
super.key,
Expand All @@ -200,62 +202,57 @@ class JournalCard extends StatefulWidget {
final bool showLinkedDuration;

@override
State<JournalCard> createState() => _JournalCardState();
ConsumerState<JournalCard> createState() => _JournalCardState();
}

class _JournalCardState extends State<JournalCard> {
class _JournalCardState extends ConsumerState<JournalCard> {
@override
Widget build(BuildContext context) {
return StreamBuilder<JournalEntity?>(
stream: getIt<JournalDb>().watchEntityById(widget.item.meta.id),
builder: (
BuildContext context,
AsyncSnapshot<JournalEntity?> snapshot,
) {
final updatedItem = snapshot.data ?? widget.item;
if (updatedItem.meta.deletedAt != null) {
return const SizedBox.shrink();
}
void onTap() {
if (getIt<NavService>().tasksTabActive()) {
beamToNamed('/tasks/${updatedItem.meta.id}');
} else {
beamToNamed('/journal/${updatedItem.meta.id}');
}
}
final provider = journalCardControllerProvider(id: widget.item.meta.id);
final entryState = ref.watch(provider).value;
final updatedItem = entryState ?? widget.item;

final errorColor = Theme.of(context).colorScheme.error;
if (updatedItem.meta.deletedAt != null) {
return const SizedBox.shrink();
}
void onTap() {
if (getIt<NavService>().tasksTabActive()) {
beamToNamed('/tasks/${updatedItem.meta.id}');
} else {
beamToNamed('/journal/${updatedItem.meta.id}');
}
}

return Padding(
padding: const EdgeInsets.symmetric(horizontal: 5),
child: Card(
child: ListTile(
leading: updatedItem.maybeMap(
journalAudio: (item) {
final transcripts = item.data.transcripts;
return LeadingIcon(
Icons.mic_rounded,
color: transcripts != null && transcripts.isNotEmpty
? Theme.of(context).colorScheme.outline
: errorColor.withOpacity(0.4),
);
},
quantitative: (_) => LeadingIcon(MdiIcons.heart),
measurement: (_) => LeadingIcon(MdiIcons.numeric),
habitCompletion: (habitCompletion) =>
HabitCompletionColorIcon(habitCompletion.data.habitId),
orElse: () => null,
),
title: JournalCardTitle(
item: updatedItem,
maxHeight: widget.maxHeight,
showLinkedDuration: widget.showLinkedDuration,
),
onTap: onTap,
),
final errorColor = Theme.of(context).colorScheme.error;

return Padding(
padding: const EdgeInsets.symmetric(horizontal: 5),
child: Card(
child: ListTile(
leading: updatedItem.maybeMap(
journalAudio: (item) {
final transcripts = item.data.transcripts;
return LeadingIcon(
Icons.mic_rounded,
color: transcripts != null && transcripts.isNotEmpty
? Theme.of(context).colorScheme.outline
: errorColor.withOpacity(0.4),
);
},
quantitative: (_) => LeadingIcon(MdiIcons.heart),
measurement: (_) => LeadingIcon(MdiIcons.numeric),
habitCompletion: (habitCompletion) =>
HabitCompletionColorIcon(habitCompletion.data.habitId),
orElse: () => null,
),
);
},
title: JournalCardTitle(
item: updatedItem,
maxHeight: widget.maxHeight,
showLinkedDuration: widget.showLinkedDuration,
),
onTap: onTap,
),
),
);
}
}
Expand Down
Loading

0 comments on commit 04c80e9

Please sign in to comment.