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
相关产品推荐
相关产品推荐

