Panel de expansión de Flutter utilizando el constructor de ListView
Un principiante en un campo, tengo este código que funciona, pero hay un error en el caso de hacer clic. Cuando hago clic en cualquier tarjeta, todas las tarjetas también se abren. Quiero abrir solo la tarjeta en la que acabo de hacer clic
import 'dart:io';
import 'package:english_club/data/im.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class Novals extends StatefulWidget {
@override
_NovalsState createState()
{
return _NovalsState();
}
}
class _NovalsState extends State<novals> {
bool _expanded = false;
var _test = "Pantalla completa";
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
body: ListView.builder(
itemCount: storys.length,
itemBuilder: (context, index){
return SingleChildScrollView(
child: Column(
children: [
Center(
child: Container(
margin: EdgeInsets.all(10),
color: Colors.green,
child: ExpansionPanelList(
animationDuration: Duration(milliseconds: 2000),
children: [
ExpansionPanel(
headerBuilder: (context, isExpanded) {
return ListTile(
title: Text(storys[index]["name"], style: TextStyle(color: Colors.black),),
);
},
body:ListTile(
title: Text(storys[index]["lines"],style: TextStyle(color: Colors.black)),
),
isExpanded: _expanded,
canTapOnHeader: true,
),
],
dividerColor: Colors.grey,
expansionCallback: (panelIndex, isExpanded) {
_expanded = !_expanded;
setState(() {
});
},
),
),
),
]
),
);
}
),
);
}
}
Intenté solucionarlo, pero no pude lograr que el código muestre el nombre de la historia y que cuando el usuario haga clic en él, aparezca toda la historia.
davy.ai
Para resolver el problema de que todas las tarjetas se abran al hacer clic en cualquier tarjeta, es necesario utilizar el parámetro
index
enisExpanded
yexpansionCallback
delExpansionPanel
.Lo que está ocurriendo actualmente es que la variable
_expanded
se está utilizando para todos los objetos ExpansionPanel, lo que hace que todos se expandan al tocar uno.En su lugar, debes crear una lista de valores booleanos, con un valor para cada elemento de la lista
storys
. Cada valor booleano representará si el ExpansionPanel correspondiente debe expandirse o no.Luego, actualiza el código de
isExpanded
yexpansionCallback
para usar el valor apropiado de esta lista para cada ExpansionPanel.Aquí tienes una versión actualizada del código con estos cambios:
En este código actualizado, creamos la lista
_expandedList
con un valor booleano para cada elemento de la listastorys
y inicializamos todos los valores enfalse
en el métodoinitState
.Luego, en el código de
isExpanded
yexpansionCallback
, utilizamos el valor apropiado de_expandedList
para el ExpansionPanel actual utilizando el parámetroindex
.Esto debería hacer que cada ExpansionPanel se expanda o contraiga de forma independiente entre ellos.