Flutter文件选择插件macos_file_picker的使用

Flutter文件选择插件macos_file_picker的使用

macos_file_picker 插件用于在macOS平台上打开原生的文件或文件夹选择对话框。此插件支持以下功能:

  • 选择文件。
  • 选择文件夹。
  • 同时选择文件和文件夹。
  • 选择保存文件的路径。

使用

/// 打开基于给定参数的macOS对话框。
///
/// [mode]:
///   file: 选择文件。
///   folder: 选择文件夹。
///   fileAndFolder: 选择文件和文件夹。
///   saveFile: 选择保存文件的路径。
///
/// [allowsMultiple] 当为true时,允许多选。默认值为false。
/// [defaultName] 保存对话框中的默认文件名。
///
/// 返回值:
///   [null]: 对话框关闭/取消。
///   一个包含[MacosFilePickerPath]对象的列表,表示平台路径。
///   当[allowsMultiple]为false时,列表应该只有一个元素。
Future<List<MacosFilePickerPath>?> pick(MacosFilePickerMode mode,
    {String? defaultName, bool? allowsMultiple});

示例

以下是使用 macos_file_picker 的完整示例代码:

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

import 'package:macos_file_picker/macos_file_picker.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _macosFilePickerPlugin = MacosFilePicker();
  var _mode = MacosFilePickerMode.file;
  var _allowsMultiple = false;
  var _output = '';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Container(
          padding: const EdgeInsets.all(20),
          child: Column(
            children: [
              DropdownButton<MacosFilePickerMode>(
                value: _mode,
                onChanged: (MacosFilePickerMode? newValue) {
                  if (newValue == null) {
                    return;
                  }
                  setState(() {
                    _mode = newValue;
                  });
                },
                items: MacosFilePickerMode.values
                    .map((MacosFilePickerMode classType) {
                  return DropdownMenuItem<MacosFilePickerMode>(
                      value: classType, child: Text(classType.toString()));
                }).toList(),
              ),
              _sep(),
              CheckboxListTile(
                title: const Text('允许多选'),
                value: _allowsMultiple,
                onChanged: (bool? value) {
                  if (value == null) {
                    return;
                  }
                  setState(() {
                    _allowsMultiple = value;
                  });
                },
              ),
              _sep(),
              OutlinedButton(
                  onPressed: _pick, child: const Text('打开对话框')),
              _sep(),
              Text(_output)
            ],
          ),
        ),
      ),
    );
  }

  Widget _sep() {
    return const SizedBox(
      height: 10,
    );
  }

  Future<void> _pick() async {
    var result = await _macosFilePickerPlugin.pick(_mode,
        allowsMultiple: _allowsMultiple);
    setState(() {
      _output = result == null ? '已取消' : result.toString();
    });
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中集成并使用macos_file_picker插件来选择文件的代码示例。这个插件允许你在macOS平台上选择文件或目录。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加file_picker依赖,该插件支持多个平台,包括macOS。

dependencies:
  flutter:
    sdk: flutter
  file_picker: ^4.3.3  # 请检查最新版本号

2. 导入插件

在你的Dart文件中导入package:file_picker/file_picker.dart

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

3. 配置Info.plist

对于macOS,你需要在Info.plist中添加对文件访问的权限配置。打开ios/Runner/Info.plist(对于macOS实际上是macos/Runner/Info.plist,但注意file_picker通常处理这部分配置),并添加以下权限(如果需要访问特定类型的文件,可以添加相应的键和值):

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
<key>IOSKeychainSharing</key>
<array>
    <string>$(APP_ID_PREFIX)com.example.yourappid</string>
</array>
<!-- 如果需要访问文档目录,可能还需要其他权限配置 -->

注意:对于macOS,通常不需要像iOS那样严格的权限配置,但确保你的应用有适当的权限来访问用户文件。

4. 使用文件选择器

下面是一个简单的示例,展示如何在Flutter应用中触发文件选择器并处理选择的结果。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('File Picker Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _pickFiles,
            child: Text('Pick Files'),
          ),
        ),
      ),
    );
  }

  Future<void> _pickFiles() async {
    FilePickerResult? result = await FilePicker.platform.pickFiles(
      allowMultiple: true,
      type: FileType.any, // 可以是FileType.custom, 指定扩展名等
    );

    if (result != null) {
      // 处理选择的文件
      List<FilePickerFile> files = result.files;
      files.forEach((FilePickerFile file) {
        print(file.path);
        print(file.name);
        print(file.extension);
        print(file.size);
        print(file.bytes!.lengthInBytes); // 注意:bytes是LazyData,需要小心处理
      });
    } else {
      // 用户取消了选择
      print('No file selected.');
    }
  }
}

注意事项

  • 确保在macOS上运行你的Flutter应用时,使用的是支持桌面端开发的Flutter SDK和工具链。
  • file_picker插件在后台做了大量工作来处理不同平台的文件选择对话框和权限管理,但你可能仍然需要根据具体需求调整配置。
  • 在处理文件路径和文件数据时,注意性能和内存管理,尤其是当处理大文件时。

以上代码提供了一个基本的框架,展示了如何在Flutter macOS应用中集成和使用macos_file_picker(实际上是通过file_picker插件实现的跨平台功能)。根据你的具体需求,你可能需要进一步定制和扩展这些功能。

回到顶部