как удалить список элементов с помощью всплывающего меню — flutter

#list #flutter #popupmenu

#Список #flutter #popupmenu

Вопрос:

Как мне удалить список элементов, когда я нажимаю на кнопку всплывающего меню? однако мой список и всплывающее меню находятся в двух отдельных файлах. мне нужно знать, какой из них я удаляю в соответствии с тем, на какой элемент списка нажат.

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;
    }
  }
}
  

Таким образом, у каждого элемента в этом списке есть всплывающее меню с опцией удаления в этом меню. Когда нажата опция удаления, она должна удалить элемент, который ее вызвал.

Пример: при нажатии кнопки всплывающего меню удалить для пользователя 2, она должна удалить пользователя 2.

пример:

Ответ №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 , поскольку простое удаление значения фактически не обновит ваше представление новым списком.