如何在 Linux 上的 Flutter 中打开图形文件选择器?

Posted

技术标签:

【中文标题】如何在 Linux 上的 Flutter 中打开图形文件选择器?【英文标题】:How to open graphical files picker in Flutter on Linux? 【发布时间】:2021-02-13 14:35:48 【问题描述】:

我在 Flutter 中打开 Linux 上的图形文件选择器时遇到问题,Flutter 无法在桌面上“从盒子”中执行此操作。我正在使用 Flutter 1.24.0-3.0.pre 在 Dart 中获得桌面支持。

那么,如何在 Linux 上打开呢?

(我在解决这个问题后创建了这个问题,与您分享答案)

【问题讨论】:

【参考方案1】:

我已经创建了类来做到这一点:

class FilePicker 
  String pickFile(String extension) 
    bool _noExtension = false;
    String _file = "undefined";

    Process.run('which', ['zenity'], runInShell: true).then((pr) 
      if (pr.exitCode != 0) 
        print("zenity not found.");
        return null;
      

      print("zenity found.");
    );

    if (extension == "undefined") 
      _noExtension = true;
      print("WARNING: extension not specified.");
    

    Process.run(
            'zenity',
            [
              '--file-selection',
              !_noExtension ? '--file-filter=' + '*.' + extension + '' : '',
            ],
            runInShell: false)
        .then((pr) 
      if (pr.exitCode != 0) 
        print("user canceled choice.");
        print(pr.stderr.toString());
        print(pr.stdout.toString());
        return null;
      

      _file = pr.stdout.toString();
      print("File: " + _file);
      return _file;
    );

    return null;
  

  String pickDirectory() 
    String _dir = "undefined";

    Process.run('which', ['zenity'], runInShell: true).then((pr) 
      if (pr.exitCode != 0) 
        print("zenity not found.");
        return null;
      

      print("zenity found.");
    );

    Process.run('zenity', ['--file-selection', '--directory'], runInShell: true)
        .then((pr) 
      if (pr.exitCode != 0) 
        print("user canceled choice.");
        print(pr.stderr.toString());
        print(pr.stdout.toString());
        return null;
      

      _dir = pr.stdout.toString();
      print("Directory: " + _dir);
      return _dir;
    );

    return null;
  

方法:

FilePicker().pickFile("extension");

使用 GTK 图形选择器选择文件,您可以不指定扩展名,方法是在函数参数中键入“undefined”

FilePicker().pickDirectory();

使用 GTK 图形选择器选择目录

代码可能很差,我是 Dart 和 Flutter 的新手 :)

【讨论】:

启动一个单独的进程将提供比进程内对话更糟糕的用户体验。【参考方案2】:

a plugin 适用于所有桌面平台,支持打开和保存面板。

【讨论】:

以上是关于如何在 Linux 上的 Flutter 中打开图形文件选择器?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter开发——Linux嵌入式应用开发

如何使用 Flutter 打开 iPhone 上的默认电子邮件应用程序?

如何解决 Flutter 上的 XMLHttpRequest 错误?

Flutter:如何在 webview 中阻止全屏视频?

如何在 Flutter 应用中点击复制 html 文本

PC端上的CAD看图软件如何同时打开多张CAD图纸?