Lecture de ListView.Builder / Pause du battement du bouton
J'utilise ListView.builder pour créer une liste audio, je dois changer la pause du bouton de lecture individuellement en un élément lorsque je le sélectionne, j'ai essayé un booléen mais donner lecture ou pause modifie tous les éléments de la liste, quelqu'un peut vous aidez avec ça ??
Réponses
Vous pouvez avoir une liste de booléens pour enregistrer le bouton sélectionné, puis passer le booléen comme paramètre au widget audio et utiliser le booléen pour changer l'icône.
Passez également une fonction de rappel pour changer la liste booléenne, car vous devez changer la liste à partir du widget parent, donc une fonction de rappel est nécessaire.
List<bool> audioSelectedList = List.generate(AudioList.length, (i) => false);
// This is a callback function that Audio will call when the button is clicked.
selected(int index){
// set only one bool to be true
setState(() {
audioSelectedList=List.generate(AudioList.length, (i) => false);// set all to false
audioSelectedList[index]=true; // set the selected index to be true
});
}
ListView:
ListView.builder(
itemCount: AudioList.length,
itemBuilder: (context, index) => Audio(
selected: selected, // pass the callback function
index: index, // use to call selected(index)
isSelected: audioSelectedList[index], // only one bool is true in the list which is the selected index.
),
),
import 'package:flutter/material.dart';
class Sample extends StatefulWidget {
@override
_SampleState createState() => _SampleState();
}
class _SampleState extends State<Sample> {
bool isPressed = false;
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: [
Column(
children: [
IconButton(
icon: Icon(isPressed
? Icons.play_circle_filled
: Icons.pause_circle_filled),
onPressed: () {
setState(() {
isPressed = !isPressed;
});
}),
IconButton(
icon: Icon(isPressed
? Icons.play_circle_filled
: Icons.pause_circle_filled),
onPressed: () {
setState(() {
isPressed = !isPressed;
});
}),
PlayPause(
isPressed: isPressed,
),
PlayPause(),
],
)
],
),
);
}
}
class PlayPause extends StatefulWidget {
const PlayPause({
Key key,
this.isPressed = false,
}) : super(key: key);
final bool isPressed;
@override
_PlayPauseState createState() => _PlayPauseState();
}
class _PlayPauseState extends State<PlayPause> {
bool _isPressed;
@override
void initState() {
super.initState();
_isPressed = widget.isPressed;
}
@override
Widget build(BuildContext context) {
return IconButton(
icon: Icon(
_isPressed ? Icons.play_circle_filled : Icons.pause_circle_filled),
onPressed: () {
setState(() {
_isPressed = !_isPressed;
});
});
}
}
N'utilisez pas un seul booléen pour tous vos fichiers audio, vous pouvez utiliser des collections pour définir un booléen pour tout ce qui se trouve dans votre audioList, et lorsque vous cliquez sur, modifiez le booléen de l'audio.