te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>android - How to show Snackbar only once - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

android - How to show Snackbar only once - Stack Overflow

programmeradmin2浏览0评论

I am Calling an api when item is added to cart and if its success the snackbar will show for success but what if user added one after one too many products then the all snackbars will show one by one for long time so i want when user stops then snackbar should show only once the last one the latest one with msg MyCart Api

 Timer? debounceSnackBarTimer;

    Future<void> addToCart(Package package) async {
      final prefs = await SharedPreferences.getInstance();
      final accessToken = prefs.getString('accessToken');
      final String apiUrl = await AppNetworkingUrls.addtoCart;

      if (accessToken == null) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(
              'Please log in to add items to the cart',
              style: GoogleFonts.poppins(),
            ),
          ),
        );
        return;
      }

      final url = Uri.parse(apiUrl);
      final headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer $accessToken',
      };

      final body = jsonEncode({
        'quantity': 1,
        'productId': product.id,
        'packageId': package.id,
      });

      debounceSnackBarTimer?.cancel();

      debounceSnackBarTimer = Timer(Duration(milliseconds: 800), () async {
        try {
          final response = await http.post(
            url,
            headers: headers,
            body: body,
          );

          if (response.statusCode == 200) {
            final responseData = jsonDecode(response.body);
            print(response.body);

            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                behavior: SnackBarBehavior.floating,
                backgroundColor: AppColors.buttonColor,
                duration: Duration(seconds: 2),
                content: Text(
                  responseData['message'] ?? 'Item added to cart',
                  style: GoogleFonts.poppins(fontWeight: FontWeight.w500),
                ),
              ),
            );

            final cartProvider = Provider.of<Cart>(context, listen: false);
            await cartProvider.fetchCartItems();
          } else {
            final responseData = jsonDecode(response.body);
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                behavior: SnackBarBehavior.floating,
                backgroundColor: Colors.red,
                duration: Duration(seconds: 2),
                content: Text(
                  responseData['message'] ?? 'Failed to add item',
                  style: GoogleFonts.poppins(fontWeight: FontWeight.w500),
                ),
              ),
            );
          }
        } catch (error) {
          print('Error adding to cart: $error');
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(
              behavior: SnackBarBehavior.floating,
              backgroundColor: Colors.red,
              duration: Duration(seconds: 2),
              content: Text(
                'Something went wrong. Please try again.',
                style: GoogleFonts.poppins(fontWeight: FontWeight.w500),
              ),
            ),
          );
        }
      });
    }

there is Diff products and every products have diff packages the user will add multiple products also but i want to show the latest once only

I have also tried the Debounce but its not working as i wanted please if anyone can help me in this debounce is working only if the user adds same products same package again and again then this works but i want it should work in all products and packages

I am Calling an api when item is added to cart and if its success the snackbar will show for success but what if user added one after one too many products then the all snackbars will show one by one for long time so i want when user stops then snackbar should show only once the last one the latest one with msg MyCart Api

 Timer? debounceSnackBarTimer;

    Future<void> addToCart(Package package) async {
      final prefs = await SharedPreferences.getInstance();
      final accessToken = prefs.getString('accessToken');
      final String apiUrl = await AppNetworkingUrls.addtoCart;

      if (accessToken == null) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(
              'Please log in to add items to the cart',
              style: GoogleFonts.poppins(),
            ),
          ),
        );
        return;
      }

      final url = Uri.parse(apiUrl);
      final headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer $accessToken',
      };

      final body = jsonEncode({
        'quantity': 1,
        'productId': product.id,
        'packageId': package.id,
      });

      debounceSnackBarTimer?.cancel();

      debounceSnackBarTimer = Timer(Duration(milliseconds: 800), () async {
        try {
          final response = await http.post(
            url,
            headers: headers,
            body: body,
          );

          if (response.statusCode == 200) {
            final responseData = jsonDecode(response.body);
            print(response.body);

            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                behavior: SnackBarBehavior.floating,
                backgroundColor: AppColors.buttonColor,
                duration: Duration(seconds: 2),
                content: Text(
                  responseData['message'] ?? 'Item added to cart',
                  style: GoogleFonts.poppins(fontWeight: FontWeight.w500),
                ),
              ),
            );

            final cartProvider = Provider.of<Cart>(context, listen: false);
            await cartProvider.fetchCartItems();
          } else {
            final responseData = jsonDecode(response.body);
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(
                behavior: SnackBarBehavior.floating,
                backgroundColor: Colors.red,
                duration: Duration(seconds: 2),
                content: Text(
                  responseData['message'] ?? 'Failed to add item',
                  style: GoogleFonts.poppins(fontWeight: FontWeight.w500),
                ),
              ),
            );
          }
        } catch (error) {
          print('Error adding to cart: $error');
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(
              behavior: SnackBarBehavior.floating,
              backgroundColor: Colors.red,
              duration: Duration(seconds: 2),
              content: Text(
                'Something went wrong. Please try again.',
                style: GoogleFonts.poppins(fontWeight: FontWeight.w500),
              ),
            ),
          );
        }
      });
    }

