ListView.Builder Wiedergabe / Pause Buttom Flattern

Aug 19 2020

Ich verwende einen ListView.builder, um eine Audioliste zu erstellen. Ich muss die Pause der Wiedergabetaste einzeln in ein Element ändern, wenn ich es auswähle. Ich habe einen Bool ausprobiert, aber wenn ich Wiedergabe oder Pause gebe, werden alle Elemente in der Liste geändert Sie helfen dabei?

Antworten

2 sleepingkit Aug 20 2020 at 00:44

Möglicherweise haben Sie eine Liste mit Booleschen Werten , um zu speichern, welche Schaltfläche ausgewählt ist. Übergeben Sie dann den Bool als Parameter an das Audio-Widget und verwenden Sie den Bool, um das Symbol zu ändern.

Übergeben Sie auch eine Rückruffunktion , um die Bool-Liste zu ändern, da Sie die Liste über das übergeordnete Widget ändern müssen, sodass eine Rückruffunktion erforderlich ist.

 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
    });
  }

Listenansicht:

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.
          ),
        ),
4 Reign Aug 20 2020 at 00:41
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;
          });
        });
  }
}

jack Aug 20 2020 at 02:26

Verwenden Sie nicht einen Bool für Ihr gesamtes Audio. Sie können Sammlungen verwenden, um einen Bool für alles in Ihrer AudioList zu definieren. Wenn Sie auf klicken, ändern Sie den Bool für das Audio.