Handle the list of dynamic checkboxes when the widget is added on button click in flutter

前端 未结 1 390
别跟我提以往
别跟我提以往 2020-12-11 09:50

When clicking the add button, the same widget is replicated. The widget contains the list of checkboxes that are multi selectable. I am able to replicate the widget but I go

相关标签:
1条回答
  • 2020-12-11 10:06

    This issue is because you control all replica by counting and widget.responseMarket. If you want all replicas work individually, you need to Replica it actually.

    I suggest to create a new StatefulWidget to replace _buildSingleCheckBox() & _buildCheckBoxes() function. I also put showHidee inside it.

    class CheckBoxesWidget extends StatefulWidget {
      final responseMarket;
    
      CheckBoxesWidget({this.responseMarket, Key key}) : super(key: key);
    
      @override
      _CheckBoxesWidgetState createState() => _CheckBoxesWidgetState();
    }
    
    class _CheckBoxesWidgetState extends State<CheckBoxesWidget> {
      bool showHidee;
    
      @override
      void initState() {
        showHidee = true;
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Container(
          width: MediaQuery.of(context).size.width,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              InkWell(
                onTap: () {
                  showHide();
                },
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: <Widget>[
                    Text(
                      'productionmareketway',
                      style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
                    ),
                    showHidee
                        ? Icon(Icons.keyboard_arrow_up)
                        : Icon(Icons.keyboard_arrow_down)
                  ],
                ),
              ),
              SizedBox(
                width: 20,
              ),
              if (showHidee)
                Column(
                  children: widget.responseMarket
                      .map(
                        (e) => CheckboxListTile(
                          title: Text(e.name),
                          value: e.isChecked,
                          activeColor: Theme.of(context).primaryColor,
                          checkColor: Colors.white,
                          onChanged: (bool value) {
                            setState(() {
                              e.isChecked = value;
                            });
                          },
                        ),
                      )
                      .toList(),
                ),
            ],
          ),
        );
      }
    
      void showHide() {
        setState(() {
          showHidee = !showHidee;
        });
      }
    }
    

    Second, beyond control the replica by counting, you should use a List to store all replica of responseMarket in the original class.

    List<List<Market>> responseMarkets;
    
    @override
    void initState() {
      responseMarkets = [widget.responseMarket];
      super.initState();
    }
    
    ...
    @override
    Widget build(BuildContext context) {
      return ListView.builder(
          itemCount: responseMarkets.length,
          itemBuilder: (_, index) {
            return _buildLayout(context, index);
          });
    }
    
    ...
    Widget _buildLayout(BuildContext context, int i) {
      ...
      // replace _buildCheckBoxes() with this line
      CheckBoxesWidget(responseMarket: responseMarkets[i],), 
      ...
    }
    

    Finally, you have to modify the addRow, deleteRow function. Each time create a new ResponseMarkets Object.

    addRow(int i) {
      setState(() {
        responseMarkets.add(responseMarkets[0]
            .map((e) => ResponseMarkets(
                  id: e.id,
                  name: e.name,
                  identifier: e.identifier,
                  isChecked: e.isChecked,
                ))
            .toList());
      });
    }
    
    deleteRow(int i) {
      setState(() {
        responseMarkets.removeAt(i);
      });
    }
    
    0 讨论(0)
提交回复
热议问题