fix #352
Some checks are pending
Flutter analyze & test / flutter_analyze_and_test (push) Waiting to run

This commit is contained in:
otsmr 2025-12-26 10:20:46 +01:00
parent 027871290d
commit abd689f1fa
2 changed files with 95 additions and 30 deletions

View file

@ -18,6 +18,7 @@ import 'package:twonly/src/views/chats/chat_messages_components/entries/chat_dat
import 'package:twonly/src/views/chats/chat_messages_components/message_input.dart'; import 'package:twonly/src/views/chats/chat_messages_components/message_input.dart';
import 'package:twonly/src/views/chats/chat_messages_components/response_container.dart'; import 'package:twonly/src/views/chats/chat_messages_components/response_container.dart';
import 'package:twonly/src/views/components/avatar_icon.component.dart'; import 'package:twonly/src/views/components/avatar_icon.component.dart';
import 'package:twonly/src/views/components/blink.component.dart';
import 'package:twonly/src/views/components/flame.dart'; import 'package:twonly/src/views/components/flame.dart';
import 'package:twonly/src/views/components/verified_shield.dart'; import 'package:twonly/src/views/components/verified_shield.dart';
import 'package:twonly/src/views/contact/contact.view.dart'; import 'package:twonly/src/views/contact/contact.view.dart';
@ -372,36 +373,25 @@ class _ChatMessagesViewState extends State<ChatMessagesView> {
); );
} else { } else {
final chatMessage = messages[i].message!; final chatMessage = messages[i].message!;
return Transform.translate( return BlinkWidget(
offset: Offset( enabled: focusedScrollItem == i,
(focusedScrollItem == i) child: ChatListEntry(
? (chatMessage.senderId == null) key: Key(chatMessage.messageId),
? -8 message: messages[i].message!,
: 8 nextMessage: (i > 0) ? messages[i - 1].message : null,
: 0, prevMessage: ((i + 1) < messages.length)
0, ? messages[i + 1].message
), : null,
child: Transform.scale( group: group,
scale: (focusedScrollItem == i) ? 1.05 : 1, galleryItems: galleryItems,
child: ChatListEntry( userIdToContact: userIdToContact,
key: Key(chatMessage.messageId), scrollToMessage: scrollToMessage,
message: messages[i].message!, onResponseTriggered: () {
nextMessage: setState(() {
(i > 0) ? messages[i - 1].message : null, quotesMessage = chatMessage;
prevMessage: ((i + 1) < messages.length) });
? messages[i + 1].message textFieldFocus.requestFocus();
: null, },
group: group,
galleryItems: galleryItems,
userIdToContact: userIdToContact,
scrollToMessage: scrollToMessage,
onResponseTriggered: () {
setState(() {
quotesMessage = chatMessage;
});
textFieldFocus.requestFocus();
},
),
), ),
); );
} }

View file

@ -0,0 +1,75 @@
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
class BlinkWidget extends StatefulWidget {
const BlinkWidget({
required this.child,
required this.enabled,
super.key,
this.blinkDuration = const Duration(milliseconds: 2500),
this.interval = const Duration(milliseconds: 250),
this.visibleOpacity = 1.0,
this.hiddenOpacity = 0.4,
});
final bool enabled;
final Widget child;
final Duration blinkDuration;
final Duration interval;
final double visibleOpacity;
final double hiddenOpacity;
@override
State<BlinkWidget> createState() => _BlinkWidgetState();
}
class _BlinkWidgetState extends State<BlinkWidget>
with SingleTickerProviderStateMixin {
late Ticker _ticker;
bool _visible = true;
@override
void initState() {
super.initState();
_ticker = createTicker(_onTick);
}
@override
void didUpdateWidget(covariant BlinkWidget oldWidget) {
if (oldWidget.enabled != widget.enabled) {
if (widget.enabled) {
_ticker
..stop()
..start();
}
}
super.didUpdateWidget(oldWidget);
}
void _onTick(Duration elapsed) {
var visible = true;
if (elapsed.inMilliseconds < widget.blinkDuration.inMilliseconds) {
visible = elapsed.inMilliseconds % (widget.interval.inMilliseconds * 2) <
widget.interval.inMilliseconds;
} else {
_ticker.stop();
}
setState(() => _visible = visible);
}
@override
void dispose() {
_ticker.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AnimatedOpacity(
opacity: _visible ? widget.visibleOpacity : widget.hiddenOpacity,
duration: Duration(
milliseconds: widget.blinkDuration.inMilliseconds ~/ 3,
),
child: widget.child,
);
}
}