ListView.Builder play / Pause buttom trzepotanie
Używam ListView.builder do tworzenia listy audio, muszę zmienić przycisk odtwarzania pauzować indywidualnie na element, gdy go wybieram, próbowałem bool, ale danie odtwarzania lub pauzy zmienia wszystkie elementy na liście, ktoś może pomagasz w tym ??
Odpowiedzi
Możesz mieć listę wartości logicznych, aby zapisać wybrany przycisk, a następnie przekazać bool jako parametr do widżetu audio i użyć bool, aby zmienić ikonę.
Również zdać oddzwonienia funkcję do zmiany listy bool, bo trzeba zmienić listę z widgetem dominującej, więc potrzebna jest funkcja zwrotna.
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;
});
});
}
}
Nie używaj jednej wartości bool dla całego dźwięku, możesz użyć kolekcji, aby zdefiniować wartość bool dla wszystkiego w swojej audioList, a po kliknięciu zmienić bool dla dźwięku.