diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist
index 8d4492f..9625e10 100644
--- a/example/ios/Flutter/AppFrameworkInfo.plist
+++ b/example/ios/Flutter/AppFrameworkInfo.plist
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 9.0
+ 11.0
diff --git a/example/ios/Podfile b/example/ios/Podfile
index 1e8c3c9..88359b2 100644
--- a/example/ios/Podfile
+++ b/example/ios/Podfile
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
-# platform :ios, '9.0'
+# platform :ios, '11.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock
index 54dda12..12692d4 100644
--- a/example/ios/Podfile.lock
+++ b/example/ios/Podfile.lock
@@ -1,34 +1,88 @@
PODS:
+ - DKImagePickerController/Core (4.3.4):
+ - DKImagePickerController/ImageDataManager
+ - DKImagePickerController/Resource
+ - DKImagePickerController/ImageDataManager (4.3.4)
+ - DKImagePickerController/PhotoGallery (4.3.4):
+ - DKImagePickerController/Core
+ - DKPhotoGallery
+ - DKImagePickerController/Resource (4.3.4)
+ - DKPhotoGallery (0.0.17):
+ - DKPhotoGallery/Core (= 0.0.17)
+ - DKPhotoGallery/Model (= 0.0.17)
+ - DKPhotoGallery/Preview (= 0.0.17)
+ - DKPhotoGallery/Resource (= 0.0.17)
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Core (0.0.17):
+ - DKPhotoGallery/Model
+ - DKPhotoGallery/Preview
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Model (0.0.17):
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Preview (0.0.17):
+ - DKPhotoGallery/Model
+ - DKPhotoGallery/Resource
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Resource (0.0.17):
+ - SDWebImage
+ - SwiftyGif
+ - file_picker (0.0.1):
+ - DKImagePickerController/PhotoGallery
+ - Flutter
- Flutter (1.0.0)
- - path_provider_ios (0.0.1):
+ - path_provider_foundation (0.0.1):
- Flutter
- - permission_handler_apple (9.0.4):
+ - FlutterMacOS
+ - permission_handler_apple (9.1.1):
- Flutter
- power_file_view (0.0.1):
- Flutter
+ - SDWebImage (5.18.3):
+ - SDWebImage/Core (= 5.18.3)
+ - SDWebImage/Core (5.18.3)
+ - SwiftyGif (5.4.4)
DEPENDENCIES:
+ - file_picker (from `.symlinks/plugins/file_picker/ios`)
- Flutter (from `Flutter`)
- - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`)
+ - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- power_file_view (from `.symlinks/plugins/power_file_view/ios`)
+SPEC REPOS:
+ trunk:
+ - DKImagePickerController
+ - DKPhotoGallery
+ - SDWebImage
+ - SwiftyGif
+
EXTERNAL SOURCES:
+ file_picker:
+ :path: ".symlinks/plugins/file_picker/ios"
Flutter:
:path: Flutter
- path_provider_ios:
- :path: ".symlinks/plugins/path_provider_ios/ios"
+ path_provider_foundation:
+ :path: ".symlinks/plugins/path_provider_foundation/darwin"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
power_file_view:
:path: ".symlinks/plugins/power_file_view/ios"
SPEC CHECKSUMS:
- Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
- path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02
- permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
+ DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
+ DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
+ file_picker: 15fd9539e4eb735dc54bae8c0534a7a9511a03de
+ Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
+ path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
+ permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6
power_file_view: a4769bfa152a67e284f5d18ff3b71b5e216c3f9e
+ SDWebImage: 96e0c18ef14010b7485210e92fac888587ebb958
+ SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f
-PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c
+PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3
-COCOAPODS: 1.11.3
+COCOAPODS: 1.12.1
diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj
index f77c181..52a39ff 100644
--- a/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/example/ios/Runner.xcodeproj/project.pbxproj
@@ -3,14 +3,14 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 50;
+ objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
+ 05F2E292454E24458F032583 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9CBBEDB4F295002FBBA1307F /* Pods_Runner.framework */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
- 8FB076FE400D7F4A282F2B17 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C6958A674E60AB3F7E7F5A2 /* Pods_Runner.framework */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
@@ -32,13 +32,12 @@
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
- 3428F09759EBC857FA5DFDA7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
- 3B2AECA83ECC3074ED749E32 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 3A8E47CE30369333D095EBEE /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
- 3C6958A674E60AB3F7E7F5A2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 7F9C1BCBF5D1B5A1537823D4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -46,7 +45,8 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- DA88BE7DCB4DEDE3A7978238 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 9CBBEDB4F295002FBBA1307F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ EF940A61C5B3E7D50B21C048 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -54,13 +54,24 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 8FB076FE400D7F4A282F2B17 /* Pods_Runner.framework in Frameworks */,
+ 05F2E292454E24458F032583 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ 5456FAFF6F3C3165F6384189 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 3A8E47CE30369333D095EBEE /* Pods-Runner.debug.xcconfig */,
+ EF940A61C5B3E7D50B21C048 /* Pods-Runner.release.xcconfig */,
+ 7F9C1BCBF5D1B5A1537823D4 /* Pods-Runner.profile.xcconfig */,
+ );
+ name = Pods;
+ path = Pods;
+ sourceTree = "";
+ };
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@@ -78,8 +89,8 @@
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
- FAFA040A1F9121DB5FF2FF9C /* Pods */,
- 9EB886C263CD9D901B859EB9 /* Frameworks */,
+ 5456FAFF6F3C3165F6384189 /* Pods */,
+ E94B919EFB564129B1FBE56B /* Frameworks */,
);
sourceTree = "";
};
@@ -106,25 +117,14 @@
path = Runner;
sourceTree = "";
};
- 9EB886C263CD9D901B859EB9 /* Frameworks */ = {
+ E94B919EFB564129B1FBE56B /* Frameworks */ = {
isa = PBXGroup;
children = (
- 3C6958A674E60AB3F7E7F5A2 /* Pods_Runner.framework */,
+ 9CBBEDB4F295002FBBA1307F /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "";
};
- FAFA040A1F9121DB5FF2FF9C /* Pods */ = {
- isa = PBXGroup;
- children = (
- DA88BE7DCB4DEDE3A7978238 /* Pods-Runner.debug.xcconfig */,
- 3B2AECA83ECC3074ED749E32 /* Pods-Runner.release.xcconfig */,
- 3428F09759EBC857FA5DFDA7 /* Pods-Runner.profile.xcconfig */,
- );
- name = Pods;
- path = Pods;
- sourceTree = "";
- };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -132,14 +132,14 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
- C77CF9EB1D75EB9BA0EAFE27 /* [CP] Check Pods Manifest.lock */,
+ 820CF47BCF8F29A770067833 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- 6C35D1DA2CF7054CB96D1B9E /* [CP] Embed Pods Frameworks */,
+ 1152623B545E8A1C6330C532 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -156,7 +156,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 1300;
+ LastUpgradeCheck = 1430;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
@@ -198,21 +198,7 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- name = "Thin Binary";
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
- };
- 6C35D1DA2CF7054CB96D1B9E /* [CP] Embed Pods Frameworks */ = {
+ 1152623B545E8A1C6330C532 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -229,21 +215,23 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
- 9740EEB61CF901F6004384FC /* Run Script */ = {
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
- name = "Run Script";
+ name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
- C77CF9EB1D75EB9BA0EAFE27 /* [CP] Check Pods Manifest.lock */ = {
+ 820CF47BCF8F29A770067833 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -265,6 +253,21 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -340,7 +343,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -418,7 +421,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -467,7 +470,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index c87d15a..a6b826d 100644
--- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
UIViewControllerBasedStatusBarAppearance
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+ UIBackgroundModes
+
+ fetch
+ remote-notification
+
+ NSAppleMusicUsageDescription
+ Explain why your app uses music
+ UISupportsDocumentBrowser
+
+ LSSupportsOpeningDocumentsInPlace
+
+ NSPhotoLibraryUsageDescription
+ Explain why your app uses photo library
diff --git a/example/lib/main.dart b/example/lib/main.dart
index c4adecc..18761e3 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -1,5 +1,6 @@
import 'dart:async';
import 'dart:convert';
+import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
@@ -53,28 +54,104 @@ class HomePage extends StatelessWidget {
appBar: AppBar(
title: const Text('文件列表'),
),
- body: ListView.builder(
- itemCount: files.length,
- itemBuilder: (context, index) {
- String filePath = files[index];
- final fileName = FileUtil.getFileName(filePath);
- final fileType = FileUtil.getFileType(filePath);
- return Container(
- margin: const EdgeInsets.only(top: 10.0),
- padding: const EdgeInsets.symmetric(horizontal: 15.0),
- child: ElevatedButton(
- onPressed: () async {
- String savePath = await getFilePath(fileType, fileName);
- onTap(context, filePath, savePath);
- },
- child: Text(fileName),
+ body: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ ListView.builder(
+ shrinkWrap: true,
+ itemCount: files.length,
+ itemBuilder: (context, index) {
+ String filePath = files[index];
+ final fileName = FileUtil.getFileName(filePath);
+ final fileType = FileUtil.getFileType(filePath);
+ return Container(
+ margin: const EdgeInsets.only(top: 10.0),
+ padding: const EdgeInsets.symmetric(horizontal: 15.0),
+ child: ElevatedButton(
+ onPressed: () async {
+ String savePath = await getFilePath(fileType, fileName);
+ onTap(context, filePath, savePath);
+ },
+ child: Text(fileName),
+ ),
+ );
+ }),
+ Container(
+ margin: const EdgeInsets.only(top: 10.0),
+ padding: const EdgeInsets.symmetric(horizontal: 15.0),
+ child: ElevatedButton(
+ onPressed: () async {
+ // pick file from storage
+ File? file = await FileUtil.getFilePathFromStorage();
+
+ if (file == null) {
+ debugPrint('file null');
+ // toast info
+ showCustomToast(context, 'file null');
+ return;
+ }
+
+ var filePath = file.path;
+ bool isGranted = await PermissionUtil.check();
+ if (isGranted) {
+ Navigator.of(context).push(
+ MaterialPageRoute(builder: (ctx) {
+ return PowerFileViewPage(
+ downloadUrl: '',
+ downloadPath: filePath,
+ );
+ }),
+ );
+ } else {
+ debugPrint('no permission');
+ }
+ },
+ child: Text('Open File'),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+
+ void showCustomToast(BuildContext context, String message) {
+ OverlayState overlayState = Overlay.of(context)!;
+ OverlayEntry overlayEntry;
+ overlayEntry = OverlayEntry(
+ builder: (context) => Positioned(
+ top: MediaQuery.of(context).size.height * 0.8,
+ width: MediaQuery.of(context).size.width,
+ child: Material(
+ color: Colors.transparent,
+ child: Container(
+ alignment: Alignment.center,
+ child: Container(
+ decoration: BoxDecoration(
+ color: Colors.black,
+ borderRadius: BorderRadius.circular(8),
+ ),
+ padding: EdgeInsets.symmetric(vertical: 10, horizontal: 16),
+ child: Text(
+ message,
+ style: TextStyle(
+ color: Colors.white,
+ ),
),
- );
- }),
+ ),
+ ),
+ ),
+ ),
);
+
+ overlayState.insert(overlayEntry);
+
+ Future.delayed(Duration(seconds: 2)).then((_) {
+ overlayEntry.remove();
+ });
}
- Future onTap(BuildContext context, String downloadUrl, String downloadPath) async {
+ Future onTap(
+ BuildContext context, String downloadUrl, String downloadPath) async {
bool isGranted = await PermissionUtil.check();
if (isGranted) {
Navigator.of(context).push(
diff --git a/example/lib/power_file_view_page.dart b/example/lib/power_file_view_page.dart
index 4be18a9..532fa4f 100644
--- a/example/lib/power_file_view_page.dart
+++ b/example/lib/power_file_view_page.dart
@@ -5,7 +5,9 @@ class PowerFileViewPage extends StatefulWidget {
final String downloadUrl;
final String downloadPath;
- const PowerFileViewPage({Key? key, required this.downloadUrl, required this.downloadPath}) : super(key: key);
+ const PowerFileViewPage(
+ {Key? key, required this.downloadUrl, required this.downloadPath})
+ : super(key: key);
@override
State createState() => _PowerFileViewPageState();
@@ -22,20 +24,20 @@ class _PowerFileViewPageState extends State {
body: PowerFileViewWidget(
downloadUrl: widget.downloadUrl,
filePath: widget.downloadPath,
- // loadingBuilder: (viewType, progress) {
- // return Container(
- // color: Colors.grey,
- // alignment: Alignment.center,
- // child: Text("加载中: $progress"),
- // );
- // },
- // errorBuilder: (viewType) {
- // return Container(
- // color: Colors.red,
- // alignment: Alignment.center,
- // child: const Text("出错了"),
- // );
- // },
+ loadingBuilder: (viewType, progress) {
+ return Container(
+ color: Colors.grey,
+ alignment: Alignment.center,
+ child: Text("loading: $progress"),
+ );
+ },
+ errorBuilder: (viewType) {
+ return Container(
+ color: Colors.red,
+ alignment: Alignment.center,
+ child: const Text("ERROR FILE CANNOT OPEN"),
+ );
+ },
),
);
}
diff --git a/example/pubspec.lock b/example/pubspec.lock
index 4a8b658..82083d9 100644
--- a/example/pubspec.lock
+++ b/example/pubspec.lock
@@ -5,79 +5,82 @@ packages:
dependency: transitive
description:
name: async
- url: "https://pub.flutter-io.cn"
+ sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
+ url: "https://pub.dev"
source: hosted
- version: "2.8.2"
+ version: "2.11.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
- url: "https://pub.flutter-io.cn"
+ sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
+ url: "https://pub.dev"
source: hosted
- version: "2.1.0"
+ version: "2.1.1"
characters:
dependency: transitive
description:
name: characters
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "1.2.0"
- charcode:
- dependency: transitive
- description:
- name: charcode
- url: "https://pub.flutter-io.cn"
+ sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
+ url: "https://pub.dev"
source: hosted
- version: "1.3.1"
+ version: "1.3.0"
clock:
dependency: transitive
description:
name: clock
- url: "https://pub.flutter-io.cn"
+ sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+ url: "https://pub.dev"
source: hosted
- version: "1.1.0"
+ version: "1.1.1"
collection:
dependency: transitive
description:
name: collection
- url: "https://pub.flutter-io.cn"
+ sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
+ url: "https://pub.dev"
source: hosted
- version: "1.15.0"
+ version: "1.17.2"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
- url: "https://pub.flutter-io.cn"
+ sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d
+ url: "https://pub.dev"
source: hosted
- version: "1.0.4"
+ version: "1.0.6"
dio:
dependency: transitive
description:
name: dio
- url: "https://pub.flutter-io.cn"
+ sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8"
+ url: "https://pub.dev"
source: hosted
version: "4.0.6"
fake_async:
dependency: transitive
description:
name: fake_async
- url: "https://pub.flutter-io.cn"
+ sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+ url: "https://pub.dev"
source: hosted
- version: "1.2.0"
+ version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
- url: "https://pub.flutter-io.cn"
+ sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
+ url: "https://pub.dev"
source: hosted
- version: "1.2.1"
- file:
+ version: "2.1.0"
+ file_picker:
dependency: transitive
description:
- name: file
- url: "https://pub.flutter-io.cn"
+ name: file_picker
+ sha256: "903dd4ba13eae7cef64acc480e91bf54c3ddd23b5b90b639c170f3911e489620"
+ url: "https://pub.dev"
source: hosted
- version: "6.1.2"
+ version: "6.0.0"
flutter:
dependency: "direct main"
description: flutter
@@ -87,168 +90,187 @@ packages:
dependency: "direct dev"
description:
name: flutter_lints
- url: "https://pub.flutter-io.cn"
+ sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493
+ url: "https://pub.dev"
source: hosted
version: "1.0.4"
+ flutter_plugin_android_lifecycle:
+ dependency: transitive
+ description:
+ name: flutter_plugin_android_lifecycle
+ sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.17"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
+ flutter_web_plugins:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.0"
http_parser:
dependency: transitive
description:
name: http_parser
- url: "https://pub.flutter-io.cn"
+ sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
+ url: "https://pub.dev"
source: hosted
- version: "4.0.1"
+ version: "4.0.2"
lints:
dependency: transitive
description:
name: lints
- url: "https://pub.flutter-io.cn"
+ sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c
+ url: "https://pub.dev"
source: hosted
version: "1.0.1"
matcher:
dependency: transitive
description:
name: matcher
- url: "https://pub.flutter-io.cn"
+ sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
+ url: "https://pub.dev"
source: hosted
- version: "0.12.11"
+ version: "0.12.16"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
- url: "https://pub.flutter-io.cn"
+ sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
+ url: "https://pub.dev"
source: hosted
- version: "0.1.3"
+ version: "0.5.0"
meta:
dependency: transitive
description:
name: meta
- url: "https://pub.flutter-io.cn"
+ sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
+ url: "https://pub.dev"
source: hosted
- version: "1.7.0"
+ version: "1.9.1"
path:
dependency: transitive
description:
name: path
- url: "https://pub.flutter-io.cn"
+ sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
+ url: "https://pub.dev"
source: hosted
- version: "1.8.0"
+ version: "1.8.3"
path_provider:
dependency: "direct main"
description:
name: path_provider
- url: "https://pub.flutter-io.cn"
+ sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
+ url: "https://pub.dev"
source: hosted
- version: "2.0.10"
+ version: "2.1.1"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
- url: "https://pub.flutter-io.cn"
+ sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72
+ url: "https://pub.dev"
source: hosted
- version: "2.0.14"
- path_provider_ios:
+ version: "2.2.1"
+ path_provider_foundation:
dependency: transitive
description:
- name: path_provider_ios
- url: "https://pub.flutter-io.cn"
+ name: path_provider_foundation
+ sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
+ url: "https://pub.dev"
source: hosted
- version: "2.0.9"
+ version: "2.3.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
- url: "https://pub.flutter-io.cn"
+ sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
+ url: "https://pub.dev"
source: hosted
- version: "2.1.6"
- path_provider_macos:
- dependency: transitive
- description:
- name: path_provider_macos
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "2.0.6"
+ version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
- url: "https://pub.flutter-io.cn"
+ sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
+ url: "https://pub.dev"
source: hosted
- version: "2.0.4"
+ version: "2.1.1"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
- url: "https://pub.flutter-io.cn"
+ sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
+ url: "https://pub.dev"
source: hosted
- version: "2.0.6"
+ version: "2.2.1"
permission_handler:
dependency: "direct main"
description:
name: permission_handler
- url: "https://pub.flutter-io.cn"
+ sha256: "5749ebeb7ec0c3865ea17e3eb337174b87747be816dab582c551e1aff6f6bbf3"
+ url: "https://pub.dev"
source: hosted
version: "9.2.0"
permission_handler_android:
dependency: transitive
description:
name: permission_handler_android
- url: "https://pub.flutter-io.cn"
+ sha256: a512e0fa8abcb0659d938ec2df93a70eb1df1fdea5fdc6d79a866bfd858a28fc
+ url: "https://pub.dev"
source: hosted
version: "9.0.2+1"
permission_handler_apple:
dependency: transitive
description:
name: permission_handler_apple
- url: "https://pub.flutter-io.cn"
+ sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5"
+ url: "https://pub.dev"
source: hosted
- version: "9.0.4"
+ version: "9.1.4"
permission_handler_platform_interface:
dependency: transitive
description:
name: permission_handler_platform_interface
- url: "https://pub.flutter-io.cn"
+ sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4"
+ url: "https://pub.dev"
source: hosted
- version: "3.7.0"
+ version: "3.12.0"
permission_handler_windows:
dependency: transitive
description:
name: permission_handler_windows
- url: "https://pub.flutter-io.cn"
+ sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098
+ url: "https://pub.dev"
source: hosted
- version: "0.1.0"
+ version: "0.1.3"
platform:
dependency: transitive
description:
name: platform
- url: "https://pub.flutter-io.cn"
+ sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59"
+ url: "https://pub.dev"
source: hosted
- version: "3.1.0"
+ version: "3.1.3"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
- url: "https://pub.flutter-io.cn"
+ sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d
+ url: "https://pub.dev"
source: hosted
- version: "2.1.2"
+ version: "2.1.6"
power_file_view:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
- version: "1.0.0"
- process:
- dependency: transitive
- description:
- name: process
- url: "https://pub.flutter-io.cn"
- source: hosted
- version: "4.2.4"
+ version: "1.0.1"
sky_engine:
dependency: transitive
description: flutter
@@ -258,72 +280,90 @@ packages:
dependency: transitive
description:
name: source_span
- url: "https://pub.flutter-io.cn"
+ sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
+ url: "https://pub.dev"
source: hosted
- version: "1.8.1"
+ version: "1.10.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
- url: "https://pub.flutter-io.cn"
+ sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
+ url: "https://pub.dev"
source: hosted
- version: "1.10.0"
+ version: "1.11.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
- url: "https://pub.flutter-io.cn"
+ sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
+ url: "https://pub.dev"
source: hosted
- version: "2.1.0"
+ version: "2.1.1"
string_scanner:
dependency: transitive
description:
name: string_scanner
- url: "https://pub.flutter-io.cn"
+ sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
+ url: "https://pub.dev"
source: hosted
- version: "1.1.0"
+ version: "1.2.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
- url: "https://pub.flutter-io.cn"
+ sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
+ url: "https://pub.dev"
source: hosted
- version: "1.2.0"
+ version: "1.2.1"
test_api:
dependency: transitive
description:
name: test_api
- url: "https://pub.flutter-io.cn"
+ sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
+ url: "https://pub.dev"
source: hosted
- version: "0.4.8"
+ version: "0.6.0"
typed_data:
dependency: transitive
description:
name: typed_data
- url: "https://pub.flutter-io.cn"
+ sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
+ url: "https://pub.dev"
source: hosted
- version: "1.3.0"
+ version: "1.3.2"
vector_math:
dependency: transitive
description:
name: vector_math
- url: "https://pub.flutter-io.cn"
+ sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ url: "https://pub.dev"
source: hosted
- version: "2.1.1"
+ version: "2.1.4"
+ web:
+ dependency: transitive
+ description:
+ name: web
+ sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.1.4-beta"
win32:
dependency: transitive
description:
name: win32
- url: "https://pub.flutter-io.cn"
+ sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3"
+ url: "https://pub.dev"
source: hosted
- version: "2.5.2"
+ version: "5.0.9"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
- url: "https://pub.flutter-io.cn"
+ sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2"
+ url: "https://pub.dev"
source: hosted
- version: "0.2.0+1"
+ version: "1.0.3"
sdks:
- dart: ">=2.16.2 <3.0.0"
- flutter: ">=2.8.1"
+ dart: ">=3.1.0-185.0.dev <4.0.0"
+ flutter: ">=3.7.0"
diff --git a/lib/src/utils/file_util.dart b/lib/src/utils/file_util.dart
index 1aaf648..353bfe4 100644
--- a/lib/src/utils/file_util.dart
+++ b/lib/src/utils/file_util.dart
@@ -1,12 +1,23 @@
import 'dart:io';
+import 'package:file_picker/file_picker.dart';
+
class FileUtil {
/// Whether the file exists
static bool isExistsFile(String filePath) => File(filePath).existsSync();
/// Whether type of the file support
static bool isSupportOpen(String fileType) {
- final List types = ['docx', 'doc', 'xlsx', 'xls', 'pptx', 'ppt', 'pdf', 'txt'];
+ final List types = [
+ 'docx',
+ 'doc',
+ 'xlsx',
+ 'xls',
+ 'pptx',
+ 'ppt',
+ 'pdf',
+ 'txt'
+ ];
return types.contains(fileType.toLowerCase());
}
@@ -72,4 +83,28 @@ class FileUtil {
return '${(size / tbDivider).toStringAsFixed(round)} PB';
}
+
+ static Future getFilePathFromStorage() async {
+ // pick file from storage
+ FilePickerResult? result = await FilePicker.platform.pickFiles(
+ type: FileType.custom,
+ allowedExtensions: [
+ 'pdf',
+ 'doc',
+ 'docx',
+ 'ppt',
+ 'pptx',
+ 'xls',
+ 'xlsx',
+ 'txt'
+ ],
+ );
+
+ if (result != null) {
+ return File(result.files.single.path!);
+ } else {
+ // User canceled the picker
+ return null;
+ }
+ }
}
diff --git a/pubspec.yaml b/pubspec.yaml
index a27958a..c4fb17d 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -12,6 +12,7 @@ dependencies:
sdk: flutter
dio: ^4.0.0
+ file_picker: ^6.0.0
dev_dependencies:
flutter_test: