今回は、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