flutter hide elements dynamically List view

Viewed 422

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);
  }
}
0 Answers
Related