如何强制关闭 GetX Snackbar?

Posted

技术标签:

【中文标题】如何强制关闭 GetX Snackbar?【英文标题】:How to forcefully close GetX Snackbar? 【发布时间】:2021-12-08 17:15:39 【问题描述】:

我使用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.

我需要考虑以下几点:

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

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

———— PS:这里是snackbar的定义,没有帮助我澄清:

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

【问题讨论】:

【参考方案1】:
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
 ):

【讨论】:

也可以试试Get.back(closeOverlays: true);【参考方案2】:

使用该方法立即关闭当前的Snackbar

ScaffoldMessenger.of(context).removeCurrentSnackBar();

【讨论】:

嗯...尝试了以下方法无济于事:final X = Get.context;ScaffoldMessenger.of(X!).removeCurrentSnackBar(); 看起来在 GetX 环境中应该使用另一种方法。 你必须传递构建上下文而不是“Get.context”【参考方案3】:

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

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

Get.closeAllSnackbars();

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

Get.closeCurrentSnackbar();

您还可以通过致电isSnackbarOpen() 来查看小吃店是否打开/活动的天气。

Get.isSnackbarOpen();

【讨论】:

以上是关于如何强制关闭 GetX Snackbar?的主要内容,如果未能解决你的问题,请参考以下文章

如何在关闭屏幕时关闭打开的 SnackBar?

当用户执行任何操作时如何关闭 Snackbar?

当用户在其他地方交互时如何关闭 Snackbar?

Flutter:导航离开时如何关闭 SnackBar?

Snackbar 在片段类中不起作用

防止 Snackbar 在操作单击时关闭