Flutter系统文件夹访问插件open_system_folder的使用

Flutter系统文件夹访问插件open_system_folder的使用

当你在文件系统中存储用户文件,并且不想编写自定义UI来管理这些文件时,你可以直接打开默认的文件管理器应用,让用户在那里查看、复制、共享或删除内容。

Android支持的文件夹:

  • 下载(低于Android 10)
  • 文档(Android 10及以上)

iOS支持的文件夹:

由于iOS没有系统文件夹,它总是打开你的应用的文档文件夹。

开始使用

在项目中找到pubspec.yaml文件,在dependencies:下添加以下依赖:

dependencies:
  open_system_folder: ^x.x.x

然后在你的Dart文件中导入该包:

import 'package:open_system_folder/open_system_folder.dart';

Android

设置

无需额外设置。

示例代码

// 打开Android默认文件管理器中的Documents文件夹
await openSystemFolder(systemFolder: SystemFolder.documents);

// 打开Android默认文件管理器中的Documents/Some/One文件夹
await openSystemFolder(systemFolder: SystemFolder.documents, subPath: 'Some/One');

iOS

设置

Info.plist文件中添加UISupportsDocumentBrowser键,并将其值设为YES。这允许你的应用的文档文件夹被Files应用发现。如果没有这一步,你将无法在Files应用中看到你的应用的文档文件夹。

示例代码

// 打开iOS的Files应用中的YourApp文件夹
await openSystemFolder(systemFolder: SystemFolder.documents);

// 打开iOS的Files应用中的YourApp/Some/One文件夹
await openSystemFolder(systemFolder: SystemFolder.documents, subPath: 'Some/One');

如何在系统文件夹中创建文件

下载文件夹

Android:

在SDK < 13之前,你应该在访问文件/文件夹之前使用permission_handler插件。你还需要在AndroidManifest.xml中更新权限:

<application 
    ...
    android:requestLegacyExternalStorage="true"
  >
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

下载文件夹位于/storage/emulated/0/Download/

iOS:

建议使用path_provider插件中的getApplicationDocumentsDirectory方法。

文档文件夹

待补充。

未来计划

  1. Android有不同的系统文件夹版本。看起来Download文件夹是稳定的,但Documents或其他可能的文件夹(如视频、图片等)可能会有缺失。因此,我想弄清楚可以支持哪些文件夹。
  2. 待补充。

更新日志

请参阅更新日志页面了解最近的更改。

贡献

如果发现bug,请在问题页面提交问题。你也可以自行修复或改进并创建拉取请求

完整示例代码

以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:open_system_folder/open_system_folder.dart';

void main() => runApp(const MyApp());

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(home: HomePage());
  }
}

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

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<SystemFolder> get _testFolders => [
        SystemFolder.documents,
        SystemFolder.downloads,
      ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('OpenSystemFolder Example')),
      body: Center(
        child: ListView.separated(
          itemCount: _testFolders.length,
          shrinkWrap: true,
          physics: const NeverScrollableScrollPhysics(),
          itemBuilder: (context, index) {
            final item = _testFolders[index];
            return Padding(
              padding: const EdgeInsets.symmetric(horizontal: 32),
              child: ElevatedButton(
                onPressed: () async => _openFolder(context, item),
                child: Text('Open ${item.name}'),
              ),
            );
          },
          separatorBuilder: (context, index) => const SizedBox(
            height: 16,
          ),
        ),
      ),
    );
  }

  Future<void> _openFolder(
    BuildContext context,
    SystemFolder folder,
  ) async {
    if (!context.mounted) return;
    try {
      await openSystemFolder(
        systemFolder: folder,
        // Android: 在下载或文档文件夹中
        // iOS: 在你的应用文件夹中
        // 创建一个名为'Some'的文件夹,然后在'Some'中创建一个名为'One'的文件夹。
        // 然后取消注释下一行:
        // subPath: 'Some/One',
      );
    } catch (error) {
      if (!context.mounted) return;
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          backgroundColor: Theme.of(context).primaryColor,
          content: Text('$error'),
        ),
      );
    }
  }
}

更多关于Flutter系统文件夹访问插件open_system_folder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter系统文件夹访问插件open_system_folder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 open_system_folder 插件在 Flutter 中访问系统文件夹的示例代码。这个插件允许你打开设备的系统文件夹,比如相册、文档等。

首先,你需要在 pubspec.yaml 文件中添加 open_system_folder 依赖:

dependencies:
  flutter:
    sdk: flutter
  open_system_folder: ^x.y.z  # 请替换为最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,你可以在你的 Flutter 应用中使用这个插件。以下是一个简单的示例,展示了如何打开相册文件夹:

import 'package:flutter/material.dart';
import 'package:open_system_folder/open_system_folder.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Open System Folder Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 打开相册文件夹(示例)
              bool result = await OpenSystemFolder.openFolder(
                folderType: FolderType.PICTURES, // 可以使用其他FolderType,比如DOCUMENTS, DOWNLOADS等
              );
              
              if (result) {
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Folder opened successfully!')),
                );
              } else {
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Failed to open folder.')),
                );
              }
            },
            child: Text('Open Pictures Folder'),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们定义了一个简单的 Flutter 应用,它包含一个按钮。当用户点击按钮时,应用会尝试打开设备的相册文件夹。OpenSystemFolder.openFolder 方法返回一个布尔值,表示操作是否成功。

FolderType 是一个枚举,包含了可以打开的不同类型的文件夹。以下是一些可用的 FolderType 值:

enum FolderType {
  PICTURES,
  DOCUMENTS,
  DOWNLOADS,
  MUSIC,
  // 其他可能的文件夹类型
}

你可以根据需要选择适当的 FolderType

请注意,不同平台和设备可能对系统文件夹的访问有不同的限制,因此在实际应用中,可能需要进行额外的权限处理或错误处理。

回到顶部