Проблема с обратным вызовом

#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) Спасибо за помощь !