如何强行关闭GetX Snackbar?

How to forcefully close GetX Snackbar?

我正在使用 Get.snackbar() 来显示连接到 API 的过程。 我不明白如何以编程方式关闭小吃店? 我有以下代码:

@override
  Future<List> getImportantData(String inputData) async {
    try {
      final token =  basicApiAuthString;
      print("requesting API with the following request: $inputData");
      Get.snackbar(
          "Requesting very important data...",
          "",
          duration: 60.seconds, // it could be any reasonable time, but I set it lo-o-ong
          snackPosition: SnackPosition.BOTTOM,
          showProgressIndicator: true,
          isDismissible: true,
          backgroundColor: Colors.lightGreen,
          colorText: Colors.white,
        );
      List importantData = await _client.requestAPI(basicAuthString: token, body: inputData);
          .then((importantData) {
              // Here I need to dismiss the snackbar I am still showing to user
              print("I want to close snackbar here but I don't know how to do that!");
              // Then I return data for future processing... 
              return importantData;
                });

      return importantData;
    } on DioError catch (error) {
      // Here I handle all possible API errors... Also I want to close snackbar here as well.
  
    }
 } // getImportantData() function.

我需要考虑以下因素:

  1. 应用程序可能会在请求期间关闭并再次打开(因此小吃店可能会关闭,但我可以通过状态回调(未显示)知道它
  2. 用户在请求期间可能会关闭快餐栏
  3. 请求可能会在几毫秒内完成
  4. 可能存在 API 个错误,.then() 部分永远不会执行。

所以,我需要一些外部方式来关闭小吃。 Navigator.of(context).hide... 不是我使用 GetX 的解决方案。

—————— PS:这里是snackbar的定义,不能帮我搞清楚:

https://pub.dev/documentation/get/3.4.2/route_manager/GetNavigation/snackbar.html

使用此方法立即关闭当前Snackbar

ScaffoldMessenger.of(context).removeCurrentSnackBar();
Use Get.back() to close the snack bar.

如果你想让用户关闭小吃店,你可以在 mainButton 或 onTap

中使用 Get.back
   Get.snackbar(
      "Requesting very important data...",
      "",
      duration: 60.seconds, // it could be any reasonable time, but I set it lo-o-ong
      snackPosition: SnackPosition.BOTTOM,
      showProgressIndicator: true,
      isDismissible: true,
      backgroundColor: Colors.lightGreen,
      colorText: Colors.white,
      mainButton: TextButton(
            onPressed: Get.back,
            child: const Text(
              "Close"
      )));
   );

如果关闭时出现 debugLocked 问题,请使用 SchedulerBinding

 SchedulerBinding.instance!.addPostFrameCallback((_) {
      // Your Get Snackbar
 }):

GetX 已经有一个名为 closeAllSnackbars()closeCurrentSnackbar() 的方法。

所以使用closeAllSnackbars()关闭所有打开的Snackbars。

Get.closeAllSnackbars();

要关闭当前活动的 snakbar,只需调用 closeCurrentSnackbar()

Get.closeCurrentSnackbar();

您还可以通过调用 isSnackbarOpen() 来检查小吃店是否 open/active。

Get.isSnackbarOpen();