【问题标题】:How to update specific value on button click in card widget inside listview.builder Flutter如何更新listview.builder Flutter内卡片小部件中按钮单击的特定值
【发布时间】:2021-10-07 06:58:15
【问题描述】:

我正在其中构建一个listview.builder,它返回5(动态非静态)card 小部件,其中包含两个buttons 和计数text 小部件。问题是每当我点击第一个card 小部件上的-+ 按钮时,它都会更新所有cards。如何防止这个问题,我只想在第一个 card 小部件上更新 count 文本。我知道它在listview.builder 里面,但有什么解决方案可以解决这个问题。

class MenuCartWidget extends StatefulWidget {
  const MenuCartWidget({Key? key}) : super(key: key);

  @override
  _MenuCartWidgetState createState() => _MenuCartWidgetState();
}

class _MenuCartWidgetState extends State<MenuCartWidget> {
  int count = 1;
  @override
  Widget build(BuildContext context) {
    var height = MediaQuery.of(context).size.height;
    var width = MediaQuery.of(context).size.width;
    return Scaffold(
      body: Container(
        child: Padding(
          padding: const EdgeInsets.only(top: 20.0, left: 10.0, right: 10.0),
          child: ListView.builder(
              shrinkWrap: true,
              scrollDirection: Axis.vertical,
              itemCount: 5, //dynamic eg: num.length;
              itemBuilder: (BuildContext context, int index) {
                return Card(
                  child: Column(
                    children: [
                      Text('test'),
                      Row(
                        children: [
                          TextButton(
                              onPressed: () {
                                setState(() {
                                  count--;
                                });
                              },
                              child: Text('-')),
                          Text(count.toString()),
                          TextButton(
                              onPressed: () {
                                setState(() {
                                  count++;
                                });
                              },
                              child: Text('+')),
                        ],
                      )
                    ],
                  ),
                );
              }),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart listview


    【解决方案1】:
        class MenuCartWidget extends StatefulWidget {
          const MenuCartWidget({Key? key}) : super(key: key);
        
          @override
          _MenuCartWidgetState createState() => _MenuCartWidgetState();
        }
        
        class _MenuCartWidgetState extends State<MenuCartWidget> {
          //int count = 1;
          //List items = [1,1,1,1,1];
            List items = [];
    
          @override 
          void initState() { 
             super.initState(); 
             for(int i=0;i<itemCount.length;i++){ 
                items.add(1); 
             } 
          }
          @override
          Widget build(BuildContext context) {
            var height = MediaQuery.of(context).size.height;
            var width = MediaQuery.of(context).size.width;
            return Scaffold(
              body: Container(
                child: Padding(
                  padding: const EdgeInsets.only(top: 20.0, left: 10.0, right: 10.0),
                  child: ListView.builder(
                      shrinkWrap: true,
                      scrollDirection: Axis.vertical,
                      itemCount: items.length,
                      itemBuilder: (BuildContext context, int index) {
                        return Card(
                          child: Column(
                            children: [
                              Text('test'),
                              Row(
                                children: [
                                  TextButton(
                                      onPressed: () {
                                       items[index]--;
                                        setState(() {
                                          //count--;
                                           items;
                                        });
                                      },
                                      child: Text('-')),
                                  Text(items[index].toString()),
                                  TextButton(
                                      onPressed: () {
                                       items[index]++;
                                        setState(() {
                                          //count++;
                                           items;
                                        });
                                      },
                                      child: Text('+')),
                                ],
                              )
                            ],
                          ),
                        );
                      }),
                ),
              ),
            );
          }
        }
    

    【讨论】:

    • 如果项目计数是动态的,那么如何解决这个问题?
    • 您可以使用 for 循环添加项目数组。列表项 = []; for(int i=0; i
    • 我必须在哪里循环?
    • @override void initState() { super.initState();列表项 = []; for(int i=0; i
    • listview.builder 中的 itemCount = 5 怎么样?您能否编辑您的代码,因为它显示错误
    【解决方案2】:

    也许我认为我们可以做到这一点。

    
    import 'package:flutter/material.dart';
    
    const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          theme: ThemeData.dark().copyWith(
            scaffoldBackgroundColor: darkBlue,
          ),
          debugShowCheckedModeBanner: false,
          home: const MenuCartWidget(),
        );
      }
    }
    
    class MyWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Text(
          'Hello, World!',
          style: Theme.of(context).textTheme.headline4,
        );
      }
    }
    
    class MenuCartWidget extends StatefulWidget {
      const MenuCartWidget({Key? key}) : super(key: key);
    
      @override
      _MenuCartWidgetState createState() => _MenuCartWidgetState();
    }
    
    class _MenuCartWidgetState extends State<MenuCartWidget> {
      int count = 1;
      int selectedIndex = -1;
      var listValues = [
        ["test1", 0],
        ["test2", 0],
        ["test3", 0],
        ["test4", 0],
        ["test5", 0]
      ];
    
      List<int> counterList = [];
    
      @override
      void initState() {
        for (int i = 0; i < listValues.length; i++) {
          counterList.add(listValues[i][1] as int);
        }
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: SingleChildScrollView(
              child: Padding(
            padding: const EdgeInsets.only(top: 20.0, left: 10.0, right: 10.0),
            child: ListView.builder(
                shrinkWrap: true,
                scrollDirection: Axis.vertical,
                itemCount: listValues.length,
                itemBuilder: (BuildContext context, int index) {
                  return SingleChildScrollView(
                    child: Card(
                      child: Column(
                        children: [
                          Text(listValues[index][0].toString()),
                          Row(
                            children: [
                              TextButton(
                                  onPressed: () {
                                    setState(() {
                                      counterList[index]--;
                                      listValues[index][1] = counterList[index];
                                    });
                                  },
                                  child: const Text('-')),
                              Text(listValues[index][1].toString()),
                              TextButton(
                                  onPressed: () {
                                    setState(() {
                                      counterList[index]++;
                                      listValues[index][1] = counterList[index];
                                    });
                                  },
                                  child: const Text('+')),
                            ],
                          )
                        ],
                      ),
                    ),
                  );
                }),
          )),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      • 2021-12-03
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      相关资源
      最近更新 更多