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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

590閲覧

【Kotlin】関数の呼び出し先で変数の値が空になってしまう

chimo

総合スコア55

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/10/06 15:33

編集2020/10/06 15:36

【MainActivity.kt】のshare()の部分でuploadFileメソッドの第一引数にfileNameという引数を渡しました。

class ~~~ var fileName = "" private fun share() { viewModel.uploadFile(fileName, repository = StorageRepository()) }

fileNameは別のActivityで以下のように作成してます

private fun makeSaveFile(): String { val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.JAPAN).format(Date()) val folder = this.activity?.getExternalFilesDir(null) val fileName = "sharephoto" + timeStamp val file = File(folder, fileName) return file.absolutePath }

uploadFileメソッドは【ViewModel.kt】で以下のように定義しています

class ViewModel : ViewModel() { fun uploadFile(fileName: String, repository: StorageRepository = StorageRepository()) { viewModelScope.launch { try { val firebasePath = "userId/url/voice.mp4" val stream = FileInputStream(File(fileName)) val result = async { repository.upload(stream, firebasePath) }.await() if (result.isSuccessful) { print("isSuccess is true") } else { print("isSuccess is false") } } catch (e: Exception) { } } } }

デバッガでfileNameの値を追ってみると、【MainActivity.kt】ではfileNameの値として作成したファイルの名前がはいっているのですが、uploadFile()の呼び出し先の【ViewModel.kt】に入るとfileNameの値が空になってしまいます。Logcatを見ると

java.lang.IllegalArgumentException: Cannot upload to getRoot

とあり、「IllegalArgumentException」について調べると、引数が不正な時に出ると書いてありました。おそらく、【ViewModel.kt】のuploadFile()で引数としてfileNameを置いた時の型が間違っているのかなと考えているのですが、StringのfileNameをStringで受取っているので、間違っているとも思えません。一体何がダメなのでしょうか。心が折れそうです。

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

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

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

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

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

dodox86

2020/10/08 10:39

y_waiwaiさんの回答欄へのコメントからの続きです: よくよく質問文を読んでみますと、コルーチンは実は関係ない気がしてきました。 https://developer.android.com/kotlin/coroutines?hl=ja を読むと、コルーチン内でメソッドの引数を使っても特に問題ないようにみえます。 > fileNameは別のActivityで以下のように作成してます MainActivityではない別のActivityで作成している、と言うのが気になります。本当にshare()でのuploadFile呼び出し時に、正しいfileNameが渡っているでしょうか。 private fun share() { // (1) ここでfileNameを確認 viewModel.uploadFile(fileName, repository = StorageRepository()) } で、ViewModel.kt でも class ViewModel : ViewModel() { fun uploadFile(fileName: String, repository: StorageRepository = StorageRepository()) { // (2) ここでfileNameを確認 viewModelScope.launch { // (3) ここでもfileNameを確認 try { val firebasePath = "userId/url/voice.mp4" などと、少なくとも上記3か所で再度確認してみてください。 あと、ViewModelを継承しているサブクラスがまたViewModelと言う同じ名前なのはちょっと気になります。(本件とは関係ないでしょうけれど)
chimo

2020/10/10 02:06

確認してみた結果ちゃんとfileNameが渡っておりました^-^;; 確認するタイミングが悪かったようです、ありがとうございました!
dodox86

2020/10/10 02:09

解決した、ということでしょうか。そうであれば説明と共に自己回答、自己解決で質問を閉じましょう。
guest

回答1

0

ベストアンサー

関数の中で定義した変数はローカル変数となって関数の中専用になります。
makeSaveFileにあるfileNameと、その外にあるfileNameは別物です

投稿2020/10/06 16:44

y_waiwai

総合スコア87800

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

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

dodox86

2020/10/06 17:15 編集

> makeSaveFileにあるfileNameと、その外にあるfileNameは別物です いえ、たぶんそういうことではなく、MainActivity.kt内で宣言しているクラスのfileNameフィールドをそのクラスのshareメソッドを経由し、viewModel.uploadFileメソッドの引数で渡しているんだけれども、そのViewModel.kt内では渡されたはずのfileName(引数の名前は同じ)の値が空になってしまう原因が分からない、と言うことだと思います。質問の記述内容を読むと一見、渡されていそうなかんじはしますが、viewModelScope.launch でコルーチンを使っているせいとか、でしょうかね。(※未検証な単なる推測です)
chimo

2020/10/07 00:29

dodox86さんのおっしゃる通りです。コルーチンを使うのが初めてなのでその辺で間違いが起こってしまってるのでしょうか...。とはいえもう本当に原因が何なのか分からなくて参ってしまってるのですが...。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問