Flutter文件选择插件file_selector的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter文件选择插件file_selector的使用

file_selector 是一个用于管理文件和与文件对话框交互的Flutter插件。本文将详细介绍如何使用该插件,包括安装、配置以及示例代码。

安装

要使用此插件,请在 pubspec.yaml 文件中添加 file_selector 作为依赖项:

dependencies:
  file_selector: ^latest_version

请确保替换 latest_version 为最新的版本号。你可以在 Pub 上查看最新版本。

平台支持

平台 支持情况
Android SDK 19+
iOS iOS 12+
Linux Any
macOS 10.14+
Web Any
Windows Windows 10+

对于 macOS 用户,您还需要根据需求添加相应的权限(Entitlements)。例如,如果您只需要读取权限,则添加以下内容到 macos/Runner/DebugProfile/Runner.entitlementsmacos/Runner/Release/Runner.entitlements 文件中:

<key>com.apple.security.files.user-selected.read-only</key>
<true/>

如果您需要读写权限,则使用以下代码:

<key>com.apple.security.files.user-selected.read-write</key>
<true/>

使用示例

以下是几个简单的示例,展示了如何使用 file_selector 插件的功能。

打开单个文件

import 'package:file_selector/file_selector.dart';

void openSingleFile() async {
  const XTypeGroup typeGroup = XTypeGroup(
    label: 'images',
    extensions: <String>['jpg', 'png'],
  );
  final XFile? file = await openFile(acceptedTypeGroups: <XTypeGroup>[typeGroup]);
  if (file != null) {
    print('Selected file path: ${file.path}');
  } else {
    print('No file selected.');
  }
}

打开多个文件

import 'package:file_selector/file_selector.dart';

void openMultipleFiles() async {
  const XTypeGroup jpgsTypeGroup = XTypeGroup(
    label: 'JPEGs',
    extensions: <String>['jpg', 'jpeg'],
  );
  const XTypeGroup pngTypeGroup = XTypeGroup(
    label: 'PNGs',
    extensions: <String>['png'],
  );
  final List<XFile> files = await openFiles(acceptedTypeGroups: <XTypeGroup>[
    jpgsTypeGroup,
    pngTypeGroup,
  ]);
  if (files.isNotEmpty) {
    for (final file in files) {
      print('Selected file path: ${file.path}');
    }
  } else {
    print('No files selected.');
  }
}

保存文件

import 'package:file_selector/file_selector.dart';

void saveFile() async {
  const String fileName = 'suggested_name.txt';
  final FileSaveLocation? result = await getSaveLocation(suggestedName: fileName);
  if (result == null) {
    print('Operation was canceled by the user.');
    return;
  }

  final Uint8List fileData = Uint8List.fromList('Hello World!'.codeUnits);
  const String mimeType = 'text/plain';
  final XFile textFile = XFile.fromData(fileData, mimeType: mimeType, name: fileName);
  await textFile.saveTo(result.path);
  print('File saved to: ${result.path}');
}

获取目录路径

import 'package:file_selector/file_selector.dart';

void getDirectory() async {
  final String? directoryPath = await getDirectoryPath();
  if (directoryPath == null) {
    print('Operation was canceled by the user.');
    return;
  }
  print('Selected directory path: $directoryPath');
}

过滤文件类型

不同平台支持不同的类型组过滤选项。为了防止某些平台上出现 ArgumentError,请确保传递的 XTypeGroup 设置了覆盖所有目标平台的过滤器,或者根据 Platform 条件传递不同的 XTypeGroup

示例:过滤文件类型

const XTypeGroup imagesTypeGroup = XTypeGroup(
  label: 'Images',
  extensions: <String>['jpg', 'png'],
  mimeTypes: <String>['image/jpeg', 'image/png'],
);

// For macOS and iOS, you might also want to include uniformTypeIdentifiers
if (Platform.isMacOS || Platform.isIOS) {
  imagesTypeGroup.uniformTypeIdentifiers = <String>['public.jpeg', 'public.png'];
}

final XFile? file = await openFile(acceptedTypeGroups: <XTypeGroup>[imagesTypeGroup]);

支持的功能

功能 描述 Android iOS Linux macOS Windows Web
选择单个文件 挑选文件/图片 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
选择多个文件 挑选多个文件/图片 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
选择保存位置 挑选保存文件的目录 ✔️ ✔️ ✔️
选择目录 挑选目录并获取其路径 ✔️† ✔️ ✔️ ✔️

注:† 在 Android SDK 21(Lollipop)之前的版本不支持选择目录。

完整示例项目结构

