dart 错误:错误状态:使用just_audio和riverpod调用close后无法添加新事件

ijxebb2r  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(125)

我目前正在使用just_audio和flutter_riverpod包开发Flutter应用程序。在我的项目中,我遇到了一个问题,我得到一个错误消息说“错误:错误状态:调用源自just_audio包的close”后无法添加新事件。
当我点击报警声音按钮时出现此错误。
错误发生在以下函数中:

Future<void> playSound() async {
  if (!_isDisposed) {
    final selectedSound = ref.watch(selectedSoundProvider.notifier).state;
    await _audioPlayer.setAsset(selectedSound.path); // Error here
    _audioPlayer.play();
  }
}

字符串
我已经尝试调试该问题,但我很难理解问题的根源。我怀疑它可能与just_audio包中的流的生命周期有关。
下面是我的代码的相关部分:
timer_notifier.dart:

class TimerNotifier extends StateNotifier<int> {
  ...
  Future<void> playSound() async {
    if (!_isDisposed) {
      final selectedSound = ref.watch(selectedSoundProvider.notifier).state;
      await _audioPlayer.setAsset(selectedSound.path); // Error here
      _audioPlayer.play();
    }
  }
  
  @override
  void dispose() {
    print('dispose is being called');
    _mounted = false;
    _timer?.cancel();
    _isDisposed = true;
    _audioPlayer.dispose();
    super.dispose();
  }
  ...
}


settings_page.dart:

class SettingsPage extends ConsumerWidget {
  ...
  Widget build(BuildContext context, WidgetRef ref) {
    return Scaffold(
      ...
             ListTile(
  title: Text('Alarm Sound'),
  trailing: Row(
    mainAxisSize: MainAxisSize.min,
    children: ref.watch(soundListProvider).map((sound) {
      return Padding(
        padding: const EdgeInsets.all(2.0),
        child: ElevatedButton(
          onPressed: () async {
            ref.read(selectedSoundProvider.notifier).state = sound;
            await ref.read(timerNotifierProvider.notifier).playSound();
          },
          child: Text(sound.friendlyName),
        ),
      );
    }).toList(),
  ),
),
  ...
}


谁能帮助我理解这个问题,并指导我一步一步地在哪里进行必要的更改来解决这个问题?任何帮助将不胜感激。
谢谢你,谢谢

h5qlskok

h5qlskok1#

问题出在这部分代码中:

Future<void> playSound() async {
  if (!_isDisposed) { //     ⬇here⬇
    final selectedSound = ref.read(selectedSoundProvider.notifier).state;
    await _audioPlayer.setAsset(selectedSound.path); // Error here
    _audioPlayer.play();
  }
}

字符串
您应该在回调和生命周期方法(如initState())中使用ref.read

相关问题