add carousel on tap

This commit is contained in:
Salvatore Giordano
2020-07-23 13:57:16 +02:00
parent 02a3642894
commit 808cc223a1
5 changed files with 130 additions and 70 deletions
+1 -3
View File
@@ -15,15 +15,13 @@ class FullScreenImage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return PhotoView(
child: PhotoView(
imageProvider: CachedNetworkImageProvider(url), imageProvider: CachedNetworkImageProvider(url),
maxScale: PhotoViewComputedScale.covered, maxScale: PhotoViewComputedScale.covered,
minScale: PhotoViewComputedScale.contained, minScale: PhotoViewComputedScale.contained,
heroAttributes: PhotoViewHeroAttributes( heroAttributes: PhotoViewHeroAttributes(
tag: url, tag: url,
), ),
),
); );
} }
} }
+7 -2
View File
@@ -39,13 +39,18 @@ class ImageAttachment extends StatelessWidget {
Expanded( Expanded(
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (_) { Navigator.push(
context,
MaterialPageRoute(
builder: (_) {
return FullScreenImage( return FullScreenImage(
url: attachment.imageUrl ?? url: attachment.imageUrl ??
attachment.assetUrl ?? attachment.assetUrl ??
attachment.thumbUrl, attachment.thumbUrl,
); );
})); },
),
);
}, },
child: CachedNetworkImage( child: CachedNetworkImage(
height: size?.height, height: size?.height,
+94 -37
View File
@@ -1,17 +1,18 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:carousel_slider/carousel_options.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat/stream_chat.dart';
import 'package:stream_chat_flutter/src/message_widget.dart'; import 'package:stream_chat_flutter/src/full_screen_image.dart';
class ImageGroup extends StatelessWidget { class ImageGroup extends StatelessWidget {
const ImageGroup({ const ImageGroup({
Key key, Key key,
@required this.imageBuilder,
@required this.images, @required this.images,
@required this.message, @required this.message,
this.size, this.size,
}) : super(key: key); }) : super(key: key);
final AttachmentBuilder imageBuilder;
final List<Attachment> images; final List<Attachment> images;
final Message message; final Message message;
final Size size; final Size size;
@@ -20,59 +21,63 @@ class ImageGroup extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ConstrainedBox( return ConstrainedBox(
constraints: BoxConstraints.loose(size), constraints: BoxConstraints.loose(size),
child: Column( child: Flex(
mainAxisSize: MainAxisSize.min, direction: Axis.vertical,
children: <Widget>[ children: <Widget>[
FittedBox( Flexible(
fit: BoxFit.cover, flex: 1,
child: Row( fit: FlexFit.tight,
mainAxisSize: MainAxisSize.min, child: Flex(
crossAxisAlignment: CrossAxisAlignment.stretch,
direction: Axis.horizontal,
children: [ children: [
imageBuilder( Flexible(
context, flex: 1,
message, fit: FlexFit.tight,
images[0], child: _buildImage(context, 0),
), ),
Padding( Flexible(
padding: const EdgeInsets.only(left: 4.0), flex: 1,
child: imageBuilder( fit: FlexFit.tight,
context, child: Padding(
message, padding: const EdgeInsets.only(left: 2.0),
images[1], child: _buildImage(context, 1),
), ),
), ),
], ],
), ),
), ),
if (images.length >= 3) if (images.length >= 3)
Padding( Flexible(
fit: FlexFit.tight,
flex: 1,
child: Padding(
padding: const EdgeInsets.only(top: 2.0), padding: const EdgeInsets.only(top: 2.0),
child: FittedBox( child: Flex(
fit: BoxFit.cover, direction: Axis.horizontal,
child: Row( crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
imageBuilder( Flexible(
context, fit: FlexFit.tight,
message, flex: 1,
images[2], child: _buildImage(context, 2),
), ),
if (images.length >= 4) if (images.length >= 4)
Padding( Flexible(
padding: const EdgeInsets.only(left: 4.0), fit: FlexFit.tight,
flex: 1,
child: Padding(
padding: const EdgeInsets.only(left: 2.0),
child: Stack( child: Stack(
fit: StackFit.expand,
children: <Widget>[ children: <Widget>[
imageBuilder( _buildImage(context, 3),
context,
message,
images[3],
),
if (images.length > 4) if (images.length > 4)
Positioned.fill( Positioned.fill(
child: GestureDetector(
onTap: () => _onTap(context, 3),
child: Material( child: Material(
color: Colors.black38, color: Colors.black38,
child: InkWell(
onTap: () {},
child: Center( child: Center(
child: Text( child: Text(
'${images.length - 4} +', '${images.length - 4} +',
@@ -88,6 +93,7 @@ class ImageGroup extends StatelessWidget {
], ],
), ),
), ),
),
], ],
), ),
), ),
@@ -96,4 +102,55 @@ class ImageGroup extends StatelessWidget {
), ),
); );
} }
void _onTap(
BuildContext context, [
int index,
]) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.transparent,
iconTheme: IconThemeData(
color: Colors.white,
),
),
backgroundColor: Colors.black,
body: SizedBox.expand(
child: CarouselSlider(
items: images
.map((image) => FullScreenImage(
url: image.imageUrl ??
image.thumbUrl ??
image.assetUrl,
))
.toList(),
options: CarouselOptions(
initialPage: index ?? 0,
enableInfiniteScroll: false,
viewportFraction: 0.95,
height: MediaQuery.of(context).size.height,
),
),
),
);
},
),
);
}
Widget _buildImage(BuildContext context, int index) {
return GestureDetector(
onTap: () => _onTap(context, index),
child: CachedNetworkImage(
imageUrl: images[index].imageUrl ??
images[index].thumbUrl ??
images[index].assetUrl,
fit: BoxFit.cover,
),
);
}
} }
+2 -3
View File
@@ -530,17 +530,16 @@ class _MessageWidgetState extends State<MessageWidget> {
.toList(); .toList();
if (images.length > 1) { if (images.length > 1) {
final imageBuilder = widget.attachmentBuilders['image'];
return [ return [
wrapAttachmentWidget( wrapAttachmentWidget(
context, context,
Material( Material(
color: widget.messageTheme.messageBackgroundColor, color: widget.messageTheme.messageBackgroundColor,
child: ImageGroup( child: ImageGroup(
size: Size.fromWidth( size: Size(
MediaQuery.of(context).size.width * 0.8, MediaQuery.of(context).size.width * 0.8,
MediaQuery.of(context).size.height * 0.3,
), ),
imageBuilder: imageBuilder,
images: images, images: images,
message: widget.message, message: widget.message,
), ),
+1
View File
@@ -30,6 +30,7 @@ dependencies:
line_awesome_icons: ^1.0.4+2 line_awesome_icons: ^1.0.4+2
http_parser: ^3.1.4 http_parser: ^3.1.4
flutter_slidable: ^0.5.4 flutter_slidable: ^0.5.4
carousel_slider: ^2.2.1
flutter: flutter:
assets: assets: