You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用Parse SDK保存Pointer触发栈溢出错误的求助

Flutter Parse SDK保存Pointer类型数据时的栈溢出问题解决

问题描述

在Flutter项目中使用Parse SDK向Cart表保存Pointer类型数据时,调试控制台抛出RangeError: Maximum call stack size exceeded错误(由无限递归引发)。具体场景:

  • Cart表的productID字段已配置为Pointer类型,指向Products类
  • 尝试保存Pointer时触发栈溢出;直接传入widget.productID会提示Pointer数据类型错误
  • 将productID改为字符串类型并传入字符串值时,代码可正常运行并保存数据

相关代码

UI组件代码

Row(
  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  children: [
    FutureBuilder(
        future: ParseUser.currentUser(),
        builder: ((context, snapshot) {
          if (snapshot.hasData) {
            return ElevatedButton(
              onPressed: () => addToCart(),
              style: ElevatedButton.styleFrom(
                  primary: const Color.fromARGB(255, 255, 203, 59),
                  onPrimary: Colors.black),
              child: const Text("Add to Cart"),
            );
          } else {
            return ElevatedButton(
              onPressed: () {
                Navigator.pushNamed(context, '/LogIn');
              },
              style: ElevatedButton.styleFrom(
                  primary: const Color.fromARGB(255, 255, 203, 59),
                  onPrimary: Colors.black),
              child: const Text("Add to Cart"),
            );
          }
        })),
    ElevatedButton(
      onPressed: () {
        Navigator.pushNamed(context, '/products/',
            arguments: widget.productId);
      },
      style: ElevatedButton.styleFrom(
          primary: const Color.fromARGB(255, 255, 203, 59),
          onPrimary: Colors.black),
      child: const Text("Product Details"),
    ),
  ],
)

addToCart函数(原错误代码)

Future<void> addToCart() async {
  ParseUser currentUser = await ParseUser.currentUser() as ParseUser;
  final addToCart = ParseObject('Cart')
    ..set(
        'productID',
        (ParseObject('Products')
          ..objectId = ParseObject("Products").objectId))
    ..set('userID', currentUser.objectId)
    ..set('quantity', qtyDropdownValue)
    ..set('subtotal',
        widget.productPrice.toDouble() * qtyDropdownValue.toDouble())
    ..set('productSize', sizeDropdownValue);
  await addToCart.save();
}

问题原因与解决方案

1. 栈溢出错误原因

原代码中ParseObject("Products").objectId创建了一个空的Products对象,其objectId为null,这种写法触发了Parse SDK内部的递归引用检查,最终导致栈溢出。

2. 正确保存Pointer的写法

要创建指向Products类的Pointer,需使用当前商品的有效objectId初始化ParseObject,而非空对象。修改后的addToCart函数如下:

Future<void> addToCart() async {
  ParseUser currentUser = await ParseUser.currentUser() as ParseUser;
  // 用当前商品的真实objectId创建Pointer对象
  final productPointer = ParseObject('Products')..objectId = widget.productId;
  
  final addToCart = ParseObject('Cart')
    ..set('productID', productPointer)
    // 若userID是Pointer类型,直接传入currentUser对象而非objectId
    ..set('userID', currentUser)
    ..set('quantity', qtyDropdownValue)
    ..set('subtotal', widget.productPrice.toDouble() * qtyDropdownValue.toDouble())
    ..set('productSize', sizeDropdownValue);
  
  await addToCart.save();
}

3. 额外注意事项

  • 确保widget.productId是当前商品的有效objectId(字符串类型),而非其他格式数据
  • 如果Cart表的userID字段为Pointer类型(指向_User类),直接传入currentUser对象即可,Parse会自动处理为Pointer;若为字符串类型则传入currentUser.objectId

内容的提问来源于stack exchange,提问作者lbrassfield

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:45:41