I am building a chatbot with text and button responses. I want to hide the button container when one of the buttons is pressed.These buttons are dynamic. I am trying to use a boolean array to save the visibility of the list of the elements. Now, the buttons disappear whenever i press them, but they appear again when the next response is loaded.
class Body extends StatefulWidget {
final List<Map<String, dynamic>> messages;
final mycallback? hi;
final callback? showdate;
Body({
Key? key,
this.messages = const [],
this.hi,
this.showdate,
}) : super(key: key);
@override
State<Body> createState() => _BodyState();
}
class _BodyState extends State<Body> {
List<bool> demo = List<bool>.filled(50, true);
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
return ListView.separated(
itemBuilder: (context, i) {
var obj = widget.messages[widget.messages.length - 1 - i];
Message message = obj['message'];
bool isUserMessage = obj['isUserMessage'] ?? false;
List<dynamic> label = obj['label'];
bool show = obj['show'];
//if (show) show1();
return Column(
crossAxisAlignment:
isUserMessage ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: isUserMessage
? MainAxisAlignment.end
: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
_MessageContainer(
message: message,
isUserMessage: isUserMessage,
),
//if (label.length > 0) _ButtonContainer(label: label),
if (label.length > 0)
if (label[0] != "calendar")
!demo[i]
? SizedBox(
width: 2,
)
: Visibility(
child: Container(
constraints: BoxConstraints(maxWidth: 250),
padding: EdgeInsets.only(top: 10, left: 35),
child: ListView.builder(
itemCount: label.length,
shrinkWrap: true,
itemBuilder: (context, j) {
return ElevatedButton(
child: Text(label[j]),
onPressed: () => {
print(i),
setState(() {
hide(i + 1);//hiding here
print(i);
widget.hi!(label[j], true);//sending message
})
},
style: ButtonStyle(
shape: MaterialStateProperty.all<
RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18.0),
side: BorderSide(
color: Colors.black,
width: 2.0,
),
),
),
),
);
},
),
),
)
],
);
},
separatorBuilder: (_, i) => Container(height: 10),
itemCount: widget.messages.length,
reverse: true,
padding: const EdgeInsets.symmetric(
horizontal: 10,
vertical: 20,
),
);
}
void hide(i) {
print("I am inside hide");
print(demo[i]);
inspect(demo);
setState(() {
demo[i] = false;
if (demo[i]) {
debugPrint("true");
} else {
debugPrint("False");
}
});
inspect(demo);
}
}