Skip to content

Commit

Permalink
Merge pull request #5 from thesmythgroup/cleanup_pub_spec_warnings
Browse files Browse the repository at this point in the history
Cleanup pub spec warnings
  • Loading branch information
jfahrenkrug authored Oct 1, 2021
2 parents 29a467d + 0edcdad commit e30d98c
Show file tree
Hide file tree
Showing 15 changed files with 342 additions and 209 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,8 @@
## 1.0.1

- Update demo image path in README.

## 1.0.2

- Provide more comprehensive example.
- Structure lib directory using a src folder.
106 changes: 106 additions & 0 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import 'package:easy_image_viewer/easy_image_viewer.dart';
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'EasyImageViewer Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'EasyImageViewer Demo'),
);
}
}

class MyHomePage extends StatefulWidget {
final String title;

const MyHomePage({
Key? key,
required this.title,
}) : super(key: key);

@override
_MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
final List<ImageProvider> _imageProviders = [
Image.network("https://picsum.photos/id/1001/5616/3744").image,
Image.network("https://picsum.photos/id/1003/1181/1772").image,
Image.network("https://picsum.photos/id/1004/5616/3744").image,
Image.network("https://picsum.photos/id/1005/5760/3840").image
];

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
child: const Text("Show Single Image"),
onPressed: () {
showImageViewer(
context,
Image.network("https://picsum.photos/id/1001/5616/3744")
.image);
}),
ElevatedButton(
child: const Text("Show Multiple Images (Simple)"),
onPressed: () {
MultiImageProvider multiImageProvider =
MultiImageProvider(_imageProviders);
showImageViewerPager(context, multiImageProvider);
}),
ElevatedButton(
child: const Text("Show Multiple Images (Custom)"),
onPressed: () {
CustomImageProvider customImageProvider = CustomImageProvider(
imageUrls: [
"https://picsum.photos/id/1001/5616/3744",
"https://picsum.photos/id/1003/1181/1772",
"https://picsum.photos/id/1004/5616/3744",
"https://picsum.photos/id/1005/5760/3840"
].toList(),
initialIndex: 2);
showImageViewerPager(context, customImageProvider,
onPageChanged: (page) {
// print("Page changed to $page");
}, onViewerDismissed: (page) {
// print("Dismissed while on page $page");
});
})
],
)),
);
}
}

class CustomImageProvider extends EasyImageProvider {
@override
final int initialIndex;
final List<String> imageUrls;

CustomImageProvider({required this.imageUrls, this.initialIndex = 0})
: super();

@override
ImageProvider<Object> imageBuilder(BuildContext context, int index) {
return NetworkImage(imageUrls[index]);
}

@override
int get imageCount => imageUrls.length;
}
124 changes: 62 additions & 62 deletions lib/easy_image_viewer.dart
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
/// A library to easily display images in a full-screen dialog.
/// It supports pinch & zoom, and paging through multiple images.
library easy_image_viewer;

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'easy_image_provider.dart';
import 'easy_image_view_pager.dart';
import 'single_image_provider.dart';
import 'src/easy_image_provider.dart';
import 'src/easy_image_view_pager.dart';
import 'src/single_image_provider.dart';

export 'easy_image_provider.dart' show EasyImageProvider;
export 'multi_image_provider.dart' show MultiImageProvider;
export 'src/easy_image_provider.dart' show EasyImageProvider;
export 'src/single_image_provider.dart' show SingleImageProvider;
export 'src/multi_image_provider.dart' show MultiImageProvider;

export 'src/easy_image_view.dart' show EasyImageView;
export 'src/easy_image_view_pager.dart' show EasyImageViewPager;

/// Shows the given [imageProvider] in a full-screen [Dialog].
/// Setting [immersive] to false will prevent the top and bottom bars from being hidden.
/// The optional [onViewerDismissed] callback function is called when the dialog is closed.
Future<Dialog?> showImageViewer(
BuildContext context,
ImageProvider imageProvider,
{
bool immersive = true,
void Function()? onViewerDismissed
}
) {
return showImageViewerPager(
context,
SingleImageProvider(imageProvider),
immersive: immersive,
onViewerDismissed: onViewerDismissed != null ? (_) => onViewerDismissed() : null);
BuildContext context, ImageProvider imageProvider,
{bool immersive = true, void Function()? onViewerDismissed}) {
return showImageViewerPager(context, SingleImageProvider(imageProvider),
immersive: immersive,
onViewerDismissed:
onViewerDismissed != null ? (_) => onViewerDismissed() : null);
}

/// Shows the images provided by the [imageProvider] in a full-screen PageView [Dialog].
Expand All @@ -37,23 +37,19 @@ Future<Dialog?> showImageViewer(
/// The [closeButtonTooltip] text is displayed when the user long-presses on the
/// close button and is used for accessibility.
Future<Dialog?> showImageViewerPager(
BuildContext context,
EasyImageProvider imageProvider,
{
bool immersive = true,
BuildContext context, EasyImageProvider imageProvider,
{bool immersive = true,
void Function(int)? onPageChanged,
void Function(int)? onViewerDismissed,
String closeButtonTooltip = 'Close'
}
) {

String closeButtonTooltip = 'Close'}) {
if (immersive) {
// Hide top and bottom bars
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
}

void Function()? internalPageChangeListener;
final pageController = PageController(initialPage: imageProvider.initialIndex);
final pageController =
PageController(initialPage: imageProvider.initialIndex);

if (onPageChanged != null) {
internalPageChangeListener = () {
Expand All @@ -62,41 +58,45 @@ Future<Dialog?> showImageViewerPager(
pageController.addListener(internalPageChangeListener);
}

return showDialog<Dialog>(context: context, builder: (context) {
return Dialog(
backgroundColor: Colors.black,
insetPadding: const EdgeInsets.all(0),
child: Stack(
clipBehavior: Clip.none,
alignment: Alignment.center,
children: <Widget>[
EasyImageViewPager(easyImageProvider: imageProvider, pageController: pageController),
Positioned(
top: 5,
right: 5,
child: IconButton(
icon: const Icon(Icons.close),
color: Colors.white,
tooltip: closeButtonTooltip,
onPressed: () {
Navigator.of(context).pop();
return showDialog<Dialog>(
context: context,
builder: (context) {
return Dialog(
backgroundColor: Colors.black,
insetPadding: const EdgeInsets.all(0),
child: Stack(
clipBehavior: Clip.none,
alignment: Alignment.center,
children: <Widget>[
EasyImageViewPager(
easyImageProvider: imageProvider,
pageController: pageController),
Positioned(
top: 5,
right: 5,
child: IconButton(
icon: const Icon(Icons.close),
color: Colors.white,
tooltip: closeButtonTooltip,
onPressed: () {
Navigator.of(context).pop();

if (onViewerDismissed != null) {
onViewerDismissed(pageController.page?.round() ?? 0);
}
if (onViewerDismissed != null) {
onViewerDismissed(
pageController.page?.round() ?? 0);
}

if (immersive) {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
}
if (internalPageChangeListener != null) {
pageController.removeListener(internalPageChangeListener);
}
pageController.dispose();
},
)
)
]
)
);
});
}
if (immersive) {
SystemChrome.setEnabledSystemUIMode(
SystemUiMode.edgeToEdge);
}
if (internalPageChangeListener != null) {
pageController
.removeListener(internalPageChangeListener);
}
pageController.dispose();
},
))
]));
});
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
library easy_image_viewer;

import 'package:flutter/material.dart';

/// Provider for images, their count and the initial index to display
/// Provider for images, their count and the initial index to display
abstract class EasyImageProvider {

/// Index of the initial image to display
int get initialIndex;

/// Total count of images
int get imageCount;

/// Returns the image for the given [index].
ImageProvider imageBuilder(BuildContext context, int index);
}
ImageProvider imageBuilder(BuildContext context, int index);
}
48 changes: 24 additions & 24 deletions lib/easy_image_view.dart → lib/src/easy_image_view.dart
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
library easy_image_viewer;

import 'package:flutter/material.dart';

/// A full-sized view that displays the given image, supporting pinch & zoom
class EasyImageView extends StatefulWidget {

/// The image to display
final ImageProvider imageProvider;

/// Minimum scale factor
final double minScale;

/// Maximum scale factor
final double maxScale;

/// Callback for when the scale has changed, only invoked at the end of
/// an interaction.
final void Function(double)? onScaleChanged;

/// Create a new instance
const EasyImageView({
Key? key,
Expand All @@ -28,29 +29,28 @@ class EasyImageView extends StatefulWidget {
}

class _EasyImageViewState extends State<EasyImageView> {
final TransformationController _transformationController =
TransformationController();

final TransformationController _transformationController = TransformationController();

@override
Widget build(BuildContext context) {
return SizedBox(
key: const Key('easy_image_sized_box'),
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: InteractiveViewer(
key: const Key('easy_image_interactive_viewer'),
transformationController: _transformationController,
minScale: widget.minScale,
maxScale: widget.maxScale,
child: Image(image: widget.imageProvider),
onInteractionEnd: (scaleEndDetails) {
double scale = _transformationController.value.getMaxScaleOnAxis();

if (widget.onScaleChanged != null) {
widget.onScaleChanged!(scale);
}
},
)
);
key: const Key('easy_image_sized_box'),
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: InteractiveViewer(
key: const Key('easy_image_interactive_viewer'),
transformationController: _transformationController,
minScale: widget.minScale,
maxScale: widget.maxScale,
child: Image(image: widget.imageProvider),
onInteractionEnd: (scaleEndDetails) {
double scale = _transformationController.value.getMaxScaleOnAxis();

if (widget.onScaleChanged != null) {
widget.onScaleChanged!(scale);
}
},
));
}
}
}
Loading

0 comments on commit e30d98c

Please sign in to comment.