在一个屏幕(StatelessWidget)中,我们显示一个单词列表.一 Word可以在第二个屏幕(A StatefulWidget)中通过 TextField.

two screens

我们通过返回修改后的单词 Navigator.pop,但标记为"无效"的任务只是 那.使用words.map创建了一个全新的列表,尽管它 isa闭包,缺少到words的索引,我们无法存储 把修改后的词补回来.

使用List.asMap()可以通过发送索引来解决这个问题,但是 List.asMap().forEach()将不会返回我们可以用于 Column人的子元素们.

与返回列表的Dart的List.asMap().forEach()最接近的是什么?

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
      home: WordsWidget(
        words: ["apples", "oranges"])));
}

class EditWordWidget extends StatefulWidget {
  String word;
  EditWordWidget({super.key, required this.word});

  @override
  State<EditWordWidget> createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<EditWordWidget> {
  late TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    _controller = TextEditingController(text: widget.word);
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Edit Word')),
      body: Column(
        children: [
          Row(children: [Text('Word: '),
              Container(
                width: 100,
                child: TextField(
                  controller: _controller,
                  onSubmitted: (String value) {
                    widget.word = value;
                  },
              )),
          ]),
          ElevatedButton(
            onPressed: () {
              Navigator.pop(context, widget.word);
            },
            child: const Text('Done'),
          )
        ]
      ),
    );
  }
}

class WordsWidget extends StatelessWidget {
  List<String> words;

  WordsWidget({Key? key, required this.words}) : super(key: key) {}

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Words')),
      body: Center(
        child: Column(
          children: words.map((word) =>
            Row(
              children: [
                Text('${word}   '),
                ElevatedButton(
                  onPressed: () async {
                    final new_word = await Navigator.push(
                      context,
                      MaterialPageRoute(builder:
                        (context) => EditWordWidget(word: word)),
                    );
                    word = new_word; // ineffectual
                  },
                  child: const Text('Edit'),
                ),
              ],
            ),
          ).toList(),
        ),
      ),
    );
  }
}

推荐答案

我觉得你把事情复杂化了.如果你想要一个List的索引,只需迭代索引即可.

          children: [
            for (var i = 0; i < words.length; i += 1)
              Row(
                children: [
                  Text('${words[i]}   '),
                  ElevatedButton(
                    onPressed: () async {
                      // ...
                      words[i] = new_word;
                    },
                    child: const Text('Edit'),
                  ),
                ],
              ),
          ],

或者,package:collection提供mapIndexed扩展方法,允许您执行以下操作:

children: words.mapIndexed((i, word) => Row(...)).toList(),

请注意,尽管上述方法会使wordsList发生变化,但它们在Flutter 应用程序中不会有任何明显的效果,因为WordsWidgetStatelessWidget.为了正确地重建它的小部件树,您还应该将其更改为StatefulWidget,并将words[i] = new_word;Mutations 移动到setState回调中.

Flutter相关问答推荐

Flutter -如何从布局填充(对称水平)中排除小部件?

未处理异常:字符串类型不是值类型子类型的子类型'

如何使用底部导航栏修复此导航问题

来自FutureProvider的数据只打印两个不同的变量,它们对一个实例只有一次相同的值,为什么?

修复后期变量的抖动皮棉

Flutter 蜂巢不能正常工作,我正在使用蜂巢在设备上存储数据,但当我关闭并重新启动应用程序时,我失go 了一切

框中的Flutter 适配图像

为Android生成时出现Flutter 错误:给定资源值的<;COLOR&>无效

请求已在 flutter 中发送到 django 服务器,并且已返回响应,但条件仍然为 false

ListView 后台可见

如果不刷新页面,我看不到从 Firestore 中提取的数据

如何删除图像边框半径与其父容器边框半径之间的空白

Flutterfire Configure - 未处理的异常和没有 firebase 初始化

具有 BLOC 和存储库模式的 Flutter Workmanager

Android Studio - Electric Eel 2022.1.1 更新 destruct 了 dart 文件图标

为什么 Flutter riverpod 直接分配不起作用但方法可以

函数中的变量在 Dart 中应该有什么关键字?

运行Flutter 测试时出现 FirebaseAppPlatform.verifyExtends 错误

如何从用户 Flutter 导航抽屉中隐藏管理菜单

Flutter 在滚动期间保持某些元素固定?