代码之家  ›  专栏  ›  技术社区  ›  esbenr

为什么我不能在Dart中向简单数组添加一个简单对象?

  •  0
  • esbenr  · 技术社区  · 12 月前

    我正在努力学习飞镖和长笛,并且正在努力学习一些简单的东西,比如向数组中添加一个对象。

    class Counter {
      String label;
      var counts = [];
    
      Counter({required this.label, this.counts = const []});
    }
    
    class Count {
      double latitude;
      double longitude;
      DateTime date;
    
      Count({required this.latitude, required this.longitude, required this.date});
    }
    
    class CounterCard extends StatelessWidget {
      final Counter counter;
    
      const CounterCard({super.key, required this.counter});
    
      @override
      Widget build(BuildContext context) {
        return Row(
          children: [
            Text('${counter.label}'),
            Text('${counter.counts.length}'),
            IconButton.filled(onPressed: onPressed, icon: Icon(Icons.add_circle))
          ],
        );
      }
    
      onPressed() {
        print('Add count');
        counter.counts.add(Count(
          latitude: 0.0,
          longitude: 0.0,
          date: DateTime.now()
        ));
      }
    }
    

    按下按钮可打印“添加计数”,但UI未按计数器更新。计数长度应增加。

    我相信这只是我不了解的状态,所以请帮我了解一下。

    1 回复  |  直到 12 月前
        1
  •  2
  •   Bhavesh Audichya    12 月前

    更新列表后使用setState((){})方法以最简单的方式更新ui。但是,如果您想持续更新,请使用ChangeNotifier或Providers。

    附加

    正如我所看到的,您正在使用一个无状态类setState在您的类中是不可访问的。我已经更新了您的总体代码。

    我已经更改了您的计数器类,因为计数变量是常量,常量赋值是不可更新的。

    class Counter {
      String label;
      List<Count>? counts;
    
      Counter({required this.label, List<Count>? counts}) : counts = counts ?? [];
    }
    
    class Count {
      double latitude;
      double longitude;
      DateTime date;
    
      Count({required this.latitude, required this.longitude, required this.date});
    }
    
    class CounterCard extends StatefulWidget {
      final Counter counter;
    
      const CounterCard({super.key, required this.counter});
    
      @override
      State<CounterCard> createState() => _CounterCardState();
    }
    
    class _CounterCardState extends State<CounterCard> {
      @override
      Widget build(BuildContext context) {
        return Row(
          children: [
            Text('${widget.counter.label}'),
            Text('${widget.counter.counts?.length ?? "0"}'),
            IconButton.filled(onPressed: onPressed, icon: Icon(Icons.add_circle))
          ],
        );
      }
    
      onPressed() {
        print('Add count');
        setState(() {
          widget.counter.counts
              ?.add(Count(latitude: 0.0, longitude: 0.0, date: DateTime.now()));
        });
      }
    }