You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.0 KiB
78 lines
2.0 KiB
import 'dart:convert';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart' show rootBundle;
|
|
import 'package:flutter_chat_types/flutter_chat_types.dart' as types;
|
|
import 'package:flutter_chat_ui/flutter_chat_ui.dart';
|
|
import 'package:uuid/uuid.dart';
|
|
|
|
class ChatPage extends StatefulWidget {
|
|
const ChatPage({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
_ChatPageState createState() => _ChatPageState();
|
|
}
|
|
|
|
class _ChatPageState extends State<ChatPage> {
|
|
List<types.Message> _messages = [];
|
|
final _user = const types.User(id: '06c33e8b-e835-4736-80f4-63f44b66666c');
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_loadMessages();
|
|
}
|
|
|
|
void _addMessage(types.Message message) {
|
|
setState(() {
|
|
_messages.insert(0, message);
|
|
});
|
|
}
|
|
|
|
void _handlePreviewDataFetched(
|
|
types.TextMessage message,
|
|
types.PreviewData previewData,
|
|
) {
|
|
final index = _messages.indexWhere((element) => element.id == message.id);
|
|
final updatedMessage = _messages[index].copyWith(previewData: previewData);
|
|
|
|
WidgetsBinding.instance?.addPostFrameCallback((_) {
|
|
setState(() {
|
|
_messages[index] = updatedMessage;
|
|
});
|
|
});
|
|
}
|
|
|
|
void _handleSendPressed(types.PartialText message) {
|
|
final textMessage = types.TextMessage(
|
|
author: _user,
|
|
createdAt: DateTime.now().millisecondsSinceEpoch,
|
|
id: const Uuid().v4(),
|
|
text: message.text,
|
|
);
|
|
|
|
_addMessage(textMessage);
|
|
}
|
|
|
|
void _loadMessages() async {
|
|
final response = await rootBundle.loadString('assets/messages.json');
|
|
final messages = (jsonDecode(response) as List)
|
|
.map((e) => types.Message.fromJson(e as Map<String, dynamic>))
|
|
.toList();
|
|
|
|
setState(() {
|
|
_messages = messages;
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
body: Chat(
|
|
messages: _messages,
|
|
onPreviewDataFetched: _handlePreviewDataFetched,
|
|
onSendPressed: _handleSendPressed,
|
|
user: _user,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|