【发布时间】:2019-02-17 15:50:09
【问题描述】:
问题是关于Flutter 框架。
我使用 ListView.builder 函数构建了一个 ExpansionTiles 列表。当打开一个 ExpansionTile 然后删除它时,其他 ExpansionTile 在列表中按预期向上移动。但是,现在展开了替换已删除 ExpansionTile 的 ExpansionTile。这是一个animation 显示该问题。现在的问题是,如何让替换的 ExpansionTile 保持之前的状态。
这里是问题的源代码。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ItemList(),
);
}
}
class ItemList extends StatefulWidget {
ItemList({Key key}) : super(key: key);
@override
_ItemListState createState() => _ItemListState();
}
class _ItemListState extends State<ItemList> {
List<String> items;
List<int> ids;
List<Widget> widgetItem;
@override
void initState() {
super.initState();
items = ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5'];
ids = [1, 2, 3, 4, 5];
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: items.length,
itemBuilder: (BuildContext context, int index) {
return ExpansionTile(
title: Text('Title'),
children: <Widget>[
Row(
children: <Widget>[
Text(items[index]),
IconButton(
icon: Icon(Icons.delete),
onPressed: () => setState(() => items.removeAt(index)),
),
],
),
],
);
},
),
);
}
}
【问题讨论】:
-
您也可以使用
items中的值作为ValueKey的值,如果它们是唯一的,那么您不需要从items中删除和ids。在你的例子中,我不是 100% 的ids。 -
直接将项目用作键的好主意,既然您这么说,ID 对于示例来说真的是多余的。