# What's happen? #
This problem occurred when I was trying to make a button that makes sound while referring Github at youtube
video: https://youtu.be/otIRH2HIFoY Github:https://github.com/FlorianPruemer/flutter_tutorials/blob/master/audio_players/lib/audio_player_url.dart
The argument type 'String' can't be assigned to the parameter type 'Source'.
in that code url is lined by red underline(error)
playMusic() async {
await audioPlayer.play(url);
}
full code
import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/material.dart';
class AudioPlayerUrl extends StatefulWidget {
@override
_AudioPlayerUrlState createState() => _AudioPlayerUrlState();
}
class _AudioPlayerUrlState extends State<AudioPlayerUrl> {
AudioPlayer audioPlayer = AudioPlayer();
PlayerState audioPlayerState = PlayerState.paused;
String url = 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-13.mp3';
/// Optional
int timeProgress = 0;
int audioDuration = 0;
/// Optional
Widget slider() {
return Container(
width: 300.0,
child: Slider.adaptive(
value: timeProgress.toDouble(),
max: audioDuration.toDouble(),
onChanged: (value) {
seekToSec(value.toInt());
}),
);
}
@override
void initState() {
super.initState();
/// Compulsory
audioPlayer.onPlayerStateChanged.listen((PlayerState state) {
setState(() {
audioPlayerState = state;
});
});
/// Optional
audioPlayer.setSourceUrl(
url); // Triggers the onDurationChanged listener and sets the max duration string
audioPlayer.onDurationChanged.listen((Duration duration) {
setState(() {
audioDuration = duration.inSeconds;
});
});
audioPlayer.onPositionChanged.listen((Duration position) async {
setState(() {
timeProgress = position.inSeconds;
});
});
}
/// Compulsory
@override
void dispose() {
audioPlayer.release();
audioPlayer.dispose();
super.dispose();
}
/// Compulsory
playMusic() async {
await audioPlayer.play(url);
}
/// Compulsory
pauseMusic() async {
await audioPlayer.pause();
}
/// Optional
void seekToSec(int sec) {
Duration newPos = Duration(seconds: sec);
audioPlayer
.seek(newPos); // Jumps to the given position within the audio file
}
/// Optional
String getTimeString(int seconds) {
String minuteString =
'${(seconds / 60).floor() < 10 ? 0 : ''}${(seconds / 60).floor()}';
String secondString = '${seconds % 60 < 10 ? 0 : ''}${seconds % 60}';
return '$minuteString:$secondString'; // Returns a string with the format mm:ss
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
/// Compulsory
IconButton(
iconSize: 50,
onPressed: () {
audioPlayerState == PlayerState.playing
? pauseMusic()
: playMusic();
},
icon: Icon(audioPlayerState == PlayerState.playing
? Icons.pause_rounded
: Icons.play_arrow_rounded)),
/// Optional
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(getTimeString(timeProgress)),
SizedBox(width: 20),
Container(width: 200, child: slider()),
SizedBox(width: 20),
Text(getTimeString(audioDuration))
],
)
],
)),
);
}
}
CodePudding user response:
You need to provide audio source, to play URL audio
await audioPlayer.play(UrlSource(url));
You can find more about audioplayers
CodePudding user response:
try using it like below
because you are passing String
value but function require url
so Uri.parse
will help you to convert String
to url
.
await audioPlayer.play(Uri.parse(url));
CodePudding user response:
try this
playMusic() async {
await audioPlayer.play(Uri.parse(url));
}