local_image_pager

Last updated:

0 purchases

local_image_pager Image
local_image_pager Images
Add to Cart

Description:

local image pager

local_image_pager #
A plugin for showing your device's local images with pagination.

Features #

Get total number of images in your device.
Fetch local images with pagination.

Getting started #
In the pubspec.yaml of your flutter project, add the following dependency:
dependencies:
...
local_image_pager:
copied to clipboard
In your library add the following import:
import 'package:local_image_pager/local_image_pager.dart';
copied to clipboard
For help getting started with Flutter, view the online documentation.
How to use #
See the example below. For more info, check the example project.

@override
Widget build(BuildContext context) {
// Calculate the thumbnail's size first to improve performance.
final itemSize = ((MediaQuery.of(context).size.width -
spacing * (cross_axis_count - 1) - horizontal_padding * 2) /
cross_axis_count);

final cacheSize = (itemSize * 1.5).round();

final pager = LocalImagePager();

return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Local images pager'),
),
body: Column(children: [
const SizedBox(height: 100,
child: Center(child: Text('Your own widget here.', style: TextStyle(fontSize: 20, color: Colors.blue, fontWeight: FontWeight.bold),),)),
Expanded(child: FutureBuilder(
future: _initPermissions,
builder: (context, snapshot) {
if (snapshot.hasData) {
if (snapshot.data) {
return FutureBuilder(
future: LocalImagePager.totalNumber,
builder: (context, snapshot) {
if (snapshot.hasData) {
final count = snapshot.data;
if (count == 0) {
return const Center(
child: Text('No images'),
);
} else {
return GridView.builder(
padding: const EdgeInsets.symmetric(horizontal: horizontal_padding),
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: cross_axis_count,
mainAxisSpacing: spacing,
crossAxisSpacing: spacing,
),
itemCount: count,
itemBuilder: (context, index) =>
_itemBuilder(
pager, count, index, itemSize, cacheSize));
}
} else if (snapshot.hasError) {
return Center(
child: Text(
snapshot.error.toString(),
style: const TextStyle(color: Colors.red),
),
);
} else {
return const Center(
child: CircularProgressIndicator());
}
},
);
} else {
return Column(
children: [
const Text(
'Permission not granted, try again.',
style: const TextStyle(color: Colors.red),
),
FlatButton(
onPressed: () {
setState(() {});
},
child: const Text('OK'))
],
);
}
} else if (snapshot.hasError) {
return Center(
child: Text(
snapshot.error.toString(),
style: const TextStyle(color: Colors.red),
),
);
} else {
return const Center(child: CircularProgressIndicator());
}
},
),)
])),
);
}

Widget _itemBuilder(
LocalImagePager paginate, int totalNumber, int index, double itemSize, int cacheSize) {
_load(paginate, totalNumber, index);

return FutureBuilder(
future: _completers[index].future,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Image.file(
File(snapshot.data),
fit: BoxFit.cover,
height: itemSize,
cacheHeight: cacheSize,
);
} else if (snapshot.hasError) {
print('_itemBuilder:error:${snapshot.error.toString()}');
return const SizedBox(
width: 0,
height: 0,
);
} else {
return const SizedBox(
width: 0,
height: 0,
);
}
},
);
}

_load(LocalImagePager paginate, int count, int itemIndex) async {
if (itemIndex % per_load_count != 0) {
return;
}

if (itemIndex >= _completers.length) {
final toLoad = min(count - itemIndex, per_load_count);
if (toLoad > 0) {
_completers.addAll(List.generate(toLoad, (index) {
return Completer();
}));

try {
final images =
await paginate.latestImages(itemIndex, itemIndex + toLoad - 1);
images.asMap().forEach((index, item) {
_completers[itemIndex + index].complete(item);
});
} catch (e) {
print('_load:error:${e.toString()}');
_completers
.sublist(itemIndex, itemIndex + toLoad)
.forEach((completer) {
completer.completeError(e);
});
}
}
}
}

copied to clipboard
Permissions #
Applications using this plugin require the following user permissions.
iOS #
Add the following key to your Info.plist file, located in <project root>/ios/Runner/Info.plist:

NSPhotoLibraryUsageDescription - describe why your app needs permission for the photo library. This is called Privacy - Photo Library Usage Description in the visual editor. This permission is required for the app to read the image and album information.

Android #
Add the storage permission to your AndroidManifest.xml file, located in <project root>/android/app/src/main/AndroidManifest.xml:

android.permission.READ_EXTERNAL_STORAGE - this allows the app to query and read the image and album information.

License:

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Files In This Product:

Customer Reviews

There are no reviews.