问题描述
我有一个Scaffold
和一个ListView
,其中显示了ItemTile
类型的项目。该ItemTile
带有一个按钮,可以自我复制,将新复制的对象写入内存,然后该新项目应显示在ListView
中。下面的代码显示了如何实现列表以显示图块。
class _ItemListState extends State<ItemList> {
List<Item> items = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context).get('app_name')),actions: <Widget>[],),body: new FutureBuilder(
future: widget.itemManager.load(),builder: (context,AsyncSnapshot<List<Item>> snap) {
switch (snap.connectionState) {
case ConnectionState.waiting:
return Text(AppLocalizations.of(context).get('loading'));
case ConnectionState.done:
if (!snap.hasError && snap.hasData) {
this.items = snap.data;
return ListView.separated(
itemCount: items.length,padding: const EdgeInsets.all(16),itemBuilder: (context,index) {
return ItemTile(items[index]);
},} else {
return Text('Error: ${snap.error}');
}
return null; //Moet,anders klaagt Dart omdat die de if/else ni snapt
default:
return Text('nothing');
}
},);
}
此代码为ItemTile
class _ItemTileState extends State<ItemTile> {
final Item item;
final ItemManager itemManager = ItemManager();
_ItemTileState(this.item);
@override
Widget build(BuildContext context) {
return Card(
child: Container(
height: 200
width: double.infinity,child: Stack(
children: <Widget>[
Align(
alignment: Alignment.topRight,child: getPopUpMenuButton(context),)],);
}
PopupMenuButton<String> getPopUpMenuButton(BuildContext context) {
return PopupMenuButton(
onSelected: (str) {
switch (str) {
case 'MAKECOPY':
{
Item copy = Item.clone(item,sameUID: false);
Scaffold.of(context).setState(() {
itemManager.save(copy);
});
}
}
},icon: Icon(Icons.more_vert),itemBuilder: (_) => <PopupMenuItem<String>>[
new PopupMenuItem<String>(
value: 'MAKECOPY',child: Text(AppLocalizations.of(context).get('make_copy'))),],);
}
}
函数Scaffold.of(context).setState
调用ItemManager
将新对象保存到内存中。但是,该对象不会在listview
中更新。重新启动应用程序时,列表视图会正确显示它。如何正确调用setState
,以便重建_ItemListState
。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)