从 Riverpod 实施 StateNotifierProvider 的问题
Issue implementing StateNotifierProvider from Riverpod
我正在尝试使用 Riverpod 实现一个购物车系统来管理购物车的状态。
这是用户点击产品将其添加到购物车的部分:
GestureDetector(
child: Icon(Icons.shopping_cart),
onTap: () async {
print("cart test");
//create new cart item
Cart cartItem = new Cart(
id: product.id,
name: product.name,
oldPrice: product.oldPrice,
price: product.price,
imageUrl: product.imageUrl,
category: product.category,
quantity: 1
);
var cartInstance = context.read(cartListProvider);
if(isExistsInCart(cartInstance.state,cartItem))
context.read(cartListProvider).edit(cartItem,1);
else
{
context.read(cartListProvider).add(cartItem);//if already available in cart, just increase quantity
var string = json.encode(context.read(cartListProvider).state);
await storage.write(key: cartKey, value: string);
}
},
)
这里有提供商 class:
import 'package:cart_system_riverpod/models/cart.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final cartListProvider = StateNotifierProvider((ref){
return CartList([]); //init empty cart
});
我还将 ProviderScope 添加到 Widgets 树的顶部。
我的问题是我在执行时遇到错误:
cartInstance = context.read(cartListProvider)
和
context.read(cartListProvider).edit(cartItem,1);
总是在read(...)
部分
编辑器显示提示The method 'read' isn't defined for the type 'BuildContext'.
从 Riverpod 1.0.0 中删除了 context.read
,取而代之的是 ref.read
所以用ref.read
替换context.read
试试这个:
Consumer(
builder: (context, ref, _) {
return GestureDetector(
child: Icon(Icons.shopping_cart),
onTap: () async {
print("cart test");
//create new cart item
Cart cartItem = new Cart(
id: product.id,
name: product.name,
oldPrice: product.oldPrice,
price: product.price,
imageUrl: product.imageUrl,
category: product.category,
quantity: 1);
var cartInstance = ref.read(cartListProvider);
if (isExistsInCart(cartInstance.state, cartItem))
ref.read(cartListProvider).edit(cartItem, 1);
else {
ref.read(cartListProvider).add(
cartItem); //if already available in cart, just increase quantity
var string = json.encode(ref.read(cartListProvider).state);
await storage.write(key: cartKey, value: string);
}
},
);
},
);
查看 here 了解更多信息。
我正在尝试使用 Riverpod 实现一个购物车系统来管理购物车的状态。
这是用户点击产品将其添加到购物车的部分:
GestureDetector(
child: Icon(Icons.shopping_cart),
onTap: () async {
print("cart test");
//create new cart item
Cart cartItem = new Cart(
id: product.id,
name: product.name,
oldPrice: product.oldPrice,
price: product.price,
imageUrl: product.imageUrl,
category: product.category,
quantity: 1
);
var cartInstance = context.read(cartListProvider);
if(isExistsInCart(cartInstance.state,cartItem))
context.read(cartListProvider).edit(cartItem,1);
else
{
context.read(cartListProvider).add(cartItem);//if already available in cart, just increase quantity
var string = json.encode(context.read(cartListProvider).state);
await storage.write(key: cartKey, value: string);
}
},
)
这里有提供商 class:
import 'package:cart_system_riverpod/models/cart.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final cartListProvider = StateNotifierProvider((ref){
return CartList([]); //init empty cart
});
我还将 ProviderScope 添加到 Widgets 树的顶部。
我的问题是我在执行时遇到错误:
cartInstance = context.read(cartListProvider)
和
context.read(cartListProvider).edit(cartItem,1);
总是在read(...)
部分
编辑器显示提示The method 'read' isn't defined for the type 'BuildContext'.
从 Riverpod 1.0.0 中删除了 context.read
,取而代之的是 ref.read
所以用ref.read
context.read
试试这个:
Consumer(
builder: (context, ref, _) {
return GestureDetector(
child: Icon(Icons.shopping_cart),
onTap: () async {
print("cart test");
//create new cart item
Cart cartItem = new Cart(
id: product.id,
name: product.name,
oldPrice: product.oldPrice,
price: product.price,
imageUrl: product.imageUrl,
category: product.category,
quantity: 1);
var cartInstance = ref.read(cartListProvider);
if (isExistsInCart(cartInstance.state, cartItem))
ref.read(cartListProvider).edit(cartItem, 1);
else {
ref.read(cartListProvider).add(
cartItem); //if already available in cart, just increase quantity
var string = json.encode(ref.read(cartListProvider).state);
await storage.write(key: cartKey, value: string);
}
},
);
},
);
查看 here 了解更多信息。