Merge branch 'master' into develop

This commit is contained in:
Salvatore Giordano
2021-03-10 09:43:17 +01:00
32 changed files with 123 additions and 87 deletions
+1 -1
View File
@@ -32,7 +32,7 @@ jobs:
TOTAL_MAX: ${{ steps.analysis.outputs.total_max }} TOTAL_MAX: ${{ steps.analysis.outputs.total_max }}
run: | run: |
PERCENTAGE=$(( $TOTAL * 100 / $TOTAL_MAX )) PERCENTAGE=$(( $TOTAL * 100 / $TOTAL_MAX ))
if (( $PERCENTAGE < 100 )) if (( $PERCENTAGE < 90 ))
then then
echo Score too low! echo Score too low!
exit 1 exit 1
@@ -30,7 +30,7 @@ jobs:
run: melos bootstrap run: melos bootstrap
- name: 'Dart Analyze' - name: 'Dart Analyze'
run: | run: |
melos exec -c 3 -- \ melos exec -c 3 --ignore="*example*" -- \
tuneup check tuneup check
- name: 'Pub Check' - name: 'Pub Check'
run: | run: |
+1 -1
View File
@@ -1,4 +1,4 @@
# Official Flutter packages for [Stream Chat](https://getstream.io/chat/) # Official Flutter packages for [Stream Chat](https://getstream.io/chat/sdk/flutter/)
![](https://raw.githubusercontent.com/GetStream/stream-chat-flutter/master/images/sdk_hero_v4.png) ![](https://raw.githubusercontent.com/GetStream/stream-chat-flutter/master/images/sdk_hero_v4.png)
+7
View File
@@ -1,3 +1,10 @@
## 1.4.0-beta
- Improved attachment uploading
- Fix: update member presence
- Added skip_push to message model
- Minor fixes and improvements
## 1.3.2+1-beta ## 1.3.2+1-beta
- Fixed queryChannels bug - Fixed queryChannels bug
@@ -338,6 +338,7 @@ class Channel {
_messageAttachmentsUploadCompleter[message.id] = _messageAttachmentsUploadCompleter[message.id] =
attachmentsUploadCompleter; attachmentsUploadCompleter;
// ignore: unawaited_futures
_uploadAttachments( _uploadAttachments(
message.id, message.id,
message.attachments.map((it) => it.id), message.attachments.map((it) => it.id),
@@ -388,6 +389,7 @@ class Channel {
_messageAttachmentsUploadCompleter[message.id] = _messageAttachmentsUploadCompleter[message.id] =
attachmentsUploadCompleter; attachmentsUploadCompleter;
// ignore: unawaited_futures
_uploadAttachments( _uploadAttachments(
message.id, message.id,
message.attachments.map((it) => it.id), message.attachments.map((it) => it.id),
+1
View File
@@ -510,6 +510,7 @@ class StreamChatClient {
if (status == ConnectionStatus.connected && if (status == ConnectionStatus.connected &&
state.channels?.isNotEmpty == true) { state.channels?.isNotEmpty == true) {
// ignore: unawaited_futures
queryChannelsOnline(filter: { queryChannelsOnline(filter: {
'cid': { 'cid': {
'\$in': state.channels.keys.toList(), '\$in': state.channels.keys.toList(),
+1 -1
View File
@@ -3,4 +3,4 @@ import 'package:stream_chat/src/client.dart';
/// Current package version /// Current package version
/// Used in [StreamChatClient] to build the `x-stream-client` header /// Used in [StreamChatClient] to build the `x-stream-client` header
// ignore: constant_identifier_names // ignore: constant_identifier_names
const PACKAGE_VERSION = '1.3.2+1-beta'; const PACKAGE_VERSION = '1.4.0-beta';
+1 -1
View File
@@ -1,7 +1,7 @@
name: stream_chat name: stream_chat
homepage: https://getstream.io/ homepage: https://getstream.io/
description: The official Dart client for Stream Chat, a service for building chat applications. description: The official Dart client for Stream Chat, a service for building chat applications.
version: 1.3.2+1-beta version: 1.4.0-beta
repository: https://github.com/GetStream/stream-chat-flutter repository: https://github.com/GetStream/stream-chat-flutter
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
+14
View File
@@ -1,3 +1,17 @@
## 1.4.0-beta
- Unfocus `MessageInput` only when sending commands
- Updated default error for `MessageSearchListView`
- Show error messages as system and keep them in the message input
- Remove notification badge logic
- Use shimmer while loading images
- Polished `StreamChatTheme` adding more options and a new `MessageInputTheme` dedicated to `MessageInput`
- Add possibility to specify custom message actions using `MessageWidget.customActions`
- Added `MessageListView.onAttachmentTap` callback
- Fixed message newline issue
- Fixed `MessageListView` scroll keyboard behaviour
- Minor fixes and improveqments
## 1.3.2-beta ## 1.3.2-beta
- Updated `stream_chat_core` dependency - Updated `stream_chat_core` dependency
@@ -45,10 +45,10 @@ class FileAttachment extends AttachmentWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Container( Container(
child: _getFileTypeImage(context),
height: 40.0, height: 40.0,
width: 33.33, width: 33.33,
margin: EdgeInsets.all(8.0), margin: EdgeInsets.all(8.0),
child: _getFileTypeImage(context),
), ),
SizedBox(width: 8.0), SizedBox(width: 8.0),
Expanded( Expanded(
@@ -143,6 +143,7 @@ class GiphyAttachment extends AttachmentWidget {
Card( Card(
color: Colors.white, color: Colors.white,
elevation: 2, elevation: 2,
shape: CircleBorder(),
child: IconButton( child: IconButton(
padding: const EdgeInsets.all(0), padding: const EdgeInsets.all(0),
constraints: BoxConstraints.tight(Size(32, 32)), constraints: BoxConstraints.tight(Size(32, 32)),
@@ -156,7 +157,6 @@ class GiphyAttachment extends AttachmentWidget {
}); });
}, },
), ),
shape: CircleBorder(),
), ),
Expanded( Expanded(
child: Center( child: Center(
@@ -171,6 +171,7 @@ class GiphyAttachment extends AttachmentWidget {
Card( Card(
color: Colors.white, color: Colors.white,
elevation: 2, elevation: 2,
shape: CircleBorder(),
child: IconButton( child: IconButton(
padding: const EdgeInsets.all(0), padding: const EdgeInsets.all(0),
constraints: BoxConstraints.tight(Size(32, 32)), constraints: BoxConstraints.tight(Size(32, 32)),
@@ -184,7 +185,6 @@ class GiphyAttachment extends AttachmentWidget {
}); });
}, },
), ),
shape: CircleBorder(),
), ),
], ],
), ),
@@ -9,26 +9,32 @@ import 'package:path_provider/path_provider.dart';
import '../stream_chat_flutter.dart'; import '../stream_chat_flutter.dart';
import 'extension.dart'; import 'extension.dart';
/// Callback to download an attachment asset
typedef AttachmentDownloader = Future<String> Function( typedef AttachmentDownloader = Future<String> Function(
Attachment attachment, { Attachment attachment, {
ProgressCallback progressCallback, ProgressCallback progressCallback,
}); });
/// Widget that shows the options in the gallery view
class AttachmentActionsModal extends StatelessWidget { class AttachmentActionsModal extends StatelessWidget {
/// The message containing the attachments
final Message message; final Message message;
final String userName;
final String sentAt; /// Current page index
final List<Attachment> attachments;
final currentIndex; final currentIndex;
/// Callback to show the message
final VoidCallback onShowMessage; final VoidCallback onShowMessage;
/// Callback to download images
final AttachmentDownloader imageDownloader; final AttachmentDownloader imageDownloader;
/// Callback to provide download files
final AttachmentDownloader fileDownloader; final AttachmentDownloader fileDownloader;
/// Returns a new [AttachmentActionsModal]
const AttachmentActionsModal({ const AttachmentActionsModal({
this.message, this.message,
this.userName,
this.sentAt,
this.attachments,
this.currentIndex, this.currentIndex,
this.onShowMessage, this.onShowMessage,
this.imageDownloader, this.imageDownloader,
@@ -85,13 +91,13 @@ class AttachmentActionsModal extends StatelessWidget {
), ),
_buildButton( _buildButton(
context, context,
'Save ${attachments[currentIndex].type == 'video' ? 'Video' : 'Image'}', 'Save ${message.attachments[currentIndex].type == 'video' ? 'Video' : 'Image'}',
StreamSvgIcon.iconSave( StreamSvgIcon.iconSave(
size: 24.0, size: 24.0,
color: theme.colorTheme.grey, color: theme.colorTheme.grey,
), ),
() { () {
final attachment = attachments[currentIndex]; final attachment = message.attachments[currentIndex];
final isImage = attachment.type == 'image'; final isImage = attachment.type == 'image';
final saveFile = fileDownloader ?? _downloadAttachment; final saveFile = fileDownloader ?? _downloadAttachment;
final saveImage = imageDownloader ?? _downloadAttachment; final saveImage = imageDownloader ?? _downloadAttachment;
@@ -71,12 +71,12 @@ class _ChannelFileDisplayScreenState extends State<ChannelFileDisplayScreen> {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
child: Container( child: Container(
width: 24.0,
height: 24.0,
child: StreamSvgIcon.left( child: StreamSvgIcon.left(
color: StreamChatTheme.of(context).colorTheme.black, color: StreamChatTheme.of(context).colorTheme.black,
size: 24.0, size: 24.0,
), ),
width: 24.0,
height: 24.0,
), ),
), ),
), ),
@@ -223,8 +223,8 @@ class _ChannelListViewState extends State<ChannelListView> {
} }
return AnimatedSwitcher( return AnimatedSwitcher(
child: child,
duration: const Duration(milliseconds: 500), duration: const Duration(milliseconds: 500),
child: child,
); );
} }
@@ -469,8 +469,8 @@ class _ChannelListViewState extends State<ChannelListView> {
MaterialPageRoute( MaterialPageRoute(
builder: (context) { builder: (context) {
return StreamChannel( return StreamChannel(
child: widget.channelWidget,
channel: client, channel: client,
child: widget.channelWidget,
); );
}, },
), ),
@@ -506,12 +506,12 @@ class _ChannelListViewState extends State<ChannelListView> {
context: context, context: context,
builder: (context) { builder: (context) {
return StreamChannel( return StreamChannel(
channel: channel,
child: ChannelBottomSheet( child: ChannelBottomSheet(
onViewInfoTap: () { onViewInfoTap: () {
widget.onViewInfoTap(channel); widget.onViewInfoTap(channel);
}, },
), ),
channel: channel,
); );
}, },
); );
@@ -592,13 +592,13 @@ class _ChannelListViewState extends State<ChannelListView> {
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 8), padding: const EdgeInsets.symmetric(horizontal: 8),
child: StreamChannel( child: StreamChannel(
channel: channel,
child: ChannelName( child: ChannelName(
textStyle: TextStyle( textStyle: TextStyle(
fontSize: 12, fontSize: 12,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
), ),
), ),
channel: channel,
), ),
), ),
], ],
@@ -78,12 +78,12 @@ class _ChannelMediaDisplayScreenState extends State<ChannelMediaDisplayScreen> {
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
child: Container( child: Container(
width: 24.0,
height: 24.0,
child: StreamSvgIcon.left( child: StreamSvgIcon.left(
color: StreamChatTheme.of(context).colorTheme.black, color: StreamChatTheme.of(context).colorTheme.black,
size: 24.0, size: 24.0,
), ),
width: 24.0,
height: 24.0,
), ),
), ),
), ),
@@ -237,13 +237,13 @@ class _ImageFooterState extends State<ImageFooter> {
media = InkWell( media = InkWell(
onTap: () => widget.mediaSelectedCallBack(index), onTap: () => widget.mediaSelectedCallBack(index),
child: AspectRatio( child: AspectRatio(
aspectRatio: 1.0,
child: CachedNetworkImage( child: CachedNetworkImage(
imageUrl: attachment.imageUrl ?? imageUrl: attachment.imageUrl ??
attachment.assetUrl ?? attachment.assetUrl ??
attachment.thumbUrl, attachment.thumbUrl,
fit: BoxFit.cover, fit: BoxFit.cover,
), ),
aspectRatio: 1.0,
), ),
); );
} }
@@ -111,10 +111,7 @@ class ImageHeader extends StatelessWidget implements PreferredSizeWidget {
return StreamChannel( return StreamChannel(
channel: channel, channel: channel,
child: AttachmentActionsModal( child: AttachmentActionsModal(
userName: userName,
sentAt: sentAt,
message: message, message: message,
attachments: urls,
currentIndex: currentIndex, currentIndex: currentIndex,
onShowMessage: onShowMessage, onShowMessage: onShowMessage,
), ),
@@ -56,6 +56,11 @@ class _MediaListViewState extends State<MediaListView> {
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 1.0, vertical: 1.0), padding: const EdgeInsets.symmetric(horizontal: 1.0, vertical: 1.0),
child: InkWell( child: InkWell(
onTap: () {
if (widget.onSelect != null) {
widget.onSelect(media);
}
},
child: Stack( child: Stack(
children: [ children: [
AspectRatio( AspectRatio(
@@ -125,11 +130,6 @@ class _MediaListViewState extends State<MediaListView> {
] ]
], ],
), ),
onTap: () {
if (widget.onSelect != null) {
widget.onSelect(media);
}
},
), ),
); );
}, },
@@ -417,8 +417,8 @@ class MessageInputState extends State<MessageInput> {
Widget _animateSendButton(BuildContext context) { Widget _animateSendButton(BuildContext context) {
final sendButton = widget.activeSendButton != null final sendButton = widget.activeSendButton != null
? InkWell( ? InkWell(
child: widget.activeSendButton,
onTap: sendMessage, onTap: sendMessage,
child: widget.activeSendButton,
) )
: _buildSendButton(context); : _buildSendButton(context);
return Padding( return Padding(
@@ -1083,81 +1083,81 @@ class MessageInputState extends State<MessageInput> {
switch (iconType) { switch (iconType) {
case 'giphy': case 'giphy':
return CircleAvatar( return CircleAvatar(
radius: 12,
child: StreamSvgIcon.giphyIcon( child: StreamSvgIcon.giphyIcon(
size: 24.0, size: 24.0,
), ),
radius: 12,
); );
break; break;
case 'ban': case 'ban':
return CircleAvatar( return CircleAvatar(
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue, backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
radius: 12,
child: StreamSvgIcon.iconUserDelete( child: StreamSvgIcon.iconUserDelete(
size: 16.0, size: 16.0,
color: Colors.white, color: Colors.white,
), ),
radius: 12,
); );
break; break;
case 'flag': case 'flag':
return CircleAvatar( return CircleAvatar(
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue, backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
radius: 12,
child: StreamSvgIcon.flag( child: StreamSvgIcon.flag(
size: 14.0, size: 14.0,
color: Colors.white, color: Colors.white,
), ),
radius: 12,
); );
break; break;
case 'imgur': case 'imgur':
return CircleAvatar( return CircleAvatar(
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue, backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
radius: 12,
child: ClipOval( child: ClipOval(
child: StreamSvgIcon.imgur( child: StreamSvgIcon.imgur(
size: 24.0, size: 24.0,
), ),
), ),
radius: 12,
); );
break; break;
case 'mute': case 'mute':
return CircleAvatar( return CircleAvatar(
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue, backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
radius: 12,
child: StreamSvgIcon.mute( child: StreamSvgIcon.mute(
size: 16.0, size: 16.0,
color: Colors.white, color: Colors.white,
), ),
radius: 12,
); );
break; break;
case 'unban': case 'unban':
return CircleAvatar( return CircleAvatar(
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue, backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
radius: 12,
child: StreamSvgIcon.userAdd( child: StreamSvgIcon.userAdd(
size: 16.0, size: 16.0,
color: Colors.white, color: Colors.white,
), ),
radius: 12,
); );
break; break;
case 'unmute': case 'unmute':
return CircleAvatar( return CircleAvatar(
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue, backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
radius: 12,
child: StreamSvgIcon.volumeUp( child: StreamSvgIcon.volumeUp(
size: 16.0, size: 16.0,
color: Colors.white, color: Colors.white,
), ),
radius: 12,
); );
break; break;
default: default:
return CircleAvatar( return CircleAvatar(
backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue, backgroundColor: StreamChatTheme.of(context).colorTheme.accentBlue,
radius: 12,
child: StreamSvgIcon.lightning( child: StreamSvgIcon.lightning(
size: 16.0, size: 16.0,
color: Colors.white, color: Colors.white,
), ),
radius: 12,
); );
break; break;
} }
@@ -1677,8 +1677,8 @@ class MessageInputState extends State<MessageInput> {
); );
default: default:
return Container( return Container(
child: Icon(Icons.insert_drive_file),
color: Colors.black26, color: Colors.black26,
child: Icon(Icons.insert_drive_file),
); );
} }
} }
@@ -2147,6 +2147,9 @@ class MessageInputState extends State<MessageInput> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
TextButton( TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text( child: Text(
'OK', 'OK',
style: StreamChatTheme.of(context) style: StreamChatTheme.of(context)
@@ -2157,9 +2160,6 @@ class MessageInputState extends State<MessageInput> {
.colorTheme .colorTheme
.accentBlue), .accentBlue),
), ),
onPressed: () {
Navigator.of(context).pop();
},
), ),
], ],
), ),
@@ -2298,6 +2298,7 @@ class __PickerWidgetState extends State<_PickerWidget> {
child: Container( child: Container(
constraints: BoxConstraints.expand(), constraints: BoxConstraints.expand(),
color: StreamChatTheme.of(context).colorTheme.whiteSmoke, color: StreamChatTheme.of(context).colorTheme.whiteSmoke,
alignment: Alignment.center,
child: Text( child: Text(
'Add more files', 'Add more files',
style: TextStyle( style: TextStyle(
@@ -2305,7 +2306,6 @@ class __PickerWidgetState extends State<_PickerWidget> {
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
), ),
alignment: Alignment.center,
), ),
); );
} }
@@ -624,9 +624,6 @@ class _MessageListViewState extends State<MessageListView> {
children: [ children: [
FloatingActionButton( FloatingActionButton(
backgroundColor: StreamChatTheme.of(context).colorTheme.white, backgroundColor: StreamChatTheme.of(context).colorTheme.white,
child: StreamSvgIcon.down(
color: StreamChatTheme.of(context).colorTheme.black,
),
onPressed: () { onPressed: () {
if (unreadCount > 0) { if (unreadCount > 0) {
streamChannel.channel.markRead(); streamChannel.channel.markRead();
@@ -644,6 +641,9 @@ class _MessageListViewState extends State<MessageListView> {
); );
} }
}, },
child: StreamSvgIcon.down(
color: StreamChatTheme.of(context).colorTheme.black,
),
), ),
if (showUnreadCount) if (showUnreadCount)
Positioned( Positioned(
@@ -1045,10 +1045,6 @@ class _MessageListViewState extends State<MessageListView> {
end: colorTheme.white.withOpacity(0), end: colorTheme.white.withOpacity(0),
), ),
duration: const Duration(seconds: 3), duration: const Duration(seconds: 3),
child: Padding(
padding: const EdgeInsets.only(top: 4.0),
child: child,
),
onEnd: () => initialMessageHighlightComplete = true, onEnd: () => initialMessageHighlightComplete = true,
builder: (_, color, child) { builder: (_, color, child) {
return Container( return Container(
@@ -1056,6 +1052,10 @@ class _MessageListViewState extends State<MessageListView> {
child: child, child: child,
); );
}, },
child: Padding(
padding: const EdgeInsets.only(top: 4.0),
child: child,
),
); );
} }
return child; return child;
@@ -238,6 +238,9 @@ class MessageReactionsModal extends StatelessWidget {
borderRadius: BorderRadius.circular(32), borderRadius: BorderRadius.circular(32),
), ),
Positioned( Positioned(
bottom: 6,
left: isCurrentUser ? -3 : null,
right: isCurrentUser ? -3 : null,
child: Align( child: Align(
alignment: alignment:
reverse ? Alignment.centerRight : Alignment.centerLeft, reverse ? Alignment.centerRight : Alignment.centerLeft,
@@ -251,9 +254,6 @@ class MessageReactionsModal extends StatelessWidget {
highlightOwnReactions: false, highlightOwnReactions: false,
), ),
), ),
bottom: 6,
left: isCurrentUser ? -3 : null,
right: isCurrentUser ? -3 : null,
), ),
], ],
), ),
@@ -377,9 +377,9 @@ class _MessageWidgetState extends State<MessageWidget>
portal: Container( portal: Container(
transform: transform:
Matrix4.translationValues(-12, 0, 0), Matrix4.translationValues(-12, 0, 0),
child: _buildReactionIndicator(context),
constraints: constraints:
BoxConstraints(maxWidth: 22 * 6.0), BoxConstraints(maxWidth: 22 * 6.0),
child: _buildReactionIndicator(context),
), ),
portalAnchor: Alignment(-1.0, -1.0), portalAnchor: Alignment(-1.0, -1.0),
childAnchor: Alignment(1, -1.0), childAnchor: Alignment(1, -1.0),
@@ -94,6 +94,19 @@ class _ReactionPickerState extends State<ReactionPicker>
height: 24, height: 24,
width: 24, width: 24,
), ),
onPressed: () {
if (ownReactionIndex != -1) {
removeReaction(
context,
widget.message.ownReactions[ownReactionIndex],
);
} else {
sendReaction(
context,
reactionIcon.type,
);
}
},
child: AnimatedBuilder( child: AnimatedBuilder(
animation: animations[index], animation: animations[index],
builder: (context, val) { builder: (context, val) {
@@ -121,19 +134,6 @@ class _ReactionPickerState extends State<ReactionPicker>
), ),
); );
}), }),
onPressed: () {
if (ownReactionIndex != -1) {
removeReaction(
context,
widget.message.ownReactions[ownReactionIndex],
);
} else {
sendReaction(
context,
reactionIcon.type,
);
}
},
), ),
); );
}) })
@@ -92,9 +92,9 @@ class StreamChatState extends State<StreamChat> {
), ),
child: StreamChatCore( child: StreamChatCore(
client: client, client: client,
child: widget.child,
onBackgroundEventReceived: widget.onBackgroundEventReceived, onBackgroundEventReceived: widget.onBackgroundEventReceived,
backgroundKeepAlive: widget.backgroundKeepAlive, backgroundKeepAlive: widget.backgroundKeepAlive,
child: widget.child,
), ),
); );
}, },
@@ -13,7 +13,6 @@ class StreamNeumorphicButton extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
child: child,
margin: EdgeInsets.all(8.0), margin: EdgeInsets.all(8.0),
height: 40, height: 40,
width: 40, width: 40,
@@ -35,6 +34,7 @@ class StreamNeumorphicButton extends StatelessWidget {
), ),
], ],
), ),
child: child,
); );
} }
} }
@@ -28,6 +28,9 @@ class UrlAttachment extends StatelessWidget {
Container( Container(
clipBehavior: Clip.antiAliasWithSaveLayer, clipBehavior: Clip.antiAliasWithSaveLayer,
margin: EdgeInsets.symmetric(horizontal: 8.0), margin: EdgeInsets.symmetric(horizontal: 8.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
),
child: Stack( child: Stack(
children: [ children: [
CachedNetworkImage( CachedNetworkImage(
@@ -39,6 +42,12 @@ class UrlAttachment extends StatelessWidget {
left: 0.0, left: 0.0,
bottom: -1, bottom: -1,
child: Container( child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topRight: Radius.circular(16.0),
),
color: StreamChatTheme.of(context).colorTheme.blueAlice,
),
child: Padding( child: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
top: 8.0, top: 8.0,
@@ -57,19 +66,10 @@ class UrlAttachment extends StatelessWidget {
), ),
), ),
), ),
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topRight: Radius.circular(16.0),
),
color: StreamChatTheme.of(context).colorTheme.blueAlice,
),
), ),
), ),
], ],
), ),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
),
), ),
Padding( Padding(
padding: textPadding, padding: textPadding,
+1 -1
View File
@@ -1,7 +1,7 @@
name: stream_chat_flutter name: stream_chat_flutter
homepage: https://github.com/GetStream/stream-chat-flutter homepage: https://github.com/GetStream/stream-chat-flutter
description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter.
version: 1.3.2-beta version: 1.4.0-beta
repository: https://github.com/GetStream/stream-chat-flutter repository: https://github.com/GetStream/stream-chat-flutter
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
@@ -1,3 +1,8 @@
## 1.4.0-beta
* Added `MessageListCore.messageFilter` to filter messages locally
* Minor fixes and improvements
## 1.3.2-beta ## 1.3.2-beta
* Update llc dependency * Update llc dependency
@@ -1,7 +1,7 @@
name: stream_chat_flutter_core name: stream_chat_flutter_core
homepage: https://github.com/GetStream/stream-chat-flutter homepage: https://github.com/GetStream/stream-chat-flutter
description: Stream Chat official Flutter SDK Core. Build your own chat experience using Dart and Flutter. description: Stream Chat official Flutter SDK Core. Build your own chat experience using Dart and Flutter.
version: 1.3.2-beta version: 1.4.0-beta
repository: https://github.com/GetStream/stream-chat-flutter repository: https://github.com/GetStream/stream-chat-flutter
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues
@@ -1,3 +1,7 @@
## 1.4.0-beta
* Update llc dependency
## 1.3.0-beta ## 1.3.0-beta
* Update llc dependency * Update llc dependency
@@ -11,7 +11,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
cupertino_icons: ^1.0.0 cupertino_icons: ^1.0.0
stream_chat: ^1.3.0 stream_chat: ^1.4.0
stream_chat_persistence: stream_chat_persistence:
path: ../ path: ../
@@ -1,7 +1,7 @@
name: stream_chat_persistence name: stream_chat_persistence
homepage: https://github.com/GetStream/stream-chat-flutter homepage: https://github.com/GetStream/stream-chat-flutter
description: Official Stream Chat Persistence library. Build your own chat experience using Dart and Flutter. description: Official Stream Chat Persistence library. Build your own chat experience using Dart and Flutter.
version: 1.3.0-beta version: 1.4.0-beta
repository: https://github.com/GetStream/stream-chat-flutter repository: https://github.com/GetStream/stream-chat-flutter
issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues