fix timer issues

This commit is contained in:
otsmr 2026-07-09 16:35:42 +02:00
parent 2cee00aff6
commit cda52a5da8
3 changed files with 53 additions and 26 deletions

View file

@ -1,5 +1,10 @@
# Changelog # Changelog
## 0.3.5
- Fix: Performance issue caused by an out-of-sync Signal session
- Fix: Multiple smaller bug fixes
## 0.3.3 ## 0.3.3
- Fix: Multiple UI issues - Fix: Multiple UI issues

View file

@ -259,6 +259,7 @@ class _UserListItem extends State<GroupListItemComp> {
: Row( : Row(
children: [ children: [
LastMessageTimeComp( LastMessageTimeComp(
key: ValueKey(widget.group.groupId),
dateTime: widget.group.lastMessageExchange, dateTime: widget.group.lastMessageExchange,
), ),
FlameCounterWidget( FlameCounterWidget(
@ -281,7 +282,10 @@ class _UserListItem extends State<GroupListItemComp> {
const Text(''), const Text(''),
const SizedBox(width: 5), const SizedBox(width: 5),
if (_currentMessage != null) if (_currentMessage != null)
LastMessageTimeComp(message: _currentMessage), LastMessageTimeComp(
key: ValueKey(widget.group.groupId),
message: _currentMessage,
),
FlameCounterWidget( FlameCounterWidget(
groupId: widget.group.groupId, groupId: widget.group.groupId,
prefix: true, prefix: true,

View file

@ -19,41 +19,59 @@ class LastMessageTimeComp extends StatefulWidget {
class _LastMessageTimeCompState extends State<LastMessageTimeComp> { class _LastMessageTimeCompState extends State<LastMessageTimeComp> {
Timer? updateTime; Timer? updateTime;
int lastMessageInSeconds = 0; int lastMessageInSeconds = 0;
DateTime? targetTime;
StreamSubscription<MessageAction?>? _actionSubscription;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
// Change the color every 200 milliseconds _loadTargetTime();
updateTime = Timer.periodic(const Duration(milliseconds: 500), (
timer, updateTime = Timer.periodic(
) async { const Duration(milliseconds: 500),
if (widget.message != null) { (_) => _updateSeconds(),
final lastAction = await twonlyDB.messagesDao.getLastMessageAction( );
widget.message!.messageId, }
);
lastMessageInSeconds = clock @override
.now() void didUpdateWidget(LastMessageTimeComp oldWidget) {
.difference(lastAction?.actionAt ?? widget.message!.createdAt) super.didUpdateWidget(oldWidget);
.inSeconds; if (oldWidget.message?.messageId != widget.message?.messageId ||
} else if (widget.dateTime != null) { oldWidget.dateTime != widget.dateTime) {
lastMessageInSeconds = clock _loadTargetTime();
.now() }
.difference(widget.dateTime!) }
.inSeconds;
} void _loadTargetTime() {
if (mounted) { _actionSubscription?.cancel();
setState(() { _actionSubscription = null;
if (lastMessageInSeconds < 0) {
lastMessageInSeconds = 0; if (widget.message != null) {
} _actionSubscription = twonlyDB.messagesDao
}); .watchLastMessageAction(widget.message!.messageId)
} .listen((lastAction) {
targetTime = lastAction?.actionAt ?? widget.message!.createdAt;
_updateSeconds();
});
} else if (widget.dateTime != null) {
targetTime = widget.dateTime;
_updateSeconds();
}
}
void _updateSeconds() {
if (targetTime == null || !mounted) return;
final seconds = clock.now().difference(targetTime!).inSeconds;
setState(() {
lastMessageInSeconds = seconds < 0 ? 0 : seconds;
}); });
} }
@override @override
void dispose() { void dispose() {
updateTime?.cancel(); updateTime?.cancel();
_actionSubscription?.cancel();
super.dispose(); super.dispose();
} }