ошибка: тип аргумента '(Файл) → Future <dynamic>' нельзя присвоить типу параметра '(динамический) → FutureOr <dynamic>' - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь скомпилировать пример из: https://github.com/dart-lang/googleapis_examples/blob/master/drive_upload_download_console/bin/main.dart

и получаю следующую ошибку компиляции Dart

ошибка: Тип аргумента '(Файл) → Future'нельзя назначить типу параметра' (динамический) → FutureOr '.(arguments_type_not_assignable в lib / google_api_rest / main.dart: 49)

из следующего кода:

 // Download a file from Google Drive.
    Future downloadFile(drive.DriveApi api,
                        Client client,
                        String objectId,
                        String filename) {
      return api.files.get(objectId).then((drive.File file) {
        // The Drive API allows one to download files via `File.downloadUrl`.
        return client.readBytes(file.downloadUrl).then((bytes) {
          var stream = new File(filename).openWrite()..add(bytes);
          return stream.close();
        });
      });

Я использую Android Studio 3.2.1, Dart-Idk 2.1.0-dev.9.4 со стабильным каналом Flutter 1.0.0.

Я новичок в Dart и Flutter, может кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 12 декабря 2018

api.files.get() статически объявлено как , возвращает Future.Голый Future без общего является неявным Future<dynamic>.Вызов Future<T>.then занимает Function(T), что означает Function(dynamic).Вы передаете Function(File).

Возможно, вы знаете, что Future всегда будет преобразовываться в File, но статически компилятор этого не знает.

В идеалеподпись api.files.get() должна быть обновлена, чтобы указать, что она возвращает Future<File>.В то же время вы можете обойти это:

  return api.files.get(objectId).then((result) {
    var file = result as drive.File;
    // The Drive API allows one to download files via `File.downloadUrl`.
    return client.readBytes(file.downloadUrl).then((bytes) {
      var stream = new File(filename).openWrite()..add(bytes);
      return stream.close();
    });
...