我的颤振文本字段出现错误,假设我有一个模型列表,每个模型都负责在屏幕上显示文本字段,
List<MyModel>
因此,在使用此列表显示文本字段并在每个文本字段中添加一些文本之后,我们可以说 1,2,3,4
当我尝试删除索引 1 处的模型并表示 ui 中保存值 2 的文本字段时,
它已从列表中正确删除,但在 ui 上,所有文本字段都会更新其状态,以便显示值将为 1,2,3,而不是预期的 1,3,4,
我认为渲染树中的问题,它保持其顺序并仅删除树中的最后一项,
我尝试为每个文本字段提供一个键,在这种情况下它工作正常,但该项目的状态将丢失 1,null,null
我的问题是如何使小部件树正确反映这些更改。
这是显示文本字段的图像
这是所有三列的状态
class SsrTableState extends ChangeNotifier {
var cells = <TableRow>[];
removeAt(dynamic cardKey) {
print(cells.map((e) => e.key).toList());
print(cardKey);
cells = cells.where((t) => t.key != cardKey).toList();
print(cells.map((e) => e.key).toList());
notifyListeners();
}
}
我不知道您是否要删除编号为 2 的模型项(例如),还是要删除索引为 2 的模型(例如),但我同时执行了这两个操作并使用了其中一个你需要:
要从列表中删除项目,您必须使用:
listName.removeAt(index)
从列表中指定索引处删除项目
或
listName.removeWhere((item) => condition)
这是使用它们的代码(因为您没有提供代码,所以我从头开始编写了自己的代码,您可以根据需要编辑您的代码):
import 'package:flutter/material.dart';
import 'package:file_picker/file_picker.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
// Define a list of MyModel
List<MyModel> models = List.generate(
4,
(index) => MyModel(number: index, title: 'Title $index'),
);
final TextEditingController _controller = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Model List'),
),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: _controller,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
labelText: 'Enter number to remove',
border: OutlineInputBorder(),
),
),
),
ElevatedButton(
onPressed: () {
setState(() {
int? numberToRemove = int.parse(_controller.text);
//to remove the item on the index of numberToRemove:
models.removeAt(numberToRemove);
//to remove the model that have the number of numberToRemove:
models.removeWhere((model) => model.number == numberToRemove);
// /\ choose one of the above methods and delete the other one /\
_controller.clear();
});
},
child: const Text('Remove Item'),
),
Expanded(
child: ListView.builder(
itemCount: models.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
decoration: InputDecoration(
labelText: 'Model ${models[index].number}',
),
controller: TextEditingController(text: models[index].title),
),
);
},
),
),
],
),
);
}
}
// Model class with int and String
class MyModel {
final int number;
final String title;
MyModel({required this.number, required this.title});
}
希望有帮助。