Flutter Remove Dispose Delete Widget by User



我有一个GridView.builder。在里面我有文本按钮,用户可以添加他们选择的名称和颜色。

onLongPress:激活AllertDialog,要求用户删除按钮。但是,它既不使用回调(deleteCallback(也不使用提供程序进行删除。

此外,我没有收到任何错误:(

这是网格的代码

import 'package:flutter/material.dart';
import 'package:cards/widgets/mycard_tile.dart';
import 'package:provider/provider.dart';
import 'package:cards/Models/card_data.dart';
class CardsList extends StatelessWidget {
const CardsList({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer<MyCardData>(
builder: (context, cardData, child) {
return Padding(
padding: const EdgeInsets.all(10),
child: GridView.builder(
clipBehavior: Clip.none,
itemBuilder: (context, index) {
final card = cardData.cards[index];
return CardTile(
cardTitle: card.name,
pickerColor: card.cardColor,
deleteCallback: () {
**cardData.deleteCard(card);**
Navigator.pop(context);
},
);
},
itemCount: cardData.cardCount,
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 150,
childAspectRatio: 2.5 / 1,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
),
),
);
},
);
}
}

这是我存储核心按钮数据的代码

import 'dart:ui';
import 'package:cards/Screens/add_card.dart';
import 'package:flutter/foundation.dart';
import 'package:cards/Models/card.dart';
import 'dart:collection';
import 'package:flutter/material.dart';

class MyCardData extends ChangeNotifier {
final List<MyCard> _cards = [
MyCard(name: 'TAG', cardColor: Colors.red),
MyCard(name: 'Nachtdienst', cardColor: Colors.blue),
MyCard(name: 'Kurz', cardColor: Colors.orange),
MyCard(name: 'NG's', cardColor: Colors.grey),
MyCard(name: 'Urlaub', cardColor: Colors.green),
MyCard(name: 'Fortbildung', cardColor: Colors.pink),
MyCard(name: 'Lang minus', cardColor: Colors.red.shade800),
MyCard(name: 'reserve', cardColor: Colors.black),
];
UnmodifiableListView<MyCard> get cards {
return UnmodifiableListView(_cards);
}
int get cardCount {
return _cards.length;
}
get cardColor => pickerColor;
void addCard(String newMyCardTitle, Color newCardColor,) {
final card = MyCard(name: newMyCardTitle, cardColor: cardColor);
//pickerColor = newCardColor as Color; //redundant?
_cards.add(card);
notifyListeners();
}
**void deleteCard(MyCard card) {
_cards.remove(card);
notifyListeners();
}**
}

这是我存放设计和按钮的地方

请忽略TODO的

import 'package:cards/Models/card.dart';
import 'package:cards/Screens/add_card.dart';
import 'package:flutter/material.dart';
import 'package:flutter_colorpicker/flutter_colorpicker.dart';
import 'package:cards/Models/card_data.dart';
import 'package:provider/provider.dart';
class CardTile extends StatelessWidget {
late String cardTitle;
Color pickerColor;
final Function **deleteCallback;**
CardTile(
{required this.cardTitle,
required this.pickerColor,
required this.**deleteCallback**});
@override
Widget build(BuildContext context) {
return TextButton(
onLongPress: () => showDialog<String>(
context: context,
builder: (BuildContext context) => AlertDialog(
actionsAlignment: MainAxisAlignment.spaceEvenly,
title: Center(
child: Text(
cardTitle,
style: TextStyle(color: pickerColor),
),
),
content: const Text(
'Möchtest du die Karte wirklich löschen?',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 18,
),
),
actions: <Widget>[
TextButton(
style: ButtonStyle(
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
)),
elevation: MaterialStateProperty.all(10),
backgroundColor: MaterialStateProperty.all(Colors.white)),
onPressed: () {
**deleteCallback; // This does not work! >>>>>>>>>>>>>>>>>>>>>>>>> this is where I need help <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<**
},
child: const Text(
'Delete Card!',
style: TextStyle(color: Colors.black),
),
),
TextButton(
style: ButtonStyle(
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
)),
elevation: MaterialStateProperty.all(10),
),
onPressed: () => Navigator.pop(context),
child: const Text(
'Cancel!',
style:
TextStyle(color: Colors.black, fontWeight: FontWeight.bold),
),
),
],
),
),
onPressed:
() {}, //TODO: Activate Button > Button should give forward information > Button name and color of tile > to sfCalendar, also change the appearance of button when active
style: ButtonStyle(
shape: MaterialStateProperty.all(
RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))),
backgroundColor: MaterialStateProperty.all(pickerColor),
elevation: MaterialStateProperty.all(10)),
child: FittedBox(
fit: BoxFit.fitHeight,
child: Text(
cardTitle,
style: TextStyle(
fontSize: 17,
color: useWhiteForeground(pickerColor)
? const Color(0xffffffff)
: const Color(0xff000000),
),
),
),
);
}
}

你可以在我的git 上看到完整的代码

当您传递函数时,您也必须将其用作函数。也就是说,您需要在末尾添加()

onPressed: () {
// here you can add another thins you want to execute 
**deleteCallback();  // add this:  () 
},

但如果你只有一个功能,你可以使用没有()例如:

class CardTile extends StatelessWidget {
final VoidCallback deleteCallback;
CardTile({
required this.deleteCallback });
...
// and you can use it 
backgroundColor: MaterialStateProperty.all(Colors.white)),
onPressed : deleteCallback, // its directly assign, without use () {}
child: ....

最新更新