在一个屏幕(StatelessWidget
)中,我们显示一个单词列表.一
Word可以在第二个屏幕(A StatefulWidget
)中通过
TextField
.
我们通过返回修改后的单词
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(),
),
),
);
}
}