Чтобы сохранить порядок элементов, но при этом использовать `reverse: true` в `CustomScrollView`, вы можете сделать следующее:
1. Поменять порядок элементов в списке на уровне данных, а не на уровне отображения. Для этого можно просто использовать `reversed` для вашего списка сообщений, если у вас есть возможность изменить структуру данных.
2. Использовать `SliverList`, в котором вы сами настраиваете порядок отображаемых элементов. Когда `reverse: true`, элементы должны размещаться в обратном порядке, но вы можете управлять тем, какие заголовки и сообщения отображаются в каком порядке.
Вот пример, как это можно реализовать:
```dart
import 'package:flutter/material.dart';
class ChatScreen extends StatelessWidget {
final List<Message> messages;
ChatScreen(this.messages);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Чат'),
),
body: CustomScrollView(
reverse: true, // Обратный порядок прокрутки
slivers: [
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
final message = messages.reversed.elementAt(index);
// При отображении сообщений, заголовки могут быть настроены отдельно
return MessageWidget(message);
},
childCount: messages.length,
),
),
],
),
);
}
}
class Message {
final String text;
final DateTime date;
Message(this.text, this.date);
}
class MessageWidget extends StatelessWidget {
final Message message;
MessageWidget(this.message);
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(message.text),
subtitle: Text(message.date.toString()),
);
}
}
```
В этом примере `messages.reversed.elementAt(index)` позволяет вам получать сообщения в обратном порядке, сохраняя при этом заголовки и структуру вашего интерфейса. Таким образом, заголовки дат могут быть обработаны и отображены так, как вы хотите, при этом весь контент будет прокручиваться в обратном порядке, как требуется.