Audio Service How to retrieve a variable with a StateFul widget

273 Views Asked by At

For my project I use the packages audioplayers for my audio sound and I need to use the sound in background and to control it with the notification and for that I use the package audio_service and now I have a problem.

First of all I want to precise I use this class to retrieve the song and others variables from an other page.

class MyPlayerController extends StatefulWidget {
  final Song songToPlay;
  final List<Song> playlist;
  final Color backgroundColor;


  const MyPlayerController({required this.songToPlay, required this.playlist, required this.backgroundColor});

  @override
  AudioPlayerHandler createState() => AudioPlayerHandler();
} 

Now I declare all of this to control my audio player :

class AudioPlayerHandler extends BaseAudioHandler with State<MyPlayerController>,Diagnosticable{
  late AudioHandler audioHandler;
  late AudioPlayer audioPlayer;
  late Song song;
  AudioCache? audioCache;
  double soundMax = 1;
  double soundPosition = 0.5;
  Duration position = const Duration(seconds: 0);
  Duration maxDuration = const Duration(seconds: 0);
  bool playShuffle = false;
  bool repeat = false;
  IconData iconData = Icons.play_circle;


  @override
  void initState() {
    super.initState();
  }

  @override
  void dispose() {
    clearPlayer();
    super.dispose();
  } 

  @override
  Future<void> play() async {
    playbackState.add(playbackState.value.copyWith(
      playing: true,
      controls: [MediaControl.pause],
    ));
    await setupPlayer();
  }

  @override
  Future<void> pause() async {
    playbackState.add(playbackState.value.copyWith(
      playing: false,
      controls: [MediaControl.play],
    ));
    await audioPlayer.pause();
  }

After that when i call the setupPlayer

setupPlayer() {

    song = widget.songToPlay;
    audioPlayer = AudioPlayer();
    audioPlayer.onPlayerStateChanged.listen(onStateChange);
    audioPlayer.onDurationChanged.listen(onDurationChange);
    audioPlayer.onAudioPositionChanged.listen(onAudioPositionChanged);
    final url = song.path;
    audioPlayer.play(url);
    //changeVolume(soundPosition);
  }

That made me this error


E/flutter (10633): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Null check operator used on a null value
E/flutter (10633): #0      State.widget (package:flutter/src/widgets/framework.dart:916:26)
E/flutter (10633): #1      AudioPlayerHandler.setupPlayer (package:easyislam/view/spotify/controllers/player_controller.dart:190:12)
E/flutter (10633): #2      AudioPlayerHandler.play (package:easyislam/view/spotify/controllers/player_controller.dart:233:11)
E/flutter (10633): #3      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:989:21)
E/flutter (10633): #4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:198:24)
E/flutter (10633): #5      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:608:11)
E/flutter (10633): #6      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:296:5)
E/flutter (10633): #7      BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:230:7)
E/flutter (10633): #8      PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:563:9)
E/flutter (10633): #9      PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:94:12)
E/flutter (10633): #10     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:139:9)
E/flutter (10633): #11     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:539:8)
E/flutter (10633): #12     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:137:18)
E/flutter (10633): #13     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:123:7)
E/flutter (10633): #14     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:439:19)
E/flutter (10633): #15     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:419:22)
E/flutter (10633): #16     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:322:11)
E/flutter (10633): #17     GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:374:7)
E/flutter (10633): #18     GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:338:5)
E/flutter (10633): #19     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:296:7)
E/flutter (10633): #20     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:279:7)
E/flutter (10633): #21     _rootRunUnary (dart:async/zone.dart:1442:13)
E/flutter (10633): #22     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
E/flutter (10633): #23     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
E/flutter (10633): #24     _invoke1 (dart:ui/hooks.dart:170:10)
E/flutter (10633): #25     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:331:7)
E/flutter (10633): #26     _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31)

I tried to retrieve the song with a setState :


    setState(() {
      song = widget.songToPlay;

    });
    audioPlayer = AudioPlayer();
    audioPlayer.onPlayerStateChanged.listen(onStateChange);
    audioPlayer.onDurationChanged.listen(onDurationChange);
    audioPlayer.onAudioPositionChanged.listen(onAudioPositionChanged);
    final url = song.path;
    audioPlayer.play(url);
    //changeVolume(soundPosition);
  }

And that made me this error :


E/flutter (10633): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: setState() called in constructor: AudioPlayerHandler#ee85b
E/flutter (10633): This happens when you call setState() on a State object for a widget that hasn't been inserted into the widget tree yet. It is not necessary to call setState() in the constructor, since the state is already assumed to be dirty when it is initially created.
E/flutter (10633): #0      State.setState.<anonymous closure> (package:flutter/src/widgets/framework.dart:1109:9)
E/flutter (10633): #1      State.setState (package:flutter/src/widgets/framework.dart:1120:6)
E/flutter (10633): #2      AudioPlayerHandler.setupPlayer (package:easyislam/view/spotify/controllers/player_controller.dart:190:5)
E/flutter (10633): #3      AudioPlayerHandler.play (package:easyislam/view/spotify/controllers/player_controller.dart:236:11)
E/flutter (10633): #4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:989:21)
E/flutter (10633): #5      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:198:24)
E/flutter (10633): #6      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:608:11)
E/flutter (10633): #7      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:296:5)
E/flutter (10633): #8      BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:230:7)
E/flutter (10633): #9      PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:563:9)
E/flutter (10633): #10     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:94:12)
E/flutter (10633): #11     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:139:9)
E/flutter (10633): #12     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:539:8)
E/flutter (10633): #13     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:137:18)
E/flutter (10633): #14     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:123:7)
E/flutter (10633): #15     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:439:19)
E/flutter (10633): #16     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:419:22)
E/flutter (10633): #17     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:322:11)
E/flutter (10633): #18     GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:374:7)
E/flutter (10633): #19     GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:338:5)
E/flutter (10633): #20     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:296:7)
E/flutter (10633): #21     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:279:7)
E/flutter (10633): #22     _rootRunUnary (dart:async/zone.dart:1442:13)
E/flutter (10633): #23     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
E/flutter (10633): #24     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
E/flutter (10633): #25     _invoke1 (dart:ui/hooks.dart:170:10)
E/flutter (10633): #26     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:331:7)
E/flutter (10633): #27     _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31)

I use this packages :

import 'package:audio_service/audio_service.dart';
import 'package:audioplayers/audioplayers.dart';

I want to know how I can retrieve this song without this error.

0

There are 0 best solutions below