Flutter 列表中的所有项目都将更新
我正在开发一个应用程序,android使用颤振。然而,在这个过程中,一些意想不到的事情发生了,我无法理解。我的模型中有两个类,如下所示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;
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(),
),
);
}
}