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
方法。
文档文件夹
待补充。
未来计划
- Android有不同的系统文件夹版本。看起来
Download
文件夹是稳定的,但Documents
或其他可能的文件夹(如视频、图片等)可能会有缺失。因此,我想弄清楚可以支持哪些文件夹。 - 待补充。
更新日志
请参阅更新日志页面了解最近的更改。
贡献
如果发现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
更多关于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
。
请注意,不同平台和设备可能对系统文件夹的访问有不同的限制,因此在实际应用中,可能需要进行额外的权限处理或错误处理。