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

PlatformAndroid

Util functions for SAF (Storage Access Framework).

example/lib/main.dart

import 'package:fc_quick_dialog/fc_quick_dialog.dart';
import 'package:flutter/material.dart';
import 'package:saf_util/saf_util.dart';
import 'package:saf_util_example/folder_route.dart';

void main() {
  runApp(const MaterialApp(home: MyApp()));
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _safUtilPlugin = SafUtil();
  var _status = '';
  var _multipleFiles = false;
  var _persistablePermission = false;
  late TextEditingController _initialUriController;
  var _initialUri = '';
  late TextEditingController _checkPersistablePermissionInputController;
  var _checkPersistablePermissionInput = '';

  @override
  void initState() {
    super.initState();
    _initialUriController = TextEditingController();
    _checkPersistablePermissionInputController = TextEditingController();
  }

  @override
  void dispose() {
    _initialUriController.dispose();
    _checkPersistablePermissionInputController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
      ),
      body: SingleChildScrollView(
        child: Padding(
          padding: const EdgeInsets.all(16),
          child: Column(
            spacing: 10,
            children: [
              OutlinedButton(
                onPressed: () async {
                  try {
                    final dir = await _safUtilPlugin.pickDirectory(
                        writePermission: true,
                        initialUri: _initialUri,
                        persistablePermission: _persistablePermission);
                    if (dir == null) {
                      setState(() {
                        _status = 'Cancelled by user';
                      });
                      return;
                    }
                    if (!context.mounted) {
                      return;
                    }
                    final folderRoute = FolderRoute(
                      uri: dir.uri,
                      name: dir.name,
                    );
                    await Navigator.push<void>(
                      context,
                      MaterialPageRoute(builder: (context) => folderRoute),
                    );
                  } catch (err) {
                    setState(() {
                      _status = 'Error: $err';
                    });
                  }
                },
                child: const Text('Pick a folder'),
              ),
              OutlinedButton(
                onPressed: () async {
                  try {
                    final files = await _safUtilPlugin.pickFiles(
                        initialUri: _initialUri, multiple: _multipleFiles);
                    if (files == null) {
                      setState(() {
                        _status = 'Cancelled by user';
                      });
                      return;
                    }
                    if (!context.mounted) {
                      return;
                    }

                    String summary =
                        'You have selected ${files.length} files:\n';
                    for (final file in files) {
                      summary +=
                          '${file.name}\nSize: ${file.length}\nUri:${file.uri}\n\n';
                    }
                    setState(() {
                      _status = summary;
                    });
                  } catch (err) {
                    setState(() {
                      _status = 'Error: $err';
                    });
                  }
                },
                child: const Text('Pick file/files'),
              ),
              OutlinedButton(
                onPressed: () async {
                  try {
                    final files = await _safUtilPlugin.pickMedia();
                    if (files == null) {
                      setState(() {
                        _status = 'Cancelled by user';
                      });
                      return;
                    }
                    if (!context.mounted) {
                      return;
                    }

                    String summary =
                        'You have selected ${files.length} files:\n';
                    for (final file in files) {
                      summary +=
                          '${file.name}\nSize: ${file.length}\nUri:${file.uri}\n\n';
                    }
                    setState(() {
                      _status = summary;
                    });
                  } catch (err) {
                    setState(() {
                      _status = 'Error: $err';
                    });
                  }
                },
                child: const Text('Pick media files'),
              ),
              Text(_status),
              Text('Initial URI'),
              TextField(
                  controller: _initialUriController,
                  onChanged: (String value) {
                    setState(() {
                      _initialUri = value;
                    });
                  }),
              CheckboxListTile(
                  title: const Text('Pick multiple files'),
                  value: _multipleFiles,
                  onChanged: (value) {
                    setState(() {
                      _multipleFiles = value!;
                    });
                  }),
              CheckboxListTile(
                  title: const Text('Persistable permission'),
                  value: _persistablePermission,
                  onChanged: (value) {
                    setState(() {
                      _persistablePermission = value!;
                    });
                  }),
              TextField(
                  controller: _checkPersistablePermissionInputController,
                  onChanged: (String value) {
                    setState(() {
                      _checkPersistablePermissionInput = value;
                    });
                  }),
              OutlinedButton(
                onPressed: () async {
                  try {
                    final input = _checkPersistablePermissionInput;
                    if (input.isEmpty) {
                      return;
                    }
                    final ok =
                        await _safUtilPlugin.hasPersistedPermission(input);
                    if (!context.mounted) {
                      return;
                    }
                    await FcQuickDialog.info(context,
                        title: 'Is persisted permission?',
                        content: 'Persisted permission: $ok',
                        okText: 'OK');
                  } catch (err) {
                    setState(() {
                      _status = 'Error: $err';
                    });
                  }
                },
                child: const Text('Check URI permission persisted'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
12
likes
160
points
5.35k
downloads

Documentation

API reference

Publisher

verified publisherflutter-cavalry.com

Weekly Downloads

Util functions for SAF (Storage Access Framework).

Repository (GitHub)
View/report issues

License

BSD-3-Clause (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on saf_util

Packages that implement saf_util