Skip to content

Instantly share code, notes, and snippets.

@joramkimata
Created February 11, 2020 04:54
Show Gist options
  • Save joramkimata/54092c24510c41336863540003ac3cf6 to your computer and use it in GitHub Desktop.
Save joramkimata/54092c24510c41336863540003ac3cf6 to your computer and use it in GitHub Desktop.
import 'package:flutter/material.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/services.dart';
main() => runApp(App());
class App extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _App();
}
}
class _App extends State<App> {
String _fileName;
String _path;
Map<String, String> _paths;
String _extension;
bool _loadingPath = false;
bool _multiPick = false;
bool _hasValidMime = false;
FileType _pickingType;
TextEditingController _controller = new TextEditingController();
@override
void initState() {
super.initState();
_controller.addListener(() => _extension = _controller.text);
}
void _openFileExplorer() async {
if (_pickingType != FileType.CUSTOM || _hasValidMime) {
setState(() => _loadingPath = true);
try {
if (_multiPick) {
_path = null;
_paths = await FilePicker.getMultiFilePath(
type: _pickingType, fileExtension: _extension);
} else {
_paths = null;
_path = await FilePicker.getFilePath(
type: _pickingType, fileExtension: _extension);
}
} on PlatformException catch (e) {
print("Unsupported operation" + e.toString());
}
if (!mounted) return;
setState(() {
_loadingPath = false;
_fileName = _path != null
? _path.split('/').last
: _paths != null ? _paths.keys.toString() : '...';
});
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("FilePickerApp"),
),
body: Container(
child: Center(
child: Column(
children: <Widget>[
new Padding(
padding: const EdgeInsets.only(top: 50.0, bottom: 20.0),
child: new RaisedButton(
onPressed: () => _openFileExplorer(),
child: new Text("Open file picker"),
),
),
new Builder(
builder: (BuildContext context) => _loadingPath
? Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: const CircularProgressIndicator())
: _path != null || _paths != null
? new Container(
padding: const EdgeInsets.only(bottom: 30.0),
height: MediaQuery.of(context).size.height * 0.50,
child: new Scrollbar(
child: new ListView.separated(
itemCount: _paths != null && _paths.isNotEmpty
? _paths.length
: 1,
itemBuilder: (BuildContext context, int index) {
final bool isMultiPath =
_paths != null && _paths.isNotEmpty;
final String name = 'File $index: ' +
(isMultiPath
? _paths.keys.toList()[index]
: _fileName ?? '...');
final path = isMultiPath
? _paths.values.toList()[index].toString()
: _path;
return new ListTile(
title: new Text(
name,
),
subtitle: new Text(path),
);
},
separatorBuilder:
(BuildContext context, int index) =>
new Divider(),
)),
)
: new Container(),
),
],
)),
),
),
);
}
}
name: filepickerapp
description: A new Flutter project.
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1
environment:
sdk: ">=2.1.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
file_picker: ^1.4.2
dev_dependencies:
flutter_test:
sdk: flutter
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware.
# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages
@aya-djihane
Copy link

E/flutter (13675): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: 'package:flutter/src/foundation/diagnostics.dart': Failed assertion: line 3036 pos 5: 'indexOfDot != -1 && indexOfDot < description.length - 1': The provided object "null" is not an enum.
E/flutter (13675): #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:46:39)
E/flutter (13675): #1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
E/flutter (13675): #2 describeEnum (package:flutter/src/foundation/diagnostics.dart:3036:5)
E/flutter (13675): #3 MethodChannelFilePicker._getPath (package:file_picker_platform_interface/method_channel_file_picker.dart:53:25)
E/flutter (13675): #4 MethodChannelFilePicker.getFiles (package:file_picker_platform_interface/method_channel_file_picker.dart:26:7)
E/flutter (13675): #5 FilePicker.getFilePath (package:file_picker/file_picker.dart:35:33)
E/flutter (13675): #6 _App._openFileExplorer (package:untitled1/main.dart:36:36)
E/flutter (13675): #7 _App.build. (package:untitled1/main.dart:66:40)
E/flutter (13675): #8 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:991:20)
E/flutter (13675): #9 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter (13675): #10 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:607:11)
E/flutter (13675): #11 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:296:5)
E/flutter (13675): #12 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:230:7)
E/flutter (13675): #13 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:475:9)
E/flutter (13675): #14 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:93:12)
E/flutter (13675): #15 PointerRouter._dispatchEventToRoutes. (package:flutter/src/gestures/pointer_router.dart:138:9)
E/flutter (13675): #16 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:397:8)
E/flutter (13675): #17 PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:136:18)
E/flutter (13675): #18 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:122:7)
E/flutter (13675): #19 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:381:19)
E/flutter (13675): #20 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:361:22)
E/flutter (13675): #21 RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:278:11)
E/flutter (13675): #22 GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:316:7)
E/flutter (13675): #23 GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:280:5)
E/flutter (13675): #24 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:238:7)
E/flutter (13675): #25 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:221:7)
E/flutter (13675): #26 _rootRunUnary (dart:async/zone.dart:1370:13)
E/flutter (13675): #27 _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter (13675): #28 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1170:7)
E/flutter (13675): #29 _invoke1 (dart:ui/hooks.dart:180:10)
E/flutter (13675): #30 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:276:7)
E/flutter (13675): #31 _dispatchPointerDataPacket (dart:ui/hooks.dart:96:31)
E/flutter (13675):

@UsamaEjaz0
Copy link

For everyone having issues, change the dependency version to match the version in the op's pubspec.yaml
Write

file_picker: 1.4.2

instead of

file_picker: ^1.4.2

to match the exact version.

@wissalmh
Copy link

it doesn't work

@UsamaEjaz0
Copy link

it doesn't work

It was working with me. I removed the ‘^’ to match the versions.

@wissalmh
Copy link

it doesn't work

It was working with me. I removed the ‘^’ to match the versions.

Even when changing it, it doesn't work..

@srk2k13
Copy link

srk2k13 commented Sep 1, 2021

file_picker: 1.4.2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment