123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- // ignore_for_file: unnecessary_null_comparison
- import 'dart:async';
- import 'package:flutter/material.dart';
- import 'package:audioplayers/audioplayers.dart';
- /// Description: home page
- /// Time : 11/06/2023 Monday
- /// Author : liuyuqi.gov@msn.cn
- class HomePage extends StatefulWidget {
- HomePage({super.key});
- @override
- State<HomePage> createState() => _HomePageState();
- }
- class _HomePageState extends State<HomePage> {
- String url = "";
- late PlayerMode mode;
- late AudioPlayer _audioPlayer;
- late Duration _duration;
- late Duration _position;
- late StreamSubscription _durationSubscription;
- late StreamSubscription _positionSubscription;
- late StreamSubscription _playerCompleteSubscription;
- late StreamSubscription _playerErrorSubscription;
- late StreamSubscription _playerStateSubscription;
- get _durationText => _duration.toString().split('.').first;
- get _positionText => _position.toString().split('.').first;
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(
- title: const Text('Netease Music'),
- ),
- body: Column(
- children: [
- Text(
- _position != null
- ? '${_positionText ?? ''} / ${_durationText ?? ''}'
- : _duration != null
- ? _durationText
- : '',
- ),
- Padding(
- padding: const EdgeInsets.all(12.0),
- child: Stack(
- children: [
- Slider(
- onChanged: (v) {
- final Position = v * _duration.inMilliseconds;
- _audioPlayer.seek(Duration(milliseconds: Position.round()));
- },
- value: (_position.inMilliseconds > 0 &&
- _position.inMilliseconds < _duration.inMilliseconds)
- ? _position.inMilliseconds / _duration.inMilliseconds
- : 0.0,
- ),
- ],
- ),
- ),
- Row(
- children: [
- IconButton(
- icon: const Icon(Icons.play_arrow),
- onPressed: () {
- _play();
- }),
- IconButton(
- icon: const Icon(Icons.pause),
- onPressed: () {
- _pause();
- }),
- IconButton(
- icon: const Icon(Icons.stop),
- onPressed: () {
- _stop();
- }),
- ],
- )
- ],
- ),
- );
- }
- @override
- void initState() {
- super.initState();
- url = 'http://music.163.com/song/media/outer/url?id=476592630.mp3';
- _initAudioPlayer();
- }
- @override
- void dispose() {
- super.dispose();
- _audioPlayer.dispose();
- _durationSubscription.cancel();
- _positionSubscription.cancel();
- _playerCompleteSubscription.cancel();
- _playerErrorSubscription.cancel();
- _playerStateSubscription.cancel();
- }
- _initAudioPlayer() {
- mode = PlayerMode.mediaPlayer;
- //初始化
- _audioPlayer = AudioPlayer(mode: mode);
- _durationSubscription = _audioPlayer.onDurationChanged.listen((duration) {
- setState(() => _duration = duration);
- if (Theme.of(context).platform == TargetPlatform.iOS) {
- _audioPlayer.startHeadlessService();
- _audioPlayer.setNotification(
- title: 'App Name',
- artist: 'Artist or blank',
- albumTitle: 'Name or blank',
- imageUrl: 'url or blank',
- forwardSkipInterval: const Duration(seconds: 30), // default is 30s
- backwardSkipInterval: const Duration(seconds: 30), // default is 30s
- duration: duration,
- elapsedTime: const Duration(seconds: 0));
- }
- });
- //监听进度
- _positionSubscription =
- _audioPlayer.onAudioPositionChanged.listen((p) => setState(() {
- _position = p;
- }));
- //播放完成
- _playerCompleteSubscription =
- _audioPlayer.onPlayerCompletion.listen((event) {
- // _onComplete();
- setState(() {
- _position = const Duration();
- });
- });
- //监听报错
- _playerErrorSubscription = _audioPlayer.onPlayerError.listen((msg) {
- print('audioPlayer error : $msg');
- setState(() {
- // _playerState = PlayerState.stopped;
- _duration = const Duration(seconds: 0);
- _position = const Duration(seconds: 0);
- });
- });
- //播放状态改变
- _audioPlayer.onPlayerStateChanged.listen((state) {
- if (!mounted) return;
- setState(() {});
- });
- ///// iOS中来自通知区域的玩家状态变化流。
- _audioPlayer.onDurationChanged.listen((state) {
- if (!mounted) return;
- });
- // _playingRouteState = PlayingRouteState.speakers;
- }
- //开始播放
- void _play() async {
- final playPosition = (_position.inMilliseconds > 0 &&
- _position.inMilliseconds < _duration.inMilliseconds)
- ? _position
- : null;
- await _audioPlayer.play(UrlSource(url), position: playPosition);
- _audioPlayer.setPlaybackRate(1.0);
- }
- //暂停
- void _pause() async {
- await _audioPlayer.pause();
- }
- //停止播放
- _stop() async {
- await _audioPlayer.stop();
- }
- }
|