es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo resolver “error: El método ‘lengthSync’ y ‘openRead’ no está definido para el tipo ‘FilePickerResult'” en Flutter?

Quiero subir varias imágenes a Google Drive. Estoy utilizando la versión de seguridad nula de Flutter y utilizando un ejemplo: https://www.c-sharpcorner.com/article/google-drive-integration-in-flutter-upload-download-list-files/.

En el ejemplo anterior, el creador está utilizando una versión obsoleta de Flutter.

Estoy utilizando file_picker: ^4.2.1y el código que está generando un error:
uploadFileToGoogleDrive() async {
var client = GoogleHttpClient(await googleSignInAccount!.authHeaders);
var drive = ga.DriveApi(client);
ga.File fileToUpload = ga.File();

var file = await FilePicker.platform.pickFiles(
  type: _pickingType,
  allowMultiple: _multiPick,
  onFileLoading: (FilePickerStatus status) => print(status),
  allowedExtensions: (_extension?.isNotEmpty ?? false)
      ? _extension?.replaceAll(' ', '').split(',')
      : null,
);
fileToUpload.parents = ["appDataFolder"];
fileToUpload.name = path.basename(file!.paths);
var response = await drive.files.create(
  fileToUpload,
  uploadMedia: ga.Media(file.openRead(), file.lengthSync()),
);
print(response);
_listGoogleDriveFiles();

}“`

y los errores son:

  1. No se puede asignar el tipo de argumento ‘List<String?>’ al tipo de parámetro ‘String’.
  2. El método ‘openRead’ no está definido para el tipo ‘FilePickerResult’.
  3. El método ‘lengthSync’ no está definido para el tipo ‘FilePickerResult’.

El error se debe principalmente a la diferente versión del paquete file_picker. ¿Puede sugerir otro paquete o algún cambio que se pueda hacer en el código?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que los errores se deben al cambio en el tipo de retorno del método FilePicker.platform.pickFiles() en la versión más reciente del paquete file_picker usado en el proyecto actual. Para solucionar los errores, puede intentar los siguientes cambios:

    • Reemplaza la declaración de importación para dart:io con package:flutter_absolute_path/flutter_absolute_path.dart.
    • Reemplaza FilePicker.platform.pickFiles() con await FilePicker.platform.pickFiles(allowMultiple: true) para permitir siempre la selección múltiple de archivos.
    • Modifica la implementación de fileToUpload.name para extraer el nombre del archivo de la ruta usando el paquete FlutterAbsolutePath.

    Aquí hay un fragmento de código actualizado:

    import 'package:flutter_absolute_path/flutter_absolute_path.dart';
    
    _uploadFileToGoogleDrive() async {
      var client = GoogleHttpClient(await googleSignInAccount!.authHeaders);
      var drive = ga.DriveApi(client);
      ga.File fileToUpload = ga.File();
    
      var files = await FilePicker.platform.pickFiles(allowMultiple: true);
      if (files == null || files.files.isEmpty) return;
    
      fileToUpload.parents = ["appDataFolder"];
      for (var file in files.files) {
        String path = await FlutterAbsolutePath.getAbsolutePath(file.path!);
        String name = path.substring(path.lastIndexOf('/') + 1);
        fileToUpload.name = name;
        var response = await drive.files.create(
          fileToUpload,
          uploadMedia: ga.Media(file.openRead(), file.size),
        );
        print(response);
      }
      _listGoogleDriveFiles();
    }
    

    Este código actualizado usa el paquete FlutterAbsolutePath para extraer el nombre del archivo de la ruta de los archivos seleccionados. Además, ahora permite seleccionar varios archivos a la vez. Tenga en cuenta que puede ser necesario agregar el paquete flutter_absolute_path a las dependencias de su proyecto.

Comments are closed.