webentwicklung-frage-antwort-db.com.de

flatter-/Dartfehler: Der Argumenttyp 'Future <File>' kann nicht dem Parametertyp 'File' zugeordnet werden

Ich versuche, meine erste mobile Anwendung mit Flatter und Firebase zu erstellen ... Wenn ich versuche, ein Foto anzuzeigen und zu speichern, habe ich folgendes Problem: 

fehler: Der Argumenttyp 'Future' kann nicht dem Parametertyp 'File' zugeordnet werden. (argument_type_not_assignable um [whilesistant] lib/main.Dart: 85)

Ich sollte wahrscheinlich etwas Casting machen, aber ich verstehe nicht, dass Hox es richtig macht.

Hier ist meine zukünftige Aktenerklärung: 

Future<File> _imageFile;

Ich mache ein Foto, das auf dem Bildschirm angezeigt wird: 

    setState(() {
      _imageFile = ImagePicker.pickImage(source: source);
    });

Ich habe jedoch den Fehler, wenn ich versuche, das Foto an Firebase zu senden: 

    final StorageUploadTask uploadTask = ref.put(_imageFile);
    final Uri downloadUrl = (await uploadTask.future).downloadUrl;

Hier ist die Klasse, die ich basierend auf einem Codebeispiel verwende:

class _MyHomePageState extends State<MyHomePage> {
  Future<File> _imageFile;

  void _onImageButtonPressed(ImageSource source) async {
    GoogleSignIn _googleSignIn = new GoogleSignIn();
    var account = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth = await account.authentication;
    final FirebaseUser user = await _auth.signInWithGoogle(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    assert(user.email != null);
    assert(user.displayName != null);
    assert(!user.isAnonymous);
    assert(await user.getIdToken() != null);

    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);

    setState(() {
      _imageFile = ImagePicker.pickImage(source: source);
    });
    var random = new Random().nextInt(10000);
    var ref = FirebaseStorage.instance.ref().child('image_$random.jpg');
    final StorageUploadTask uploadTask = ref.put(_imageFile);
    final Uri downloadUrl = (await uploadTask.future).downloadUrl;
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: const Text('Where Assistant'),
      ),
      body: new Center(
        child: new FutureBuilder<File>(
          future: _imageFile,
          builder: (BuildContext context, AsyncSnapshot<File> snapshot) {
            debugPrint('test recup image');
            print(snapshot);

            if (snapshot.connectionState == ConnectionState.done &&
                snapshot.data != null) {
              return new Image.file(snapshot.data);
            } else if (snapshot.error != null) {
              return const Text('Error picking image.');
            } else {
              return const Text('No image so far.');
            }
          },
        ),
      ),
      floatingActionButton: new Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          new FloatingActionButton(
            onPressed: () => _onImageButtonPressed(ImageSource.gallery),
            tooltip: 'Pick an image from gallery',
            child: new Icon(Icons.photo_library),
          ),
          new Padding(
            padding: const EdgeInsets.only(top: 16.0),
            child: new FloatingActionButton(
              onPressed: () => _onImageButtonPressed(ImageSource.camera),
              tooltip: 'Take a Photo',
              child: new Icon(Icons.camera_alt),
            ),
          ),
        ],
      ),
    );
  }
}
5
hawkbee

ref.put fragt nach einer File als Parameter. Was Sie übergeben, ist ein Future<File>

Sie müssen auf das Ergebnis dieser Zukunft warten, um Ihren Anruf zu tätigen.

Sie können Ihren Code in ändern

final StorageUploadTask uploadTask = ref.put(await _imageFile);
final Uri downloadUrl = (await uploadTask.future).downloadUrl;

Oder _imageFile in File anstelle von Future<File> ändern

5
Rémi Rousselet

Für diejenigen, die immer noch nach Antworten suchen, gibt es unterschiedliche Gründe für denselben Fehler. In meinem Fall war es die unterschiedliche Importanweisung für eine Datei, die ich als Parameter an eine andere Funktion übergeben habe. Bei Deklaration und Definition sollte es sich um dieselbe Datei (Import) handeln. 

zum Beispiel verwende nicht so in Dart:

import 'GitRepoResponse.Dart';
import 'GitRowItem.Dart';

und dann in einer anderen Klasse 

import 'package:git_repo_flutter/GitRepoResponse.Dart';
import 'package:git_repo_flutter/GitRowItem.Dart';

da

In Dart sind zwei Bibliotheken gleich und nur dann, wenn sie mit derselben URI importiert werden. Wenn zwei unterschiedliche URIs verwendet werden, selbst wenn sie in dieselbe Datei aufgelöst werden, werden sie als zwei verschiedene Bibliotheken betrachtet, und die Typen in der Datei werden zweimal vorkommen

Lesen Sie mehr hier

1
vikas kumar

Aus dem Plugin README.md

  Future getImage() async {
    var image = await ImagePicker.pickImage(source: ImageSource.camera);

    setState(() {
      _image = image;
    });
  }

ImagePicker.pickImage() gibt eine Future zurück. Sie können async/await wie im Code oben angezeigt verwenden, um den Wert aus der Future zu erhalten.

1