Skip to content

Instantly share code, notes, and snippets.

@putraxor
Created March 5, 2018 02:19
Show Gist options
  • Save putraxor/e9df922414f7131c3a36cea4e9dab9ba to your computer and use it in GitHub Desktop.
Save putraxor/e9df922414f7131c3a36cea4e9dab9ba to your computer and use it in GitHub Desktop.
Flutter Chat Bubble
import 'package:flutter/material.dart';
class Bubble extends StatelessWidget {
Bubble({this.message, this.time, this.delivered, this.isMe});
final String message, time;
final delivered, isMe;
@override
Widget build(BuildContext context) {
final bg = isMe ? Colors.white : Colors.greenAccent.shade100;
final align = isMe ? CrossAxisAlignment.start : CrossAxisAlignment.end;
final icon = delivered ? Icons.done_all : Icons.done;
final radius = isMe
? BorderRadius.only(
topRight: Radius.circular(5.0),
bottomLeft: Radius.circular(10.0),
bottomRight: Radius.circular(5.0),
)
: BorderRadius.only(
topLeft: Radius.circular(5.0),
bottomLeft: Radius.circular(5.0),
bottomRight: Radius.circular(10.0),
);
return Column(
crossAxisAlignment: align,
children: <Widget>[
Container(
margin: const EdgeInsets.all(3.0),
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
blurRadius: .5,
spreadRadius: 1.0,
color: Colors.black.withOpacity(.12))
],
color: bg,
borderRadius: radius,
),
child: Stack(
children: <Widget>[
Padding(
padding: EdgeInsets.only(right: 48.0),
child: Text(message),
),
Positioned(
bottom: 0.0,
right: 0.0,
child: Row(
children: <Widget>[
Text(time,
style: TextStyle(
color: Colors.black38,
fontSize: 10.0,
)),
SizedBox(width: 3.0),
Icon(
icon,
size: 12.0,
color: Colors.black38,
)
],
),
)
],
),
)
],
);
}
}
class BubbleScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.blueGrey.shade50,
appBar: AppBar(
backgroundColor: Colors.white,
elevation: .9,
title: Text(
'Putra',
style: TextStyle(color: Colors.green),
),
leading: IconButton(
icon: Icon(
Icons.arrow_back_ios,
color: Colors.green,
),
onPressed: () {},
),
actions: <Widget>[
IconButton(
icon: Icon(
Icons.videocam,
color: Colors.green,
),
onPressed: () {},
),
IconButton(
icon: Icon(
Icons.call,
color: Colors.green,
),
onPressed: () {},
),
IconButton(
icon: Icon(
Icons.more_vert,
color: Colors.green,
),
onPressed: () {},
)
],
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Bubble(
message: 'Hi there, this is a message',
time: '12:00',
delivered: true,
isMe: false,
),
Bubble(
message: 'Whatsapp like bubble talk',
time: '12:01',
delivered: true,
isMe: false,
),
Bubble(
message: 'Nice one, Flutter is awesome',
time: '12:00',
delivered: true,
isMe: true,
),
Bubble(
message: 'I\'ve told you so dude!',
time: '12:00',
delivered: true,
isMe: false,
),
],
),
),
);
}
}
@nsreenath
Copy link

nsreenath commented Mar 8, 2018

How to add the triangular outset in the chat bubble as shown below. Note that it also has the shadow:

image

@amervelic
Copy link

messages with more lines / ? /

@vi-k
Copy link

vi-k commented Aug 1, 2019

How to add the triangular outset in the chat bubble as shown below. Note that it also has the shadow:

image

https://pub.dev/packages/bubble

@shinriyo
Copy link

Do you release for pub spec?

@sayhicoelho
Copy link

How to fill this empty space with the message text?
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment