Flutter:从listItem中“刷新”脚手架listview

问题描述

我有一个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 (将#修改为@)