如何使用弹出菜单删除项目列表 - 颤振

Posted

技术标签:

【中文标题】如何使用弹出菜单删除项目列表 - 颤振【英文标题】:how to delete item list using pop up menu - flutter 【发布时间】:2019-07-26 14:45:16 【问题描述】:

当我单击弹出菜单按钮时如何删除项目列表?但是,我的列表和弹出菜单位于两个单独的文件中。我需要根据按下的列表项知道我删除的是哪一个。

pop_up_menu.dart:

import 'package:flutter/material.dart';

class PopUpMenu extends StatelessWidget 
  void showMenuSelection(String value) 
    print("pressed");
  

  @override
  Widget build(BuildContext context) 
    return PopupMenuButton<String>(
      padding: EdgeInsets.zero,
      icon: Icon(Icons.more_vert),
      onSelected: showMenuSelection,
      itemBuilder: (BuildContext context) => <PopupMenuEntry<String>>[
            const PopupMenuItem<String>(
                value: 'Create another',
                child: ListTile(
                    leading: Icon(Icons.add), title: Text('Create another'))),
            const PopupMenuItem<String>(
                value: 'Delete',
                child: ListTile(
                    leading: Icon(Icons.delete), title: Text('Delete')))
          ],
    );
  

所以在list_tile.dart中导入了这个弹出菜单,每当我点击弹出菜单按钮“删除”时,我需要删除按下弹出菜单的选定列表项

List_tile.dart:

import 'package:flutter/material.dart';
import '../pop_up_menu/pop_up_menu.dart';

var levelsData = [];

class ListTile extends StatefulWidget 
  @override
  ListTileState createState() => new ListTileState();


class ListTileState extends State<ListTile> 
  @override
  Widget build(BuildContext context) 
    return ListView.builder(
      itemBuilder: (BuildContext context, int index) => Card(
            child: SingleChildScrollView(
              child: StuffInTiles(
                levelsData[index]['user_id'],
                levelsData[index]['price'],
              ),
            ),
          ),
      itemCount: levelsData.length,
    );
  


class StuffInTiles extends StatelessWidget 
  final String userId;
  final double price;

  StuffInTiles(this.userId, this.price);

  @override
  Widget build(BuildContext context) 
    List<dynamic> _getChildren() 
      List<Widget> children = [];
      levelsData.forEach(
        (element) 
          if (price.toString() == element['price'].toString()) 
            children.add(ListTile(
                title: Text("@" + element['price'].toString(),
                    style: TextStyle(color: Colors.lightGreen)),
                subtitle: Text(
                    "Created on 01 Jun 2018 at 06:24AM \n when price was " +
                        element['price'].toString()),
                trailing: PopUpMenu()));
          
        ,
      );
      return children;
    
  

因此,此列表中的每个项目都有一个弹出菜单,该菜单中带有删除选项。当按下删除选项时,它必须删除触发它的项目。

示例:当按下 user2 的弹出菜单按钮删除时,它应该删除 user2。

【问题讨论】:

【参考方案1】:

为您的PopUpMenu 类添加回调函数:

class PopUpMenu extends StatelessWidget 
  VoidCallback onDelete;

  PopUpMenu(this.onDelete);

  void showMenuSelection(String value) 
    switch (value) 
      case 'Delete':
        onDelete();
        break;
      // Other cases for other menu options
    
  

然后在你原来的类中创建它时:

         ...
                trailing: PopUpMenu(
                  onDelete: () 
                    levelsData.removeWhere((element) => element == element);
                  
                )));
          

Flutter 中的一般经验法则是将回调向下传递给子级,而不是尝试访问父级中的数据。

您可能还需要使您的StuffInTiles 小部件有状态并将setState(() ); 添加到您的onDelete,因为简单地删除该值实际上不会使用新列表更新您的视图。

【讨论】:

以上是关于如何使用弹出菜单删除项目列表 - 颤振的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中制作带有弹出菜单的浮动操作按钮?

如何彻底卸载android studio

如何删除 Eclipse RCP 中的弹出菜单贡献

Android 仿微信长按列表弹出PopupMenu菜单栏

Android Item长按弹出删除,点击删除执行删除对应的文件

Actionscript 3 - 如何删除菜单栏、滚动条以仅显示空白弹出窗口?