为了让您更好地理解如何集成 file_selector 到您的项目中,这里提供了一个完整的示例项目的部分代码片段:

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'File Selector Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const HomePage(),
      routes: <String, WidgetBuilder>{
        '/open/image': (BuildContext context) => const OpenImagePage(),
        '/open/images': (BuildContext context) => const OpenMultipleImagesPage(),
        '/open/text': (BuildContext context) => const OpenTextPage(),
        '/save/text': (BuildContext context) => SaveTextPage(),
        '/directory': (BuildContext context) => GetDirectoryPage(),
        '/multi-directories': (BuildContext context) => const GetMultipleDirectoriesPage()
      },
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('File Selector Demo')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () => Navigator.pushNamed(context, '/open/image'),
              child: const Text('Open Image'),
            ),
            ElevatedButton(
              onPressed: () => Navigator.pushNamed(context, '/open/images'),
              child: const Text('Open Multiple Images'),
            ),
            ElevatedButton(
              onPressed: () => Navigator.pushNamed(context, '/open/text'),
              child: const Text('Open Text File'),
            ),
            ElevatedButton(
              onPressed: () => Navigator.pushNamed(context, '/save/text'),
              child: const Text('Save Text File'),
            ),
            ElevatedButton(
              onPressed: () => Navigator.pushNamed(context, '/directory'),
              child: const Text('Get Directory Path'),
            ),
            ElevatedButton(
              onPressed: () => Navigator.pushNamed(context, '/multi-directories'),
              child: const Text('Get Multiple Directories Paths'),
            ),
          ],
        ),
      ),
    );
  }
}

通过以上步骤和示例代码,您可以轻松地将 file_selector 集成到您的 Flutter 应用程序中,并实现文件选择和保存功能。希望这些信息对您有所帮助!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用file_selector插件来选择文件的示例代码。这个插件允许用户从设备的存储中选择文件或目录。

首先,确保你的Flutter项目已经添加了file_selector插件。你可以在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  file_selector: ^0.10.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

接下来,让我们编写一个示例代码来演示如何使用file_selector插件。

  1. lib目录下创建一个新的Dart文件,例如file_selector_screen.dart
import 'package:flutter/material.dart';
import 'package:file_selector/file_selector.dart';
import 'package:file_selector_example/file_selector_result.dart';  // 稍后创建这个文件

class FileSelectorScreen extends StatefulWidget {
  @override
  _FileSelectorScreenState createState() => _FileSelectorScreenState();
}

class _FileSelectorScreenState extends State<FileSelectorScreen> {
  List<PlatformFile> _platformFiles = [];

  Future<void> _openFileExplorer() async {
    try {
      final result = await FileSelector.platform().getMultiFiles(
        acceptedTypes: [
          FileType.custom(
            extensions: ['.jpg', '.jpeg', '.png', '.gif', '.bmp'],
            mimeType: 'image/*',
            description: 'Images',
          ),
          FileType.allFiles(),
        ],
      );

      if (result != null && result.isNotEmpty) {
        setState(() {
          _platformFiles = result;
        });

        // 跳转到显示文件信息的页面
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => FileSelectorResult(_platformFiles),
          ),
        );
      }
    } catch (exception) {
      // 处理异常
      print(exception);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Selector Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _openFileExplorer,
          child: Text('Select Files'),
        ),
      ),
    );
  }
}
  1. 创建一个新的Dart文件,例如file_selector_result.dart,用于显示选择的文件信息
import 'package:flutter/material.dart';
import 'package:file_selector/file_selector.dart';

class FileSelectorResult extends StatelessWidget {
  final List<PlatformFile> platformFiles;

  FileSelectorResult(this.platformFiles);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Selected Files'),
      ),
      body: ListView.builder(
        itemCount: platformFiles.length,
        itemBuilder: (context, index) {
          final file = platformFiles[index];
          return ListTile(
            title: Text(file.name),
            subtitle: Text('Size: ${file.size} bytes'),
            trailing: IconButton(
              icon: Icon(Icons.share),
              onPressed: () {
                // 实现文件分享功能(例如通过Intent或其他方式)
                // 注意:这个示例中没有实现实际的分享逻辑
                print('Sharing file: ${file.uri}');
              },
            ),
          );
        },
      ),
    );
  }
}
  1. 在你的主文件(通常是main.dart)中,导入并使用这个新创建的FileSelectorScreen
import 'package:flutter/material.dart';
import 'file_selector_screen.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter File Selector Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FileSelectorScreen(),
    );
  }
}

以上代码展示了如何使用file_selector插件来选择文件,并将选择的文件信息显示在另一个页面上。你可以根据需要进一步扩展和修改这些代码。注意,由于平台差异(iOS和Android),某些功能可能需要额外的配置。

回到顶部