refactor: use ListView for chat perf

This commit is contained in:
2025-05-12 13:42:01 +01:00
parent af2879406e
commit 4b363762dd

View File

@ -47,6 +47,8 @@ class ChatWidget extends StatelessWidget {
_ => e.pubKey, _ => e.pubKey,
}), }),
) )
.sortedBy((e) => e.createdAt)
.reversed
.toList(); .toList();
return Column( return Column(
@ -55,27 +57,39 @@ class ChatWidget extends StatelessWidget {
children: [ children: [
_TopZappersWidget(events: filteredChat), _TopZappersWidget(events: filteredChat),
Expanded( Expanded(
child: SingleChildScrollView( child: ListView.builder(
reverse: true, reverse: true,
child: Column( shrinkWrap: true,
spacing: 8, primary: true,
crossAxisAlignment: CrossAxisAlignment.start, itemCount: filteredChat.length,
children: itemBuilder:
filteredChat (ctx, idx) => switch (filteredChat[idx].kind) {
.sortedBy((c) => c.createdAt) 1311 => Padding(
.map( padding: EdgeInsets.symmetric(
(c) => switch (c.kind) { horizontal: 2,
1311 => ChatMessageWidget(stream: stream, msg: c), vertical: 2,
9735 => _ChatZapWidget(stream: stream, zap: c), ),
child: _ChatMessageWidget(
stream: stream,
msg: filteredChat[idx],
),
),
9735 => Padding(
padding: EdgeInsets.symmetric(
horizontal: 2,
vertical: 2,
),
child: _ChatZapWidget(
stream: stream,
zap: filteredChat[idx],
),
),
_ => SizedBox.shrink(), _ => SizedBox.shrink(),
}, },
)
.toList(),
),
), ),
), ),
if (stream.info.status == StreamStatus.live) if (stream.info.status == StreamStatus.live)
WriteMessageWidget(stream: stream), _WriteMessageWidget(stream: stream),
if (stream.info.status == StreamStatus.ended) if (stream.info.status == StreamStatus.ended)
Container( Container(
padding: EdgeInsets.all(8), padding: EdgeInsets.all(8),
@ -220,11 +234,11 @@ class _ChatZapWidget extends StatelessWidget {
} }
} }
class ChatMessageWidget extends StatelessWidget { class _ChatMessageWidget extends StatelessWidget {
final StreamEvent stream; final StreamEvent stream;
final Nip01Event msg; final Nip01Event msg;
const ChatMessageWidget({super.key, required this.stream, required this.msg}); const _ChatMessageWidget({required this.stream, required this.msg});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -268,16 +282,16 @@ class ChatMessageWidget extends StatelessWidget {
} }
} }
class WriteMessageWidget extends StatefulWidget { class _WriteMessageWidget extends StatefulWidget {
final StreamEvent stream; final StreamEvent stream;
const WriteMessageWidget({super.key, required this.stream}); const _WriteMessageWidget({required this.stream});
@override @override
State<StatefulWidget> createState() => _WriteMessageWidget(); State<StatefulWidget> createState() => __WriteMessageWidget();
} }
class _WriteMessageWidget extends State<WriteMessageWidget> { class __WriteMessageWidget extends State<_WriteMessageWidget> {
final TextEditingController _controller = TextEditingController(); final TextEditingController _controller = TextEditingController();
Future<void> _sendMessage() async { Future<void> _sendMessage() async {