thumbnailer 2.2.0 copy "thumbnailer: ^2.2.0" to clipboard
thumbnailer: ^2.2.0 copied to clipboard

Plugin that is able to generate thumbnails from files with various mime types. If thumbnail generation is not support for specific mime type, then a fallback icon is returned

example/lib/main.dart

import 'package:thumbnailer/thumbnailer.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';

void main() {
  runApp(MyApp());
}

/// example app demonstrating thumbnailer plugin
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    Thumbnailer.addCustomMimeTypesToIconDataMappings(<String, IconData>{
      'custom/mimeType': FontAwesomeIcons.key,
    });
  }

  final List<Tab> myTabs = <Tab>[
    const Tab(text: 'Icons'),
    const Tab(text: 'Images'),
    const Tab(text: 'Creation Strategies'),
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Padding(
          padding: const EdgeInsets.symmetric(vertical: 10),
          child: DefaultTabController(
            length: myTabs.length,
            child: Scaffold(
              appBar: AppBar(title: TabBar(tabs: myTabs)),
              body: TabBarView(
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.only(top: 5),
                    child: GridView.count(
                      crossAxisCount: 2,
                      children: <Widget>[
                        Column(
                          children: const <Widget>[
                            Thumbnail(
                              mimeType: 'text/html',
                              widgetSize: 100,
                            ),
                            Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'simplest Thumbnail , only set necessary params (mimeType,widgetSize)',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              mimeType: 'text/html',
                              widgetSize: 100,
                              decoration: WidgetDecoration(
                                backgroundColor: Colors.blueAccent,
                                iconColor: Colors.red,
                              ),
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'Thumbnail with set background color and icon color',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Container(
                              clipBehavior: Clip.hardEdge,
                              decoration:
                                  const BoxDecoration(shape: BoxShape.circle),
                              child: Thumbnail(
                                mimeType: 'text/html',
                                widgetSize: 100,
                                decoration: WidgetDecoration(
                                  backgroundColor: Colors.blueAccent,
                                  iconColor: Colors.red,
                                ),
                              ),
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'Rounded style parent',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              mimeType: 'text/html',
                              dataSize: 125000,
                              name: 'file name',
                              widgetSize: 100,
                              decoration: WidgetDecoration(
                                backgroundColor: Colors.blueAccent,
                                iconColor: Colors.red,
                              ),
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'Thumbnail with name and dataSize',
                                textAlign: TextAlign.center,
                                overflow: TextOverflow.clip,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              mimeType:
                                  'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                              dataSize: 125000,
                              name: 'file name',
                              widgetSize: 100,
                              decoration: WidgetDecoration(
                                backgroundColor: Colors.blueAccent,
                                iconColor: Colors.red,
                              ),
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Center(
                                child: Text(
                                  'Icons are set thanks to mimeType param and map Thumbnailer._mimeTypeToIconDataMap',
                                  overflow: TextOverflow.clip,
                                  textAlign: TextAlign.center,
                                ),
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              mimeType:
                                  'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                              dataSize: 125000,
                              name: 'file name',
                              widgetSize: 100,
                              decoration: WidgetDecoration(
                                backgroundColor: Colors.blueAccent,
                                iconColor: Colors.red,
                                textColor: Colors.red,
                                wrapperBgColor: Colors.black,
                              ),
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'Thumbnail with set text color and wrapper color',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              mimeType:
                                  'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                              dataSize: 125000,
                              name: 'file name',
                              widgetSize: 100,
                              onlyName: true,
                              decoration: WidgetDecoration(
                                backgroundColor: Colors.blueAccent,
                                iconColor: Colors.red,
                              ),
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Center(
                                child: Text(
                                  'parameter onlyName set to true to allow gracefull degradation',
                                  overflow: TextOverflow.clip,
                                  textAlign: TextAlign.center,
                                ),
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              mimeType:
                                  'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                              dataSize: 125000,
                              name: 'file name',
                              widgetSize: 100,
                              decoration: WidgetDecoration(
                                backgroundColor: Colors.blueAccent,
                                iconColor: Colors.red,
                                textColor: Colors.red,
                                wrapperSize: 120,
                                wrapperBgColor: Colors.black,
                              ),
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'Thumbnail with wrapper size set',
                                textAlign: TextAlign.center,
                                overflow: TextOverflow.clip,
                              ),
                            ),
                          ],
                        ),
                      ],
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 5),
                    child: GridView.count(
                      crossAxisCount: 2,
                      children: <Widget>[
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load('assets/samples/png-sample.png'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType: 'image/png',
                              widgetSize: 100,
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'png image',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load('assets/samples/png-sample.png'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType: 'image/png',
                              widgetSize: 100,
                              dataSize: 12345,
                              name: 'png',
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'png image with data size and name set',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load('assets/samples/jpg-sample.jpg'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType: 'image/jpg',
                              widgetSize: 100,
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'jpg image',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load('assets/samples/jpg-sample.jpg'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType: 'image/jpg',
                              decoration: WidgetDecoration(
                                wrapperBgColor: Colors.deepOrange,
                                wrapperSize: 110,
                              ),
                              widgetSize: 100,
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'jpg image with wrapper and wrapper color',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load('assets/samples/jpg-sample.jpg'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType: 'image/jpg',
                              onlyIcon: true,
                              decoration: WidgetDecoration(
                                wrapperBgColor: Colors.deepOrange,
                                wrapperSize: 110,
                              ),
                              widgetSize: 100,
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'jpg with flag preferIcon set to true',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load('assets/samples/png-sample.png'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType: 'image/png',
                              onlyIcon: true,
                              dataSize: 12345,
                              name: 'png',
                              widgetSize: 100,
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'png with flag preferIcon set to true',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                      ],
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(top: 5),
                    child: GridView.count(
                      crossAxisCount: 1,
                      children: <Widget>[
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load('assets/samples/png-sample.png'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType: 'image/png',
                              widgetSize: 300,
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'in basic implementation there are 3 creation strategies, 1st is for images',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load('assets/samples/pdf-sample.pdf'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType: 'application/pdf',
                              widgetSize: 300,
                              decoration: WidgetDecoration(
                                  wrapperBgColor: Colors.blueAccent),
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                '2nd is for pdf files (blue on edges is colored wrapper)',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              dataResolver: () async {
                                return (await DefaultAssetBundle.of(context)
                                        .load(
                                            'assets/samples/xlsx-sample.xlsx'))
                                    .buffer
                                    .asUint8List();
                              },
                              mimeType:
                                  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                              widgetSize: 300,
                              decoration: WidgetDecoration(
                                  wrapperBgColor: Colors.blueAccent),
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                '3rd is for xlsx and odt files',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                        Column(
                          children: <Widget>[
                            Thumbnail(
                              errorBuilder: (uildContext, Exception error) {
                                return Container(
                                  height: 200,
                                  color: Colors.blue,
                                  child: const Center(
                                    child: Text('Cannot load file contents'),
                                  ),
                                );
                              },
                              dataResolver: () async {
                                throw Error();
                              },
                              mimeType:
                                  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                              widgetSize: 300,
                              decoration: WidgetDecoration(
                                  wrapperBgColor: Colors.blueAccent),
                            ),
                            const Padding(
                              padding: EdgeInsets.symmetric(horizontal: 7),
                              child: Text(
                                'On top of that, you can also define custom error behaviour',
                                overflow: TextOverflow.clip,
                                textAlign: TextAlign.center,
                              ),
                            ),
                          ],
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}
87
likes
150
pub points
90%
popularity

Publisher

verified publisher4q.eu

Plugin that is able to generate thumbnails from files with various mime types. If thumbnail generation is not support for specific mime type, then a fallback icon is returned

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

flutter, flutter_web_plugins, font_awesome_flutter, pdfx, spreadsheet_decoder

More

Packages that depend on thumbnailer