Как открыть средство выбора графических файлов во Flutter в Linux?

У меня проблемы с открытием средства выбора графических файлов в Linux во Flutter, Flutter просто не может сделать это из окна на рабочем столе. Я использую Flutter 1.24.0-3.0.pre, чтобы получить поддержку рабочего стола в Dart.

Итак, как открыть его в Linux?

(Я создал этот вопрос после его решения, чтобы поделиться с вами ответом)


person Роман    schedule 31.10.2020    source источник


Ответы (2)


Для этого существует плагин, который работает на всех на настольных платформах и поддерживает панели открытия и сохранения.

person smorgan    schedule 31.10.2020

Я создал класс для этого:

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 (расширение);

Выберите файл с помощью графического средства выбора GTK, вы можете не указывать расширение, набрав undefined в аргументах функции

FilePicker().pickDirectory();

Выберите каталог с помощью графического средства выбора GTK

Код может быть плохим, я новичок в Dart и Flutter :)

person Роман    schedule 31.10.2020
comment
Запуск отдельного процесса значительно ухудшит пользовательский опыт, чем диалог внутри процесса. - person smorgan; 31.10.2020