Flutter 列表中的所有项目都将更新

Flutter 列表中的所有项目都将更新,flutter,dart,Flutter,Dart,我正在开发一个应用程序,android使用颤振。然而,在这个过程中,一些意想不到的事情发生了,我无法理解。我的模型中有两个类,如下所示 class Term { final String type; String value; Term({required this.type, required this.value}); } class CalcData { final List<Term> expression; final String result;

我正在开发一个应用程序,android使用颤振。然而,在这个过程中,一些意想不到的事情发生了,我无法理解。我的模型中有两个类,如下所示

class Term {
  final String type;
  String value;

  Term({required this.type, required this.value});
}

class CalcData {
  final List<Term> expression;
  final String result;

  const CalcData(this.expression, this.result);
}
service.dart

它应该如何表现?
每次点击数字按钮时,与现有值合并的值应出现在屏幕上。当点击确认按钮时,应将
\u resultFocused
设置为
true
,尽管视觉上不会发生任何变化。现在,如果在此之后点击数字按钮,则现有值(不进行任何更新)应添加到历史记录中,并且新值应显示在屏幕上

它的行为方式。

每次点击数字按钮时,与现有值合并的值就会出现在屏幕上,并且在确认时,
\u resultFocused
被设置为
true
。但是,当点击之后的数字按钮时,现有值将部分更新(
CalcData.expression
更新,而
CalcData.result
保持不变),并添加到
\u历史记录中
我将
\u terms.clear()
更改为
\u terms=[]
,现在它正在工作。尽管仍然想知道
\u terms.clear()有什么问题,但是具体地说,请在创建和添加新
CalcData
的地方共享代码。。正在等待答复。。
class Term {
  final String type;
  String value;

  Term({required this.type, required this.value});
}

class CalcData {
  final List<Term> expression;
  final String result;

  const CalcData(this.expression, this.result);
}
import 'package:flutter/foundation.dart';
import 'model.dart';

class ContentService extends ChangeNotifier {
  List<Term> _terms = [];
  String? _result;
  bool _resultFocused = false;
  List<CalcData> _history = [];

  List<Term> get terms => _terms;
  String? get result => _result;
  bool get resultFocused => _resultFocused;
  List<CalcData> get history => _history;

  void addTerm(Term term) => _terms.add(term);
  void updateTerm(Term term, String newValue) => term.value += newValue;
  void evaluteResult() => _result = _terms.map((term) => term.value).toList().join();

  void tapNumbers(String value) {
    if (_resultFocused && _terms.isNotEmpty && _result != null) {
      CalcData __data = CalcData(_terms, _result!);
      _history = [..._history, __data];

      _terms.clear();
      _result = null;

      _resultFocused = false;
    }

    if (_terms.isEmpty)
      this.addTerm(Term(type: 'Numeric', value: value));
    else
      this.updateTerm(_terms.last, value);

    this.evaluteResult();
    notifyListeners();
  }

  void confirm() {
    _resultFocused = true;
    notifyListeners();
  }
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'model.dart';
import 'service.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      home: Scaffold(
        body: ChangeNotifierProvider<ContentService>(
          create: (context) => ContentService(),
          child: Contents(),
        ),
      ),
    );
  }
}

class Contents extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    ContentService service = Provider.of<ContentService>(context, listen: false);

    return Padding(
      padding: const EdgeInsets.all(24.0),
      child: Column(
        children: <Widget>[
          Expanded(
            child: _HistoryScreen(),
          ),
          SizedBox(height: 24.0),
          _EditScreen(),
          SizedBox(height: 24.0),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: [
              ElevatedButton(onPressed: () => service.tapNumbers('1'), child: Text('1')),
              ElevatedButton(onPressed: () => service.tapNumbers('2'), child: Text('2')),
              ElevatedButton(onPressed: () => service.tapNumbers('3'), child: Text('3')),
              ElevatedButton(onPressed: () => service.tapNumbers('4'), child: Text('4')),
              ElevatedButton(onPressed: () => service.confirm(), child: Icon(Icons.done)),
            ],
          ),
        ],
      ),
    );
  }
}

class _HistoryScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Selector<ContentService, List<CalcData>>(
      selector: (context, service) => service.history,
      builder: (context, data, _) => ListView.separated(
        itemCount: data.length,
        itemBuilder: (context, index) => ListTile(
          title: Row(
            children: data[index].expression.map((exp) => Text(exp.value)).toList(),
          ),
          subtitle: Text(data[index].result),
        ),
        separatorBuilder: (_, __) => Divider(),
      ),
    );
  }
}

class _EditScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<ContentService>(
      builder: (context, service, _) => Wrap(
        children: service.terms.map((term) {
          return Text(
            term.value,
            style: TextStyle(fontSize: 16.0, color: Colors.blueAccent),
          );
        }).toList(),
      ),
    );
  }
}