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),
),
),
],
),
);
}
}
ref.put
は、パラメーターとしてFile
を要求します。渡すのはFuture<File>
です。
電話をかけるには、その将来の結果を待つ必要があります。
コードを次のように変更できます
final StorageUploadTask uploadTask = ref.put(await _imageFile);
final Uri downloadUrl = (await uploadTask.future).downloadUrl;
または、_imageFile
をFuture<File>
ではなくFile
に変更します
同じエラーにはさまざまな理由があるように思われるため、まだ答えを探している人にとっては。私の場合、それは別の関数にパラメーターとして渡していたファイルの異なる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回発生します
続きを読む こちら
プラグインから README.md
_ Future getImage() async {
var image = await ImagePicker.pickImage(source: ImageSource.camera);
setState(() {
_image = image;
});
}
_
ImagePicker.pickImage()
はFuture
を返します。上記のコードに示すように、async
から値を取得するためにawait
/Future
を使用できます。