flutter 文本字段恢复最后一个值

问题描述 投票:0回答:1

我的颤振文本字段出现错误,假设我有一个模型列表,每个模型都负责在屏幕上显示文本字段,

List<MyModel>

因此,在使用此列表显示文本字段并在每个文本字段中添加一些文本之后,我们可以说 1,2,3,4

当我尝试删除索引 1 处的模型并表示 ui 中保存值 2 的文本字段时,

它已从列表中正确删除,但在 ui 上,所有文本字段都会更新其状态,以便显示值将为 1,2,3,而不是预期的 1,3,4,

我认为渲染树中的问题,它保持其顺序并仅删除树中的最后一项,

我尝试为每个文本字段提供一个键,在这种情况下它工作正常,但该项目的状态将丢失 1,null,null

我的问题是如何使小部件树正确反映这些更改。

这是显示文本字段的图像

a list of textfields

这是所有三列的状态

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();
  }
}
flutter
1个回答
0
投票

我不知道您是否要删除编号为 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});
}

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.