Skip to content

Instantly share code, notes, and snippets.

@nurulmac11
Created May 24, 2020 10:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nurulmac11/1e1e0348eeacaeccb2aaebdb4ffc311e to your computer and use it in GitHub Desktop.
Save nurulmac11/1e1e0348eeacaeccb2aaebdb4ffc311e to your computer and use it in GitHub Desktop.
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:socket_io_client/socket_io_client.dart' as IO;
import 'package:provider/provider.dart';
import 'models/Messages.dart';
import 'storage.dart';
class ChatScreen extends StatefulWidget {
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
IO.Socket socket;
String chatTo;
String username;
final msgController = TextEditingController();
ScrollController _scrollController = new ScrollController();
void autoScroll() {
if(_scrollController.hasClients)
Timer(
Duration(milliseconds: 100),
() =>
_scrollController.animateTo(
_scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 300),
curve: Curves.easeOut));
}
@override
void initState() {
// Get username from sp
username = storage.username;
// Get socket from storage
socket = storage.socket;
super.initState();
}
void sendMessage(msg) {
var payload = {
"username": username,
"text": msg,
"to": chatTo,
"from": username,
};
final msgs = Provider.of<Messages>(context, listen: false);
msgs.addMessage(
new Message(username, chatTo, msg));
this.socket.emit('msgToServer', payload);
msgController.clear();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
// Get who are we sending to messages ?
final Map arguments = ModalRoute
.of(context)
.settings
.arguments as Map;
if (arguments != null) chatTo = arguments['chatTo'];
}
@override
void dispose() {
// Clean up the controller when the widget is disposed.
msgController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Chat App'),
),
body: Column(
children: <Widget>[
Expanded(
child: Scrollbar(
child: Consumer<Messages>(
builder: (context, myModel, child) {
autoScroll();
return ChatMessages(scrollController: _scrollController,
messages: myModel.getMessagesOf(chatTo),
username: username);
})
),
),
Container(
height: 100,
child: Align(
alignment: Alignment.bottomCenter,
child: Row(
children: [
Expanded(
child: TextField(
controller: msgController,
maxLines: 3,
decoration: InputDecoration(hintText: 'Write a message.'),
),
),
RaisedButton(
onPressed: () => sendMessage(msgController.text),
child: Text("Send"),
)
],
),
),
),
],
),
);
}
}
class ChatMessages extends StatelessWidget {
const ChatMessages({
Key key,
@required ScrollController scrollController,
@required this.messages,
@required this.username,
})
: _scrollController = scrollController,
super(key: key);
final ScrollController _scrollController;
final List messages;
final String username;
@override
Widget build(BuildContext context) {
return ListView(
controller: _scrollController,
scrollDirection: Axis.vertical,
shrinkWrap: true,
children: messages
.map((msg) =>
ListTile(
subtitle: Text(
"From: ${msg.from}",
textDirection: msg.from == username
? TextDirection.rtl
: TextDirection.ltr,
),
leading: Icon(Icons.message),
title: Text(
msg.message,
textDirection: msg.from == username
? TextDirection.rtl
: TextDirection.ltr,
),
))
.toList() ??
[],
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment