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