質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Q&A

解決済

1回答

3862閲覧

Flutter ギャラリーから画像取得→Firebase_storageに保存する際、iOSシミュレータが強制終了してしまう

moriman

総合スコア615

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

0グッド

0クリップ

投稿2020/06/01 06:41

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

hoshi-takanori様にお示し頂いたページと
https://teratail.com/questions/216986?link=qa_related_pc
上記ページでうまくいきました。

投稿2020/06/01 14:36

moriman

総合スコア615

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問