web-dev-qa-db-ja.com

flutter / Dartエラー:引数タイプ「Future <File>」をパラメータータイプ「File」に割り当てることができません

FlutterとFirebaseを使用して最初のモバイルアプリケーションを構築しようとしています。写真を表示して保存しようとすると、次の問題が発生します。

エラー:引数タイプ「Future」をパラメータータイプ「File」に割り当てることはできません。 (argument_type_not_assignable at [whereassistant] lib/main.Dart:85)

おそらくいくつかのキャストを行う必要がありますが、それを適切に行うにはhoxが理解できません。

Futureファイルの宣言は次のとおりです。

Future<File> _imageFile;

私は画面に表示される写真を撮っています:

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

しかし、写真をFirebaseに送信しようとするとエラーが発生します:

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

コード例に基づいて使用しているクラスは次のとおりです。

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),
            ),
          ),
        ],
      ),
    );
  }
}
8
hawkbee

ref.putは、パラメーターとしてFileを要求します。渡すのはFuture<File>です。

電話をかけるには、その将来の結果を待つ必要があります。

コードを次のように変更できます

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

または、_imageFileFuture<File>ではなくFileに変更します

8
Rémi Rousselet

同じエラーにはさまざまな理由があるように思われるため、まだ答えを探している人にとっては。私の場合、それは別の関数にパラメーターとして渡していたファイルの異なるimportステートメントでした。宣言と定義の場合、同じファイル(インポート)である必要があります。

たとえば、Dartではthisのように使用しないでください:

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

そして別のクラスで

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

because

Dartでは、同じURIを使用してインポートされた場合にのみ、2つのライブラリは同じです。 2つの異なるURIが使用される場合、同じファイルに解決される場合でも、それらは2つの異なるライブラリと見なされ、ファイル内のタイプは2回発生します

続きを読む こちら

3
vikas kumar

プラグインから README.md

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

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

ImagePicker.pickImage()Futureを返します。上記のコードに示すように、asyncから値を取得するためにawait/Futureを使用できます。

0