69031


flutterで複数チェックボックスでチェックがついてるものの値だけ加算したいのですが、どのようにすれば良いでしょうか。

valueに複数の型を組み込むことができればなんとかなりそうなのですが、、

現在のコードは以下です。

[code]

    class CheckBox extends StatefulWidget {
    
      final int index;
      final int money;
      CheckBox({this.index, this.money});
    
      @override
      _CheckBoxState createState() => _CheckBoxState();
    }
    
    class _CheckBoxState extends State<CheckBox> {
    
      final List<List<String>> topping = [
        ["大盛り","980"],
        ["たまご","180"],
      ];
      bool _flag = false;
      int _prace = 0;
    
      void _handleCheckbox(bool e) {
        setState(() {
          _flag = e;
          if (e == true){
          }else{
          }
        });
        print(_flag);
      }
    
      @override
      Widget build(BuildContext context) {
        return Card(
          child: CheckboxListTile(
            activeColor: Colors.orange,
            title: Text(topping[widget.index][0]),
            secondary: Text("+${topping[widget.index][1]}円"),
            controlAffinity: ListTileControlAffinity.leading,
            value: _flag,
            onChanged: _handleCheckbox,
          ),
        );
      }
    }
    
    
[/code]


CC BY-SA 4.0
2020-07-18T10:25:47.843
68701
2020-07-27T15:22:19.770
2020-07-18T11:25:57.623
3060
36055
question
ios android flutter
複数チェックボックスでチェックがついてるものの値だけ加算する


ちょっと元のコードの意図が分かりかねたので、改変をしました。

選択状態をStateで管理すると実現可能です。まず、StateではListViewとしてCheckboxを描画します。Checkboxはチェックの状態をState内でListとして管理し、Listが更新されたら合計値を計算します。

サンプルとして次のコードが考えられます。

[code]

    import 'package:flutter/material.dart';
    
    class CheckBoxList extends StatefulWidget {
      CheckBoxList();
    
      @override
      _CheckBoxListState createState() => _CheckBoxListState();
    }
    
    class _CheckBoxListState extends State<CheckBoxList> {
      final List<List<String>> topping = [
        ["大盛り", "980"],
        ["たまご", "180"],
      ];
      int _price = 0;
    
      // 選択された要素のインデックスを保管する
      final List<int> _selectedIndex = [];
    
      void _handleCheckbox(int index, bool e) {
        setState(() {
          // 選択が解除されたらリストから消す
          if (_selectedIndex.contains(index)) {
            _selectedIndex.remove(index);
          } else {
            // 選択されたらリストに追加する
            _selectedIndex.add(index);
          }
          if (_selectedIndex.isEmpty) {
            // 何も選択されていないときは合計値は0円
            _price = 0;
            return;
          }
          _price = _selectedIndex
              .map((i) => topping[i][1]) // topping から値段を抽出
              .map(int.parse) // 数値に変換
              .reduce((value, element) => value + element); // 合計値を計算
          print(_price);
        });
      }
    
      @override
      Widget build(BuildContext context) {
        // topping の内容を List で表示
        return ListView.builder(
          itemBuilder: (context, index) {
            return Card(
              child: CheckboxListTile(
                activeColor: Colors.orange,
                title: Text(topping[index][0]),
                secondary: Text("+${topping[index][1]}円"),
                controlAffinity: ListTileControlAffinity.leading,
                value: _selectedIndex.contains(index),
                onChanged: (e) {
                  // Card 内のチェックボックスが選択されたら実行
                  _handleCheckbox(index, e);
                },
              ),
            );
          },
          itemCount: topping.length,
        );
      }
    }
    
[/code]


CC BY-SA 4.0
2020-07-27T15:22:19.770
69031
2020-07-27T15:22:19.770
7949
68701
answer