【问题标题】:Flutter plugin for a file picker that works on mobile and desktop that doesn't require go-flutter?适用于不需要 go-flutter 的移动设备和桌面设备的文件选择器的 Flutter 插件?
【发布时间】:2021-10-15 09:38:33
【问题描述】:

这似乎是一个不会持续很长时间的问题,但我正在寻找最终解决方案,以便在包括桌面在内的所有平台上打开本机文件选择器,而无需安装 go-flutter。

目前我正在使用 Flutter.dev 的 file_selector 插件,它适用于 web 和 macOS(我尚未在 windows/linux 上进行测试)。当我尝试在 iOS 模拟器上运行它时,出现错误。

MissingPluginException(No implementation found for method openFile on channel plugins.flutter.io/file_selector)

我猜这是因为它不支持 iOS,也许这个插件只适用于桌面和网络。

我还看到了file_picker plugin,但它需要在桌面上安装 go-flutter 才能使其工作。我宁愿直接在 Android Studio 中进行良好的热重载/构建,而不需要 go-flutter 命令来运行桌面模拟。

有没有基本上结合这两件事的一站式解决方案?我对 Flutter 很陌生,所以也许我错过了一种非常简单的方法来使用一个或另一个库,具体取决于具有某种条件的平台?走这条路似乎有点乱,但现在可以。

我正在寻找的另一个答案是以更简单的方式在桌面上使用 file_picker 插件的好解决方案,例如如何无缝使用 go-flutter。

【问题讨论】:

  • 对于您的 go-flutter-desktop 问题,请记住,使用它不仅仅是工具差异的问题。这是一个完全不同的嵌入。您使用它构建的应用程序对于最终用户的行为方式与使用官方桌面嵌入构建的分配方式不同。例如,您会在那里看到官方嵌入中不存在的错误。你也不能使用除 go-flutter-desktop 插件之外的任何插件。
  • @smorgan 谢谢,这是有道理的。我肯定会避免使用这种 go​​-flutter-desktop 选项。

标签: flutter flutter-plugin flutter-desktop flutter-ios flutter-android


【解决方案1】:

我最终使用条件来检测平台,并将使用 file_picker 用于 iOS/Android,然后使用 file_selector 用于 web/desktop。

到目前为止,它运行良好。我可能会编写一个快速包装器来将其从主代码中抽象出来。

【讨论】:

    【解决方案2】:

    目前看来,最简单的方法是在 Windows/Mac/Linux 上使用 file_picker_desktop 和在 Android/iOS/Web 上使用 file_picker 之类的包。它们似乎具有相似的 API,因此您可以在您的应用上创建一个调用正确库的包装函数。

    【讨论】:

    • OP 已经在使用的 file_selector 将提供比file_picker_desktop 更好的用户体验。后者生成单独的进程,显示未以任何方式连接到应用程序的窗口。他们将有焦点问题,与应用程序切换交互不良等。
    【解决方案3】:
    import 'dart:io' show Platform;
    import 'package:flutter/foundation.dart' show kIsWeb;
    
    
    if (Platform.isAndroid || Platform.isIOS)) {
     // use file_picker plugin
          FilePickerResult? result = await FilePicker.platform.pickFiles();
         if(result != null) {
         File file = File(result.files.single.path);
         } else {
         // User canceled the picker
         }
    } else if(kIsWeb) { 
      // use file_selector plugin 
     final typeGroup = XTypeGroup(label: 'images', extensions: ['jpg', 
      'png']);
       final file = await openFile(acceptedTypeGroups: [typeGroup]);
    } else {
    // use file_picker_desktop
       try {
       final result = await pickFiles(
       allowMultiple: false,
       );
        if (result != null) {
        File file = File(result.files.single.path);
        } else {
        // User canceled the picker
        }
        } catch (e) {
        print(e);
        }
    }
    

    【讨论】:

    • file_selector 插件现在实际上也适用于桌面。我现在将 file_picker 用于移动应用程序,其他一切(包括网络)都使用 file_selector。
    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2022-06-17
    • 2018-11-26
    • 1970-01-01
    • 2017-03-16
    • 2022-07-06
    相关资源
    最近更新 更多