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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

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

Q&A

解決済

1回答

222閲覧

composeで更新ボタンなど、同じ値を送信、受付したい

tamago83

総合スコア60

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

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

0グッド

0クリップ

投稿2023/11/20 00:07

編集2023/11/20 00:33

実現したいこと

  • composable上のイベントを発火させたい
  • composeで同じ値を送信して発火させていたい

composeで、同じ値を送信したい
例えば、webviewのbackボタンを押して戻った後に、もう一度同じbackボタンを押した場合に、同じbackのeventが流れた場合に2回目も動作させたいという内容になります。

前提

androidアプリを作成しており、UIをcomposeで作成しております。
xmlとcomposeの過渡期であることもあり、fragment本体はxmlで作成しており、fragmentから、menu、webviewはcomposeを呼び出しております。
menuにある、更新、進む、戻るのボタンを選択して、webviewに反映したいと考えております。

該当のソースコード

メニューにて、「WebViewModel.setWebViewEvent(WebViewModel.WebViewEventType.BACK)」

kotlin

1class WebViewModel() : ViewModel() { 2 enum class WebViewEventType { 3 NONE, BACK, FORWARD, REFRESH 4 } 5 private val _webViewEvent = MutableSharedFlow<WebViewEventType>() 6 val webViewEvent = _webViewEvent .asStateFlow() 7 fun setWebViewEvent(event: WebViewEventType){ 8 viewModelScope.launch { 9 _webViewEvent.emit(event) 10 } 11 } 12}

kotlin

1@Composable 2fun DetailArticleCompose(webViewModel: WebViewModel) { 3 Qlog.d("url=$currentUrl") 4 val webViewNavigator = rememberWebViewNavigator() 5 val webViewEvent = detailWebViewModel.webViewEvent.collectAsState(webViewModel.WebViewEventType.NONE) 6 7 WebView( 8 state = rememberWebViewState(url = "https://www.google.co.jp"), 9 navigator = webViewNavigator, 10 captureBackPresses = false, 11 }), 12 ) 13 14 if(DetailWebViewModel.WebViewEventType.NONE != webViewEvent.value){ 15 when(webViewEvent.value){ 16 DetailWebViewModel.WebViewEventType.BACK -> webViewNavigator.navigateBack() 17 DetailWebViewModel.WebViewEventType.FORWARD -> webViewNavigator.navigateForward() 18 DetailWebViewModel.WebViewEventType.REFRESH -> webViewNavigator.reload() 19 else -> {} 20 } 21 }

試したこと

もともとは、MutableStateFlowとしてましたが2回目以降うまくいかず、MutableSharedFlowに変えるなどしましたが状況は変わず、最初の1回しか動作しませんでした。

補足情報(FW/ツールのバージョンなど)

anroid 12
implementation platform('androidx.compose:compose-bom:2023.09.00')
compileSdk 34
kotlin 1.8.10
android studio 2022.3.1 patch 4

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

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

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

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

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

guest

回答1

0

自己解決

hoshi-takanori様
お手数おかけしありがとうございます。しっかりとデベロッパーページ読めばよかったのですね。
無事解決しました。
emit後に、updateを実施でよかったのですね。

  • update

composeに更新処理なしで、値を変えることができるという流れがわかりました。

  1. viewmodelで、emit(event: back)送信
  2. composeで処理終了後に、update(event: none)実施
  3. viewmodelで、emit(event: back)送信

投稿2023/11/20 03:31

tamago83

総合スコア60

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問