there is Diff products and every products have diff packages the user will add multiple products also but i want to show the latest once only

I have also tried the Debounce but its not working as i wanted please if anyone can help me in this debounce is working only if the user adds same products same package again and again then this works but i want it should work in all products and packages

Share Improve this question asked 2 days ago Tanu PurohitTanu Purohit 1 1
  • You can use debouncer.Have a look at this article to get better idea about it. – Safal Shrestha Commented 2 days ago
Add a comment  | 

2 Answers 2

Reset to default 2

Call your API immediately and save the latest message, then use a debounce timer to display the Snackbar only once.

Timer? debounceSnackBarTimer;
String? latestMessage;
bool? latestApiCallSuccess;

Future<void> addToCart(Package package) async {
  final prefs = await SharedPreferences.getInstance();
  final accessToken = prefs.getString('accessToken');
  final String apiUrl = await AppNetworkingUrls.addtoCart;

  if (accessToken == null) {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(
          'Please log in to add items to the cart',
          style: GoogleFonts.poppins(),
        ),
      ),
    );
    return;
  }

  final url = Uri.parse(apiUrl);
  final headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer $accessToken',
  };

  final body = jsonEncode({
    'quantity': 1,
    'productId': product.id,
    'packageId': package.id,
  });

  try {
    final response = await http.post(url, headers: headers, body: body);

    if (response.statusCode == 200) {
      final responseData = jsonDecode(response.body);
      latestMessage =
          responseData['message'] ?? 'Item added to cart';
      latestApiCallSuccess = true;

      final cartProvider = Provider.of<Cart>(context, listen: false);
      await cartProvider.fetchCartItems();
    } else {
      final responseData = jsonDecode(response.body);
      latestMessage =
          responseData['message'] ?? 'Failed to add item';
      latestApiCallSuccess = false;
    }
  } catch (error) {
    latestMessage =
        'Something went wrong. Please try again.';
    latestApiCallSuccess = false;
  }

  // Debounce the display of the snackbar:
  debounceSnackBarTimer?.cancel();
  debounceSnackBarTimer = Timer(Duration(milliseconds: 800), () {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        behavior: SnackBarBehavior.floating,
        backgroundColor: latestApiCallSuccess == true
            ? AppColors.buttonColor
            : Colors.red,
        duration: Duration(seconds: 2),
        content: Text(
          latestMessage ?? '',
          style: GoogleFonts.poppins(fontWeight: FontWeight.w500),
        ),
      ),
    );
  });
}

You are almost correct by using Timer for a debouncer, the issue is occurring because the debounceSnackBarTimer is reset every time a product is added.

You can try by giving delay of 800ms which will help you to pause for few millisecond before adding the new item so the snackbar will display once when the item is added, also set the value of latestSnackBarMessage as null. Try this if it helps.

Timer? debounceSnackBarTimer;
String? latestSnackBarMessage;

Future<void> addToCart(Package package) async {
  final prefs = await SharedPreferences.getInstance();
  final accessToken = prefs.getString('accessToken');
  final String apiUrl = await AppNetworkingUrls.addtoCart;

  if (accessToken == null) {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(
          'Please log in to add items to the cart',
          style: GoogleFonts.poppins(),
        ),
      ),
    );
    return;
  }

  final url = Uri.parse(apiUrl);
  final headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer $accessToken',
  };

  final body = jsonEncode({
    'quantity': 1,
    'productId': product.id,
    'packageId': package.id,
  });

  try {
    final response = await http.post(
      url,
      headers: headers,
      body: body,
    );

    if (response.statusCode == 200) {
      final responseData = jsonDecode(response.body);
      latestSnackBarMessage = responseData['message'] ?? 'Item added to cart';

      final cartProvider = Provider.of<Cart>(context, listen: false);
      await cartProvider.fetchCartItems();
    } else {
      final responseData = jsonDecode(response.body);
      latestSnackBarMessage = responseData['message'] ?? 'Failed to add item';
    }
  } catch (error) {
    print('Error adding to cart: $error');
    latestSnackBarMessage = 'Something went wrong. Please try again.';
  }

  debounceSnackBarTimer?.cancel();
  debounceSnackBarTimer = Timer(Duration(milliseconds: 800), () {
    if (latestSnackBarMessage != null) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          behavior: SnackBarBehavior.floating,
          backgroundColor: AppColors.buttonColor,
          duration: Duration(seconds: 2),
          content: Text(
            latestSnackBarMessage!,
            style: GoogleFonts.poppins(fontWeight: FontWeight.w500),
          ),
        ),
      );
      latestSnackBarMessage = null;
    }
  });
}
发布评论

评论列表(0)

  1. 暂无评论