person t-kobayashi

just_audioパッケージを0.2.2から0.7.2にアップグレード

calendar_today 2021年06月02日 update 2021年06月02日
Facebook Twitter LINE はてなブックマーク Pocket

今回は、just_audioパッケージをバージョン0.2.2から0.7.2にアップグレードした際のことについて、記述します。

これもFlutter 2.0へのアップグレードに伴う変更の一部でしたが、このパッケージのアップグレードが一番てこずりました。

オーディオ再生を制御するパッケージとしてjust_audio 0.2.2では、オーディオの再生ステータスを以下のクラスとプロパティで判定していました。

  • AudioPlaybackStateクラス
  • FullAudioPlaybackStateクラス
  • playbackStateプロパティ
  • fullPlaybackStateStreamプロパティ

しかし、0.7.2にアップグレードすることで、上記のクラスとプロパティは認識されなくなります。調べてみると、just_audioの仕組みが結構変わっていたようで、ステートを扱うクラスとしてProcessingStateというクラスが使われるにようになっていました。

playbackStateプロパティはprocessingStateプロパティ、fullPlaybackStateStreamプロパティはprocessingStateStreamプロパティにそれぞれ名前が変わっているようでした。

また、0.2.2ではステートとしてnoneとかplayingとかconnectingを使っていたのですが、それらがなくなっており、使えるステートとそれぞれの意味が変わっているということがわかりました。新旧のステートは1対1の関係があるわけではないので、アプリ側のロジックを少し変更しつつ、新しいステートを使いながら、以前と同じ挙動になるように調整することで対応しました。

参考までに、新旧のコードを以下に記載します。

旧StreamBuilder

StreamBuilder<FullAudioPlaybackState>(
    stream: bgmPlayer.fullPlaybackStateStream,
    builder: (context, snapshot) {
        final fullState = snapshot.data;
        final state = fullState?.state;
        if (state != AudioPlaybackState.connecting &&
            state != AudioPlaybackState.none &&
            state != null) {
            if (gShouldPlayBGM) {
                if (!preference.bgmMuted) {
                    if (state == AudioPlaybackState.completed) {
                        bgmPlayer.setAsset(gCurrentBGMAsset).catchError((error) {
                            print(error);
                        });
                    }
                    bgmPlayer.play();
                    return Container();
                } else {
                    bgmPlayer.stop();
                    return Container();
                }
            } else {
                bgmPlayer.stop();
                return Container();
            }
        }
        return Container();
    },
);

新StreamBuilder

StreamBuilder<ProcessingState>(
    stream: bgmPlayer.processingStateStream,
    builder: (context, snapshot) {
        final fullState = snapshot.data;
        final state = fullState;
        if (state != ProcessingState.loading && state != null) {
            if (gShouldPlayBGM) {
                if (!preference.bgmMuted) {
                    if (state == ProcessingState.completed) {
                        bgmPlayer.setAsset(gCurrentBGMAsset).catchError((error) {
                            print(error);
                        });
                    }
                    bgmPlayer.play();
                    return Container();
                } else {
                    bgmPlayer.stop();
                    return Container();
                }
            } else {
                bgmPlayer.stop();
                return Container();
            }
        }
        return Container();
    },
);

旧_Handler

class _Handler extends WidgetsBindingObserver {
    @override
    void didChangeAppLifecycleState(AppLifecycleState state) {
        if (state == AppLifecycleState.resumed) {
            if (bgmPlayer.playbackState != AudioPlaybackState.none) {
                gShouldPlayBGM = true;
                bgmPlayer.play();
            }
        } else {
            gShouldPlayBGM = false;
            if (bgmPlayer.playbackState == AudioPlaybackState.playing) {
                bgmPlayer.pause();
            }
        }
    }
}

新_Handler

class _Handler extends WidgetsBindingObserver {
    @override
    void didChangeAppLifecycleState(AppLifecycleState state) {
        if (state == AppLifecycleState.resumed) {
            gShouldPlayBGM = true;
            bgmPlayer.play();
        } else {
            gShouldPlayBGM = false;
            if (bgmPlayer.processingState == ProcessingState.ready) {
                bgmPlayer.pause();
            }
        }
    }
}

軽く検証しただけなので、バグが潜んでいる可能性があります。バグが見つかったら、記事を修正・更新します。

参考サイト:

https://pub.dev/packages/just_audio

https://stackoverflow.com/questions/65772254/upgrading-just-audio-package-in-flutter

関連記事

Flutterの記事一覧を見る

Flutterの質問

soichiro1210 が1年前に投稿

質問日時 2023年07月31日

a-sato が3年前に投稿

質問日時 2021年07月01日

a-sato が3年前に投稿

質問日時 2021年06月30日

takumi が3年前に投稿

質問日時 2021年05月20日

a-sato が3年前に投稿

質問日時 2021年05月14日

Flutterの質問一覧を見る
search