Search packages, repositories and app categories

Package detailsv2.2.0

file_picker_writable

Flutter plugin to allow users to open files/documents which can be read, and written back at a later time as well as creating new files on external media.

AndroidiOSmacOS
30-day downloads
252
Likes
14
Pub points
160

Install package

flutter pub add file_picker_writable

Package Overview

Package selection guidance compiled from public package information, community data, and project usage.

A Flutter plugin enabling users to open, read, and write files on external storage across Android, iOS, and macOS. It supports both existing file manipulation and the creation of new files, making it ideal for apps requiring persistent file handling. The plugin extends standard file picking functionality with write capabilities, ensuring data can be saved back after modification. Designed for seamless integration with native file systems, it provides a consistent experience across platforms.

Use cases

  • Editing documents offline
  • Saving user-generated content
  • Managing project files in apps
  • Exporting data from app to device
  • Storing configuration files
  • Handling media files in creative apps

Key features

  • Read and write file access
  • Create new files on external storage
  • Cross-platform support (Android, iOS, macOS)
  • Secure file handling
  • Integration with native file pickers
  • Persistent file storage

Suitable for

  • Productivity apps
  • Document editors
  • Media management tools
  • Data export/import features
  • Creative applications
  • File-based configuration systems

Considerations

  • Requires appropriate platform permissions
  • May need runtime permission requests
  • File paths are platform-specific
  • Limited to external storage access
  • Not suitable for internal app data
  • User must grant file system access

Original README

Original README snapshot from the linked source repository. Visit the repository for the latest content.

Pub Version

file_picker_writable

Flutter plugin to choose files which can be read, referenced and written back at a later time (persistent permissions on android, secure bookmarks on iOS).

It also offers handlers for open intents when the user wants to open associated files from other apps. In the same way it will also handle arbitrary URLs and pass them back to dart.

Requirements

iOS

  • iOS 8 + Swift 5
  • Only tested on iOS 13+, so let me know ;-)
Support for file handlers
  1. Configure an OTI Type: https://developer.apple.com/library/archive/qa/qa1587/_index.html
  2. Add to plist file:
     <key>UISupportsDocumentBrowser</key>
     <false/>
     <key>LSSupportsOpeningDocumentsInPlace</key>
     <true/>
    

Android

Support for file handlers
AndroidManifest.xlm
            <intent-filter>
                <action android:name="android.intent.action.VIEW"  />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="file" />
                <data android:scheme="content" />
                <data android:host="*"  />
                <data android:mimeType="*/*" />
                <!-- https://stackoverflow.com/a/52384331/109219 ?? -->
                <data android:pathPattern=".*\\.codeux" />
                <data android:pathPattern=".*\\..*\\.codeux" />
                <data android:pathPattern=".*\\..*\\..*\\.codeux" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.codeux" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.codeux" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.*\\..*\\.codeux" />
            </intent-filter>

MacOS

Is currently not supported. The only thing the plugin will do is listen for URL Events and pass them through to the dart side.

Getting Started

See the example on how to implement it in a simple application.

Future<void> readFile() async {
  final fileInfo = await FilePickerWritable().openFile((fileInfo, file) async {
    _logger.fine('Got picker result: $fileInfo');

    // now do something useful with the selected file...
    _logger.info('Got file contents in temporary file: $file');
    _logger.info('fileName: ${fileInfo.fileName}');
    _logger.info('Identifier which can be persisted for later retrieval:'
        '${fileInfo.identifier}');
    return fileInfo;
  });
  if (fileInfo == null) {
    _logger.info('User canceled.');
    return;
  }
}

The returned fileInfo.identifier can be used later to write or read from the data, even after an app restart.

Future<void> persistChanges(FileInfo fileInfo, Uint8List newContent) async {
  // tell FilePickerWritable plugin to write the new contents over the user selected file
  await FilePickerWritable().writeFile(
      identifier: fileInfo.identifier,
      writer: (file) async {
        // write new content into the temporary file.
        await file.writeBytes(newContent);
      });
}

Create a new file by letting the user choose a directory and file name:

final rand = Random().nextInt(10000000);
final fileInfo = await FilePickerWritable().openFileForCreate(
  fileName: 'newfile.$rand.codeux',
  writer: (file) async {
    final content = 'File created at ${DateTime.now()}\n\n';
    await file.writeAsString(content);
  },
);
if (fileInfo == null) {
  _logger.info('User canceled.');
  return;
}
final data = await _appDataBloc.store.load();
await _appDataBloc.store
    .save(data.copyWith(files: data.files + [fileInfo]));
}

This will open the following screen on Android:

create file screenshot

Categories

Dependencies

Dependency list 5 items

Source repository

Projects using this package