Stworzyłem gridlistę z ToggleButtons, ale kiedy próbuję przełączać przyciski między sobą, nic się nie dzieje. Jakieś pomysły? Mam listę wydał i zadzwoniłem do tego w Setstate. Układ jest dobry, ale jak najszybciej korzystam z Gridview, wydaje się, że zmienia setstate.

class Backgrounds extends StatefulWidget {

  @override
  _BackgroundsState createState() => _BackgroundsState();
}

class _BackgroundsState extends State<Backgrounds> {

  List<bool> isSelected;

  void initState() {
    isSelected = [true, false, false, false, false, false, false, false, false];
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    var counter = 0;
    return GridView.count(
        padding: EdgeInsets.all(12),
        crossAxisCount: 3,
        mainAxisSpacing: 0,
        crossAxisSpacing: 0,
        children: [
          Image.asset('images/image1.png'),
          Image.asset('images/image2.png'),
          Image.asset('images/image3.png'),
          Image.asset('images/image4.png'),
          Image.asset('images/image5.png'),
          Image.asset('images/image5.png'),
          Image.asset('images/image6.png'),
          Image.asset('images/image7.png'),
          Image.asset('images/image8.png')
          ].asMap().entries.map((widget) {
          final index = ++counter - 1;
          return ToggleButtons(
    onPressed: (int index) {
      print('selected');
    setState(() {
      // isSelected[index] = !isSelected[index];
    for (int i = 1; i < isSelected.length; i++) {
    isSelected[i] = i == index;
    }
    });
    },
     isSelected: [isSelected[index]],
            // isSelected: (isSelected),
    selectedBorderColor: Color(0xff2244C7),
            borderColor: Colors.transparent,
    borderWidth: 3,
    borderRadius: BorderRadius.all(Radius.circular(8),
    ),
    children: [widget.value],
    );
    }).toList());
}
}
0
Ned Bayne-Powell 16 październik 2020, 18:25

1 odpowiedź

Najlepsza odpowiedź

Problem polega na funkcji "onpressed ()" przycisków przełączających. Ponieważ lista do widoku siatki jest generowana przez mapę, za każdym razem, gdy dzieci przycisków przełączników Rozmiar listy dzieci jako 1, argument indeksu w "łączonym ()" zawsze daje wartość 0. Polecam użycie "widget.key" W mapie, który dałby poprawny indeks widżetu dziecka. Stąd kod widoku siatki powinien być

return GridView.count(
    padding: EdgeInsets.all(12),
    crossAxisCount: 3,
    mainAxisSpacing: 0,
    crossAxisSpacing: 0,
    children: [
      Image.asset('images/image1.png'),
      Image.asset('images/image2.png'),
      Image.asset('images/image3.png'),
      Image.asset('images/image4.png'),
      Image.asset('images/image5.png'),
      Image.asset('images/image5.png'),
      Image.asset('images/image6.png'),
      Image.asset('images/image7.png'),
      Image.asset('images/image8.png')
      ].asMap().entries.map((widget) {
      final index = ++counter - 1;
      return ToggleButtons(
onPressed: (_) {
  print('selected');
setState(() {
for (int i = 0; i < isSelected.length; i++) {
// isSelected[index] = !isSelected[index];
isSelected[i] = i == widget.key;
}
});
},
 isSelected: [isSelected[widget.key]],
        // isSelected: (isSelected),
selectedBorderColor: Color(0xff2244C7),
        borderColor: Colors.transparent,
borderWidth: 3,
borderRadius: BorderRadius.all(Radius.circular(8),
),
children: [widget.value],
);
}).toList());
1
Anudit Kala 16 październik 2020, 17:40