Skip to content

Commit c175ca7

Browse files
committed
support null-safety close #6
1 parent 615b5a0 commit c175ca7

12 files changed

+105
-113
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## [1.0.0] - 2021-03-10
2+
* Support null-safefty
3+
* Use open source [native_pdf_view](https://pub.dev/packages/native_pdf_view) package instead of commercial package
4+
* Improved video controls
5+
16
## [0.2.0] - 2021-02-02
27
* A `MediaProvider` can now also have a description that can be useful when sharing the media to other apps.
38
* The hero animation now works also for text media.

lib/enough_media.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ export 'preview/all_preview.dart';
99
export 'widget_registry.dart';
1010

1111
export 'package:flutter_sound_lite/flutter_sound.dart';
12-
export 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
12+
export 'package:native_pdf_view/native_pdf_view.dart';
1313
export 'package:video_player/video_player.dart';
1414
export 'package:chewie/chewie.dart';

lib/interactive/audio_interactive_media.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,22 @@ import '../media_provider.dart';
77
class AudioInteractiveMedia extends StatefulWidget {
88
final MediaProvider mediaProvider;
99
AudioInteractiveMedia({
10-
Key key,
11-
@required this.mediaProvider,
10+
Key? key,
11+
required this.mediaProvider,
1212
}) : super(key: key);
1313

1414
@override
1515
_AudioInteractiveMediaState createState() => _AudioInteractiveMediaState();
1616
}
1717

1818
class _AudioInteractiveMediaState extends State<AudioInteractiveMedia> {
19-
String name;
20-
FlutterSoundPlayer audioPlayer;
21-
Track track;
19+
late String name;
20+
late Track track;
2221

2322
@override
2423
void initState() {
2524
final provider = widget.mediaProvider;
26-
name = provider.name ?? '<unknown>';
25+
name = provider.name;
2726
if (provider is MemoryMediaProvider) {
2827
track = Track(dataBuffer: provider.data, trackTitle: name);
2928
} else if (provider is UrlMediaProvider) {

lib/interactive/image_interactive_media.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:photo_view/photo_view.dart';
55
/// Displays zoomable images
66
class ImageInteractiveMedia extends StatelessWidget {
77
final MediaProvider mediaProvider;
8-
const ImageInteractiveMedia({Key key, @required this.mediaProvider})
8+
const ImageInteractiveMedia({Key? key, required this.mediaProvider})
99
: super(key: key);
1010

1111
@override
Lines changed: 40 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,68 @@
11
import 'package:enough_media/media_provider.dart';
22
import 'package:flutter/material.dart';
3-
import 'package:flutter/services.dart';
4-
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
3+
import 'package:native_pdf_view/native_pdf_view.dart';
54

65
/// Displays PDFs
76
class PdfInteractiveMedia extends StatefulWidget {
87
final MediaProvider mediaProvider;
9-
PdfInteractiveMedia({Key key, @required this.mediaProvider})
8+
PdfInteractiveMedia({Key? key, required this.mediaProvider})
109
: super(key: key);
1110

1211
@override
1312
_PdfInteractiveMediaState createState() => _PdfInteractiveMediaState();
1413
}
1514

1615
class _PdfInteractiveMediaState extends State<PdfInteractiveMedia> {
17-
PdfViewerController pdfViewerController;
18-
OverlayEntry overlayEntry;
16+
late PdfController pdfController;
1917

2018
@override
2119
void initState() {
22-
pdfViewerController = PdfViewerController();
20+
pdfController = PdfController(document: initDocument(widget.mediaProvider));
2321
super.initState();
2422
}
2523

26-
@override
27-
Widget build(BuildContext context) {
28-
final provider = widget.mediaProvider;
24+
Future<PdfDocument> initDocument(final MediaProvider provider) {
2925
if (provider is MemoryMediaProvider) {
30-
return SfPdfViewer.memory(
31-
provider.data,
32-
controller: pdfViewerController,
33-
onTextSelectionChanged: onTextSelectionChanged,
34-
);
35-
} else if (provider is UrlMediaProvider) {
36-
return SfPdfViewer.network(
37-
provider.url,
38-
controller: pdfViewerController,
39-
onTextSelectionChanged: onTextSelectionChanged,
40-
);
26+
return PdfDocument.openData(provider.data);
27+
// } else if (provider is UrlMediaProvider) {
28+
// provider.url
29+
// );
4130
} else if (provider is AssetMediaProvider) {
42-
return SfPdfViewer.asset(
43-
provider.assetName,
44-
controller: pdfViewerController,
45-
onTextSelectionChanged: onTextSelectionChanged,
46-
);
31+
return PdfDocument.openAsset(provider.assetName);
4732
} else {
4833
throw StateError('Unsupported media provider $provider');
4934
}
5035
}
5136

52-
void onTextSelectionChanged(PdfTextSelectionChangedDetails details) {
53-
if (details.selectedText == null && overlayEntry != null) {
54-
overlayEntry.remove();
55-
overlayEntry = null;
56-
} else if (details.selectedText != null && overlayEntry == null) {
57-
final OverlayState overlayState = Overlay.of(context);
58-
overlayEntry = OverlayEntry(
59-
builder: (context) => Positioned(
60-
top: details.globalSelectedRegion.center.dy - 55,
61-
left: details.globalSelectedRegion.bottomLeft.dx,
62-
child: RaisedButton(
63-
child: Text('Copy', style: TextStyle(fontSize: 17)),
64-
onPressed: () {
65-
Clipboard.setData(ClipboardData(text: details.selectedText));
66-
pdfViewerController.clearSelection();
67-
},
68-
color: Colors.white,
69-
elevation: 10,
70-
),
71-
),
72-
);
73-
overlayState.insert(overlayEntry);
74-
}
37+
@override
38+
Widget build(BuildContext context) {
39+
return PdfView(
40+
controller: pdfController,
41+
);
7542
}
43+
44+
// void onTextSelectionChanged(PdfTextSelectionChangedDetails details) {
45+
// if (details.selectedText == null && overlayEntry != null) {
46+
// overlayEntry.remove();
47+
// overlayEntry = null;
48+
// } else if (details.selectedText != null && overlayEntry == null) {
49+
// final OverlayState overlayState = Overlay.of(context);
50+
// overlayEntry = OverlayEntry(
51+
// builder: (context) => Positioned(
52+
// top: details.globalSelectedRegion.center.dy - 55,
53+
// left: details.globalSelectedRegion.bottomLeft.dx,
54+
// child: RaisedButton(
55+
// child: Text('Copy', style: TextStyle(fontSize: 17)),
56+
// onPressed: () {
57+
// Clipboard.setData(ClipboardData(text: details.selectedText));
58+
// pdfViewerController.clearSelection();
59+
// },
60+
// color: Colors.white,
61+
// elevation: 10,
62+
// ),
63+
// ),
64+
// );
65+
// overlayState.insert(overlayEntry);
66+
// }
67+
// }
7668
}

lib/interactive/video_interactive_media.dart

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@ import '../media_provider.dart';
88

99
class VideoInteractiveMedia extends StatefulWidget {
1010
final MediaProvider mediaProvider;
11-
VideoInteractiveMedia({Key key, this.mediaProvider}) : super(key: key);
11+
VideoInteractiveMedia({Key? key, required this.mediaProvider})
12+
: super(key: key);
1213

1314
@override
1415
_VideoInteractiveMediaState createState() => _VideoInteractiveMediaState();
1516
}
1617

1718
class _VideoInteractiveMediaState extends State<VideoInteractiveMedia> {
18-
VideoPlayerController _videoController;
19-
ChewieController _chewieController;
20-
Future<VideoPlayerController> _loader;
19+
late VideoPlayerController _videoController;
20+
late ChewieController _chewieController;
21+
late Future<VideoPlayerController> _loader;
2122

2223
@override
2324
void initState() {
@@ -26,10 +27,8 @@ class _VideoInteractiveMediaState extends State<VideoInteractiveMedia> {
2627
}
2728

2829
void dispose() {
29-
if (_videoController != null) {
30-
_videoController.dispose();
31-
_chewieController.dispose();
32-
}
30+
_videoController.dispose();
31+
_chewieController.dispose();
3332
super.dispose();
3433
}
3534

@@ -81,12 +80,9 @@ class _VideoInteractiveMediaState extends State<VideoInteractiveMedia> {
8180
case ConnectionState.waiting:
8281
case ConnectionState.active:
8382
return Center(child: CircularProgressIndicator());
84-
break;
8583
case ConnectionState.done:
8684
return buildVideo();
87-
break;
8885
}
89-
return Text('loading video...');
9086
},
9187
);
9288
}

lib/interactive_media_widget.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@ import 'package:flutter/material.dart';
66
class InteractiveMediaWidget extends StatelessWidget {
77
final MediaProvider mediaProvider;
88
final bool useRegistry;
9-
final Object heroTag;
9+
final Object? heroTag;
1010
const InteractiveMediaWidget({
11-
Key key,
12-
@required this.mediaProvider,
11+
Key? key,
12+
required this.mediaProvider,
1313
this.useRegistry = false,
1414
this.heroTag,
1515
}) : super(key: key);
1616

1717
@override
1818
Widget build(BuildContext context) {
1919
if (heroTag != null) {
20-
return Hero(tag: heroTag, child: _buildMedia());
20+
return Hero(tag: heroTag!, child: _buildMedia());
2121
}
2222
return _buildMedia();
2323
}
@@ -27,7 +27,7 @@ class InteractiveMediaWidget extends StatelessWidget {
2727
if (useRegistry) {
2828
final registry = WidgetRegistry();
2929
if (registry.resolveInteractive != null) {
30-
final resolved = registry.resolveInteractive(provider);
30+
final resolved = registry.resolveInteractive!(provider);
3131
if (resolved != null) {
3232
return resolved;
3333
}

lib/media_provider.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ class MediaProvider {
88
final String mediaType;
99

1010
/// The size in bytes, if known
11-
final int size;
11+
final int? size;
1212

1313
/// Description, can be useful when sharing this media
14-
final String description;
14+
final String? description;
1515

1616
/// Creates a new media provider with the given [name], [mediaType] like application/pdf, [size] in bytes and [description].
1717
MediaProvider(this.name, this.mediaType, this.size, {this.description});
@@ -46,7 +46,7 @@ class UrlMediaProvider extends MediaProvider {
4646
/// Creates a new URL media provider with the given [name], [mediaType] and [url].
4747
/// Optionally specify the [size] in bytes and the [description].
4848
UrlMediaProvider(String name, String mediaType, this.url,
49-
{int size, String description})
49+
{int? size, String? description})
5050
: super(name, mediaType, size, description: description);
5151
}
5252

@@ -58,7 +58,7 @@ class MemoryMediaProvider extends MediaProvider {
5858
/// Creates a new meemory media provider with the given [name], [mediaType] and [data].
5959
/// Optionally specify the [description].
6060
MemoryMediaProvider(String name, String mediaType, this.data,
61-
{String description})
61+
{String? description})
6262
: super(name, mediaType, data.length, description: description);
6363
}
6464

@@ -70,13 +70,13 @@ class AssetMediaProvider extends MediaProvider {
7070
/// Creates a new asset media provider with the given [name], [mediaType] and [assetName].
7171
/// Optionally specify the [size] in bytes and the [description].
7272
AssetMediaProvider(String name, String mediaType, this.assetName,
73-
{String description})
73+
{String? description})
7474
: super(name, mediaType, null, description: description);
7575
}
7676

7777
class TextMediaProvider extends MediaProvider {
7878
final String text;
7979
TextMediaProvider(String name, String mediaType, this.text,
80-
{String description})
80+
{String? description})
8181
: super(name, mediaType, null, description: description);
8282
}

lib/preview/image_preview.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ import 'package:flutter/material.dart';
55
class ImagePreview extends StatelessWidget {
66
final MediaProvider mediaProvider;
77
final BoxFit fit;
8-
final double width;
9-
final double height;
8+
final double? width;
9+
final double? height;
1010
const ImagePreview(
11-
{Key key,
12-
@required this.mediaProvider,
11+
{Key? key,
12+
required this.mediaProvider,
1313
this.fit = BoxFit.cover,
1414
this.width,
1515
this.height})

0 commit comments

Comments
 (0)