前提・実現したいこと
https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_storage/example/lib/main.dart
上記ページのサンプルの
_uploadFile()
メソッドを少し修正して、ギャラリーから画像・動画を選択したらfirebase_storageに
アップロードするコードを書いてみたんですが、
下記のコードで、androidエミュレータでは画像のアップロードまでエラー出ずに
できているんですが、
iOSシミュレータだと「写真を選択」ボタンを押すと下記のエラーメッセージが出て、
アプリが終了してしまいます。
どうすれば画像アップロードまでいけますでしょうか。
https://qiita.com/toshinobu111/items/ea7556adfa5545e26e76
上記ページのコードを参考にして画像ファイル取得部分を書きました。
上記ページのサンプルをそのまま動かすと、iOSシミュレータでもエラーが出ずに、
画像の取得、表示までできています。
発生している問題・エラーメッセージ
Launching lib/main.dart on iPhone 11 Pro Max in debug mode... Running Xcode build... Xcode build done. 20.1s Debug service listening on ws://127.0.0.1:51061/bcCCsTCnA4Q=/ws Syncing files to device iPhone 11 Pro Max... flutter: 途中経過 Lost connection to device.
該当のソースコード
import 'dart:async'; import 'dart:io'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:uuid/uuid.dart'; import 'package:image_picker/image_picker.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final FirebaseApp app = await FirebaseApp.configure( name: 'test', options: FirebaseOptions( googleAppID: (Platform.isIOS || Platform.isMacOS) ? '1:1093333335750:ios:3cad47613131f2a0636fud' : '1:1093333335750:android:d449e7e6f8b51902636www', gcmSenderID: '1033313655780', apiKey: 'AIzaidAEwrHQAtQqFUpOrJcAlod3FAwvosssss', projectID: 'prono90', ), ); final FirebaseStorage storage = FirebaseStorage( app: app, storageBucket: /*'gs://flutter-firebase-plugins.appspot.com'*/ 'gs://prono90.appspot.com' ); runApp(MyApp(storage: storage)); } class MyApp extends StatelessWidget { MyApp({this.storage}); final FirebaseStorage storage; @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Storage Example', home: MyHomePage(storage: storage), ); } } class MyHomePage extends StatefulWidget { MyHomePage({this.storage}); final FirebaseStorage storage; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey(); List<StorageUploadTask> _tasks = <StorageUploadTask>[]; Future<void> _uploadFile() async { print("途中経過"); final picker=ImagePicker(); final String uuid = Uuid().v1(); final Directory systemTempDir = Directory.systemTemp; /* final File file = await File('${systemTempDir.path}/foo$uuid.txt').create(); await file.writeAsString(kTestString); assert(await file.readAsString() == kTestString); */ final PickedFile pF=await picker.getImage(source: ImageSource.gallery); final File file=File(pF.path);; final StorageReference ref = widget.storage.ref().child('text').child('foo$uuid.txt'); final StorageUploadTask uploadTask = ref.putFile( file, StorageMetadata( contentLanguage: 'en', customMetadata: <String, String>{'activity': 'test'}, ), ); setState(() { _tasks.add(uploadTask); }); } Future<void> _downloadFile(StorageReference ref) async { //質問とは関係ないので中身は省略 } @override Widget build(BuildContext context) { final List<Widget> children = <Widget>[]; _tasks.forEach((StorageUploadTask task) { final Widget tile = UploadTaskListTile( task: task, onDismissed: () => setState(() => _tasks.remove(task)), onDownload: () => _downloadFile(task.lastSnapshot.ref), ); children.add(tile); }); return Scaffold( key: _scaffoldKey, appBar: AppBar( title: const Text('Flutter Storage Example'), actions: <Widget>[ IconButton( icon: const Icon(Icons.clear_all), onPressed: _tasks.isNotEmpty ? () => setState(() => _tasks.clear()) : null, ) , IconButton( icon: const Icon(Icons.call), onPressed: _tasks.isNotEmpty ? () => setState(() => _tasks.clear()) : null, ) , IconButton( icon: const Icon(Icons.call), onPressed: _tasks.isNotEmpty ? () => setState(() => _tasks.clear()) : null, ) , IconButton( icon: const Icon(Icons.call), onPressed: _tasks.isNotEmpty ? () => setState(() => _tasks.clear()) : null, ) ], ), body: Stack( children:<Widget>[ ListView( children: children, ), RaisedButton( child: Text("写真を選択"), onPressed: () => _uploadFile() /// ここにImagePickerの処理を書く, ) , ] /* floatingActionButton: FloatingActionButton( onPressed: _uploadFile, tooltip: 'Upload', child: const Icon(Icons.file_upload), ), */ ) ); } } class UploadTaskListTile extends StatelessWidget { const UploadTaskListTile( {Key key, this.task, this.onDismissed, this.onDownload}) : super(key: key); final StorageUploadTask task; final VoidCallback onDismissed; final VoidCallback onDownload; String get status { String result; if (task.isComplete) { if (task.isSuccessful) { result = 'Complete'; } else if (task.isCanceled) { result = 'Canceled'; } else { result = 'Failed ERROR: ${task.lastSnapshot.error}'; } } else if (task.isInProgress) { result = 'Uploading'; } else if (task.isPaused) { result = 'Paused'; } return result; } String _bytesTransferred(StorageTaskSnapshot snapshot) { return '${snapshot.bytesTransferred}/${snapshot.totalByteCount}'; } @override Widget build(BuildContext context) { return StreamBuilder<StorageTaskEvent>( stream: task.events, builder: (BuildContext context, AsyncSnapshot<StorageTaskEvent> asyncSnapshot) { Widget subtitle; if (asyncSnapshot.hasData) { final StorageTaskEvent event = asyncSnapshot.data; final StorageTaskSnapshot snapshot = event.snapshot; subtitle = Text('$status: ${_bytesTransferred(snapshot)} bytes sent'); } else { subtitle = const Text('Starting...'); } return Dismissible( key: Key(task.hashCode.toString()), onDismissed: (_) => onDismissed(), background:Container( color:Colors.lightBlueAccent, ), child: ListTile( title: Text('Upload Task #${task.hashCode}'), subtitle: subtitle, trailing: Row( mainAxisSize: MainAxisSize.min, children: <Widget>[ Offstage( offstage: !task.isInProgress, child: IconButton( icon: const Icon(Icons.pause), onPressed: () => task.pause(), ), ), Offstage( offstage: !task.isPaused, child: IconButton( icon: const Icon(Icons.file_upload), onPressed: () => task.resume(), ), ), Offstage( offstage: task.isComplete, child: IconButton( icon: const Icon(Icons.cancel), onPressed: () => task.cancel(), ), ), Offstage( offstage: !(task.isComplete && task.isSuccessful), child: IconButton( icon: const Icon(Icons.file_download), onPressed: onDownload, ), ), ], ), ), ); }, ); } }
試したこと
コードのコメントアウト→実行を繰り返した結果、_uploadFileメソッドの
final PickedFile pF=await picker.getImage(source: ImageSource.gallery);
の行でアプリの強制終了?が起きていることまではわかりましたが、
そこからどうすればいいかわかりません。
質問文でも書きましたが、
https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_storage/example/lib/main.dart
のページのサンプルコードはiOSシミュレータでも問題なく動きます。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー