#flutter #dart #callback
Вопрос:
Я хотел бы создать общий диалог, но у меня возникли некоторые проблемы с обратным вызовом… Вот мой код:
Диалог :
class ConfirmDialog {
static Future show<T>(BuildContext context, String message,
void Function(T) onConfirm, VoidCallback? onRefuse) {
return showDialog(
context: context,
builder: (context) {
return Container(
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.grey[300],
),
child: Container(
padding: EdgeInsets.fromLTRB(0, 20, 0, 0),
width: 400,
height: 200,
child: Card(
child: Column(
children: [
Text(
message,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 30),
),
Container(
margin: EdgeInsets.fromLTRB(0, 20, 0, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
GestureDetector(
child: Container(
height: 70,
padding: EdgeInsets.fromLTRB(0, 0, 20, 0),
child: Image.asset("assets/images/confirm.png"),
),
onTap: () => {
onConfirm,
print("accept"),
Navigator.pop(context),
}),
GestureDetector(
child: Container(
height: 70,
padding: EdgeInsets.fromLTRB(20, 0, 0, 0),
child: Image.asset("assets/images/cancel.png"),
),
onTap: () => {
if (onRefuse != null)
{
onRefuse,
}
else
{
Navigator.pop(context),
}
print("refuse")
},
),
],
),
),
],
),
),
),
);
},
);
}
Виджет :
Widget listView(List<Product> products) {
return ListView.builder(
itemCount: products.length,
itemBuilder: (context, index) {
Product product = products[index];
return GestureDetector(
child: Container(
height: 150,
child: Card(
child: Row(
children: [
Container(
alignment: Alignment.center,
padding: EdgeInsets.fromLTRB(5, 10, 5, 10),
width: 150,
height: 150,
child: Image.network(product.small),
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
product.name,
overflow: TextOverflow.ellipsis,
maxLines: 1,
softWrap: false,
style: TextStyle(
fontSize: 30,
),
),
Text(
product.getBrand(),
style: TextStyle(
color: Colors.grey,
fontSize: 25,
fontFamily: "Antonio",
),
)
],
),
)
],
),
),
),
onTap: () => {},
onLongPress: () => {
ConfirmDialog.show<Product>(
context,
"Are you sure you want to deleten${product.name} ?",
deleteSelectedProduct(product),
null,
)
},
);
},
);
}
Каждый раз, когда я «долго нажимаю», я получаю это сообщение об ошибке :
При обработке жеста была вызвана следующая ошибка _TypeError: тип «Null» не является подтипом типа «(Продукт) => динамический»
Продукт, который я передаю в качестве параметра, не равен нулю, и диалоговое окно не отображается, но запускается метод «deleteSelectedProduct».
Я не могу понять, где я ошибся? Если кто-то может помочь, это было бы здорово!
Заранее спасибо
Комментарии:
1. На какой строке происходит ошибка?
2. Этот : удаленныйпродукт(продукт)
3. Вы назначили
deleteSelectedProduct
поле функции обратного вызова?4. Я не уверен, что понял ваш вопрос, но есть определение моего метода :
deleteSelectedProduct(Product product)
Ответ №1:
Функция вызывается до ее передачи, поэтому она вернет значение null и передаст это значение. Вам нужно было бы использовать deleteSelectedProduct
вместо deleteSelectedProduct(product)
Комментарии:
1. О, ладно, в этом есть смысл… Но как я должен указать, какой продукт я хочу удалить? Должен ли я передать его в качестве параметра?
2. Так что, как сказал @sirwilliam15, я должен использовать
deleteSelectedProduct
без параметра. Я изменяю определение своего метода на :static Future show<T>(BuildContext context, String message, void Function(T) onConfirm, T? obj, VoidCallback? onRefuse)
Спасибо за помощь !