rrousselGit / riverpod

A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze.
https://riverpod.dev
MIT License
5.82k stars 888 forks source link

StateError (Bad state: Cannot use "ref" after the widget was disposed.) #3459

Open Rijankunwar3691 opened 1 month ago

Rijankunwar3691 commented 1 month ago

Describe the bug StateError (Bad state: Cannot use "ref" after the widget was disposed.)

To Reproduce When i Click the Pay Now button i am getting this issue. if i remove

 await ref
                          .read(orderDetailNotifierProvider.notifier)
                          .getOrderDetails(
                            outletIdentifier: outletDetails
                                    .firstOrNull?.identifier
                                    ?.toInt() ??
                                0,
                            type: selectedTable != null ? 1 : 2,
                            typeId: selectedTable?.tableId ??
                                selectedTakeAway?.takeAwayUid ??
                                takeAwayUuid,
                          );

I am not getting any error. <Please add a small sample to that can be executed to reproduce the problem. As a general rule, 100 lines is the maximum>

Expected behavior Get order details and navigate to payement page if it orderdetail is not empty.

####### code------

onPressed: () async {

                  // Fetch order details
                  await ref
                      .read(orderDetailNotifierProvider.notifier)
                      .getOrderDetails(
                        outletIdentifier: outletDetails
                                .firstOrNull?.identifier
                                ?.toInt() ??
                            0,
                        type: selectedTable != null ? 1 : 2,
                        typeId: selectedTable?.tableId ??
                            selectedTakeAway?.takeAwayUid ??
                            takeAwayUuid,
                      );

                  // Order items if selectedMenuItems is not empty
                  if (selectedMenuItems.isNotEmpty) {
                    await ref
                        .read(orderItemNotifierProvider.notifier)
                        .orderItem(
                          cover: widget.cover,
                          kotNumber: 0,
                        );
                  }

                  // Retrieve order details after fetching
                  final List<Orders> orderDetails = ref
                          .read(orderDetailNotifierProvider)
                          .data
                          .data
                          ?.orders ??
                      [];

                  // Check if selectedMenuItems is empty and orderDetails is not empty
                  if (selectedMenuItems.isEmpty &&
                      orderDetails.isNotEmpty) {
                    // Fetch additional data
                    ref
                        .read(selectedTableTakeAwayProvider.notifier)
                        .getNewTableOrTakeAway(
                          outletDetails: outletDetails.firstOrNull,
                          selectedTable: selectedTable,
                          selectedTakeAway: selectedTakeAway,
                        );
                    final newSelectedTable = ref
                        .read(selectedTableTakeAwayProvider)
                        .selectedTable;
                    final newSelectedTakeAway = ref
                        .read(selectedTableTakeAwayProvider)
                        .selectedTakeAway;

                    // Prepare bill
                    ref
                        .read(prepareBillNotifierProvider.notifier)
                        .prepareBill(
                          ouletIdentifer:
                              outletDetails.firstOrNull?.identifier ?? 0,
                          tableId: newSelectedTable?.tableId ?? 0,
                          roomId: 0,
                          takeAwayUid: newSelectedTable == null
                              ? newSelectedTakeAway?.takeAwayUid ??
                                  takeAwayUuid
                              : null,
                        );

                    // Get settlement data
                    ref
                        .read(settlementDataNotifierProvider.notifier)
                        .getSettlementData(
                          outletIdentifier:
                              outletDetails.firstOrNull?.identifier ?? 0,
                        );

                    // Navigate to the payment page
                    if (context.mounted) {
                      Navigator.pushNamed(context, AppRoutes.payementPage);
                    }
                  }
                },
rrousselGit commented 1 month ago

That's way too much code. Please make a minimal reproducible example.

Generally speaking, this error is expected and a mistake on your end. Chances are you used ref after an await without checking context.mounted